Write a script that outputs A
to stdout infinitely.
There shold be no newlines or seperators between the characters
Standard loopholes apply
This is code-golf. The shortest solution in each language wins.
Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It only takes a minute to sign up.
Sign up to join this communityWrite a script that outputs A
to stdout infinitely.
There shold be no newlines or seperators between the characters
Standard loopholes apply
This is code-golf. The shortest solution in each language wins.
00000000: b041 cd29 ebfc .A.)..
Unassembled listing:
B0 41 MOV AL, 'A' ; put 'A' into AL
PRINT:
CD 29 INT 29H ; DOS fast console output char in AL
EB FC JMP PRINT ; loop infinitely
As a bonus, if you run this on your IBM 5151 monitor for a few hours this will actually produce infinite output on that screen until the end of time.
SCREAM > OUT.TXT
.
\$\endgroup\$
– Ruslan
Mar 4 '20 at 9:53
0 * A r 0
One of the very few times that Turing Machine Code can compete overall.
Saved 2 3 bytes thanks to Mitchell Spector!!!
yes|tr \\ny A
Also for 13 bytes (written by Mitchell Spector):
printf A;./$0
printf A;./$0
-- this avoids both the filename and PATH issues, but is 3 bytes longer.
\$\endgroup\$
– Mitchell Spector
Feb 29 '20 at 17:36
A
s, not one of A\n
s that yes A
will generate. They're actually \nA
s which is what this post uses.
\$\endgroup\$
– Noodle9
Mar 2 '20 at 12:38
print('A')
includes the newline
\$\endgroup\$
– PenumbraBrah
Mar 2 '20 at 1:45
L1: A9 C1 LDA #'A'
20 ED FD JSR COUT
50 F9 BVC L1
qqiA^[@qq@q
Added 3 bytes to fx a bug kindly pointed out by David.
If you fire up vim
(with no command line options) and type in these key strokes (^[
is the esc key) then the screen will fill up with A
's.
Explanation:
qqiA^[@qq@q
qq Start recording macro-q
i Enter insert mode
A Insert A
^[ Exit insert mode
@q Call macro-q from within macro-q
q Stop recording macro-q
@q Call macro-q
kill
that session of vim
to stop it!You can try to stopping the macro with ctrl-c, if that works you can exit with :q!<Enter>
.
kill
it from another terminal on Linux. Windows you can use the task manager.
\$\endgroup\$
– Noodle9
Feb 29 '20 at 1:11
^c
and type :q!
. I knew there was some way to do it.
\$\endgroup\$
– S.S. Anne
Feb 29 '20 at 1:13
'A'o
The instruction pointer begins at left, and its initial direction is to the right.
'
starts string parsing mode. Everything until the next '
will be interpreted as individual characters, that will get pushed onto the stack. So A
pushes that character, and then the second '
ends string parsing mode.
o
pops the character from the stack and outputs it to STDOUT.
The instruction pointer has now reached the end of the code, so it wraps around to the initial position and keeps moving to the right, causing an infinite loop.
@'A
@
is an odd operator.
@1 => 1.0
)@az => 'a, 'z
)@'a => "aaaaaaaaaa...."
)@1.0 => @, 1.0
).@ # A symbol which does odd things. For a char, it repeats infinitely.
'A # Literal A
A(){A(putchar(65));}
-4 bytes thanks to ceilingcat!
How could I have forgotten recursion...
A.;
A .
; . .
. .
A
sets the value of the current memory edge to A (ASCII 65).
.
is a no-op that places the next command on a new row.
;
prints the value of the current memory edge to stdout
.
The no-op is required because the instruction pointer never returns to the top row after executing A
.
It only loops over the second and third rows.
.A;
also works.
\$\endgroup\$
– user92069
Mar 2 '20 at 5:34
^
/ \
/do \
^-----^
/1\ / \
--- /out\
^-----
/ \
/chr\
^-----
/ \
/65 \
-----
98 bytes thanks to @Jo King and height-0 pyramids. Also, chr 65
is truthy.
^
/ \
/do \
^-----^
-^ / \
-^ /out\
-^-----
/ \
/chr\
^-----
-^
-^
/ \
/65 \
-----
b'a;$9"~}HG{iyxwuu?O=pL:]mHj5!3DCezRQ=+^:('&Y$#m!1So.QOO=v('98$65a!}^{@hyf<WV9sr%4#I20FEJVBfw)btOr@#!7~|4{y1xv.us+rp(om%lj"ig}fd"cx``uz]rwvYnslkTonPfOjiKgJeG]\EC_X]@[Z<R;VU7S6QP2N1LK-I,GF(D'BA#?>7~;:9y16w43s10)p-,l*#(i&%e#d!~``{tyxZpuXsrTTongOkdMhg`Hd]ba`_^W@[ZYXW9UNSRQPOHMLKJ-++FE''<A$?>=<;:387xw43s10/(-&m*)('&}${d!~}|^zyxwvutmVqpiRQlkjiKafedc\E`_^@\[ZYX;V9NMRQ42NGLK.IH*F?DCBA$#>7~;{{8xx5uu2rr/oo,ll)ii&f|e"!aw`{z\r[vXnmVTpongPkNihgJ_dcFa`B^]\UZ=RWV8TSLQ4ON0LE.IHA)E>'BA:?!7~5|38y6/v321q).-&m*)i'&%|{d!~}_{zs\wvutsUqTonPlOjiKgJedFbE`_A]@[Z<X;VU7S6QP22GL/JIB+FEDC%;@?>7~;:987w5v32r0)p-,+k)('~g$#"b~w|uz]xwvutsrqTinQlOjLhgfeH]bE`CB]\>ZSXWVUTSRQPON1LE.I,+*((&&$$""~~||zzxxv4u210/(-n+l)(i&g$ddy~}`u^]\ZZotsrTjShQOOMMKgfeG]F[DB^]?[T=R;9UTS5K4I200..,,*F)DC&A:#>=~;|9yyx/vutrrp.-,l$k"i~ge#"!aw`u^\\ZZXXVrqpRhQfOMMKKIeHcbECC^W\?>=;W:UT7R5PIN1L/.,,*FED&<%:#!!}}{987w/v-trrppnnllj(i&%ee"!xa|_^\x[vutWrqjSnQPNNLLJJHHFFDDB^A\[==XWVOT7R542N1LKJ-HGF?D'B%$""~<;:z2y0wu321q)p'nl*)(h~g|eccaa__]][[YuXsrTTonmleNiLgfeG]F[`C^]\?ZYXWP9T76442NML.D-B+)EDC%;$9"~<;:z2y0wuussqqoommk)j'&ff#"!~}v{^y\wvXtmVkpSnmlOjihgf_dGbEDBB@\?==R;PUTS5K4I200..,,**(DCB$:#8!}}{{yyw5v321r/.-,+*#j'h%$#cybw`^^s\ZvuWslUjSQQOOMMKgJedc\E`_B]@[==<QV9T76KPON0F/D-++))'CBA#9"7~||z87w5.u,sqqoommkki'h%$#d!xa`{^\\qZotsUqjShmPkjMhKfe^cFEDYB@@>>S<:VU7SL5J311//--++))'C&A@#>!<;49z76w4u2rr).-n%lkjhhffddb~}|^t]rwZXXmrUpoRmfONihgI_H]FD`_^@V?T=;;9977553311/K.IH+))>C&%@?>~6}49z76w4u,1rq.o,+l)j'~g$#d!b}__^yr[ZuXsrUSSnmfkjiLKfedFbaDY^A\[>Y<WVOTSRQ43H1FKJI+A*?(&BA@"8!6}{987w/v-trrppn,mkk"'&%e{dyb``^^\\ZZXXW22}Rn-O>Nvu(IeH6F[`~1A@hZSRuc9rrqK4\lMkK-CHAS(ubBN:L!J6}kXW1wfv3Prr`;o,%IH(4~}|d/@Q>v{;(\wZ$W4V1}/R-PxjvuKf_$G#nZ}B|z>-xwQc88qR^nO1GL|JVyGeEca&$$?8[6|GjWxg/AR2POq(o,JH6j4&C$0@@-a`^:y[q6H54rq0BR--N*chJ&_%cF!CY}Ai.-wwWV(s6%4o\lZkKDz,fdRQ
This was built with Prof. Masahiko Sakai's LAL toolchain from the following source code.
PROGRAM_START_TO ENTRY@Argh
ROUTINE Argh {
ENTRY:
ROT A
A: 0000021020t
JMP REV_JMP
REV_JMP:REV JMP
OUTPUT
DUP
JMP REV_JMP
}
'"""""'"""'"'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'"""
Explanation (A
has codepoint 65):
'"""""'""" while(1≠0)
'" print unicode character number
'"" (×64) 1+1+1+… (64 times)
'""" 1
Disassembled listing (objdump -D -bbinary -mi8086 scream.com
):
0: b4 02 mov $0x2,%ah
2: b2 41 mov $0x41,%dl
4: cd 21 int $0x21
6: eb f8 jmp 0x0
Output (DOSBox 0.74, and a lot faster than it looks):
Here's my ldscript and command-line options for anyone interested:
OUTPUT_ARCH(i8086)
SECTIONS {
. = 0;
}
ENTRY(_start)
OUTPUT_FORMAT(binary)
commands:
as --32 scream.s -o scream.o
ld scream.o -Tldscript.lds -o scream.com
dosbox ./scream.com
and unmolested scream.s
file:
_start:
mov $0x02, %ah
mov $0x41, %dl
int $0x21
jmp _start
A niladic link:
”AȮß
Try it online!, or check how it works below. If the "A" could be program input, we could get away with only two bytes: Ȯß
”A The character literal "A"
Ȯ Print it and return it,
ß and recursively call this same link.
1 << 30
.
\$\endgroup\$
– user92069
Mar 3 '20 at 10:56
It's a .png 13x2 codels, a few are technically not used (4 white unused, 1 white as transition and 1 black to change direction). But since I don't know how to compress it further, I still count them.
Original file (codel size 1):
With codel size 10:
For some reason, the codel size 10 looks disproportional. Maybe it's an issue with the IDE
Pseudo code (incl. stack):
push 2 | Stack: 2
push 4 | Stack: 2, 4
push 2 | Stack: 2, 4, 2
push 4 | Stack: 2, 4, 2, 4
* | Stack: 2, 4, 8
* | Stack: 2, 32
* | Stack: 64
push 1 | Stack: 64, 1
+ | Stack: 65
dup | Stack: 65, 65
out(char) | Stack: 65 | Output: A
dup and out(char) are repeated indefinitely.
This is my first submission here and my first "real" program in Piet. I'm sure it still has some room for improvement, but I just wanted to share (what I think of as) a lovely language :D
Edit: Compressed down from 15x2 to 13x2.
goto
! Fun fact: solutions with while
and recursion both use 25 bytes.
\$\endgroup\$
– val says Reinstate Monica
Mar 4 '20 at 10:57
65
".
Simple square loop. Push the number 65, pop and print as charcode, and loop through a no-op.
<>.56
I think I found a way to loop through single line of program! (Except that the commands are necessarily backwards, and each of <>
pops one value from the stack and uses it as an offset, so the loop should begin with <_>_
instead if the stack is non-empty at the boundary.)
<>.56 At start, IP runs "<" which cyclically shifts the row along with the IP
>.56< Now IP is at the end of the strip, which forces it to run backwards
6 Run commands in this order, printing an 'A'
5
.
> Cyclically shift the row to the right
<>.56 Continue running to the left, now stepping on "<" again
which causes IP to wrap through the edge and run in a loop
19
`
.
Uses -191 % 256 == 65
. Runs back and forth along the linear path .`19
, starting at 1 facing right.
~9
.1
Another -191.
_65.
? Or *65.
to avoid memory filling up
\$\endgroup\$
– Jo King♦
Sep 30 '20 at 7:31
⍞←⍣≠'A'
-2 bytes from Bubbler.
-2 bytes from Adàm using forbidden hacky APL magic.
Older answer:
{⍞←'A'⋄∇⍵}0
{⍞←'A'⋄∇⍵}0
⋄ separator (arguments will be evaluated left to right)
⍞←'A' Print 'A' without newline
∇⍵ Call function again with the same right argument
{ }0 Call first time with 0(any number works)
⍞←⍣≠'A'
seems to work. Try it online!
\$\endgroup\$
– Adám
Nov 10 '20 at 17:43
while fprintf('A')end
fprintf('A')
prints 'A'
to STDOUT and returns the number of printed characters, that is, 1
. This number is used as condition for the while
...end
loop, which thus becomes infinite.
sed
. I had to use the-z
flag just to even remove one. \$\endgroup\$ – S.S. Anne Feb 29 '20 at 15:36