Oczywiście, gra w golfa polega na jak najlepszym wykorzystaniu najmniejszego kodu. Kogo naprawdę obchodzi, jaka jest rzeczywista wydajność?
Chociaż mieliśmy wyzwanie dla najwyższego wejścia-wyjścia do- stosunek , jest to wezwanie do większości skończone i deterministyczne wyjście z danej długości kodu. Jak na ironię wyzwanie to nie jest więc golfem kodowym .
Zasady:
Napisz trzy niezależne fragmenty (niepełne programy / funkcje).
Fragmenty muszą być w tym samym języku.
Wynik jest całkowitą liczbą bajtów wyjściowych.
Dane wyjściowe mogą mieć postać wyniku, STDOUT itp.
Fragmenty nie mogą powodować żadnych błędów.
Fragmenty mogą powodować różne formy wyników.
Końcowe znaki nowego wiersza nie są liczone.
Pierwszy fragment musi mieć 1 bajt lub minimalną długość, która daje co najmniej 1 bajt danych wyjściowych.
Drugi fragment musi być o jeden bajt dłuższy.
Trzeci fragment kodu musi być o dwa bajty dłuższy niż pierwszy.
Odpowiedzi:
gs2, 412 + 5,37 * 10 902 + 10 10 903,1 bajtów
f
wypycha1\n2\nFizz\n4\nBuzz\n...\nFizzBuzz
jako412
ciąg bajtów.fô
wypisuje wszystkie jego permutacje, więc412! * 412
znaki.fôô
wypisuje wszystkie permutacje z tej listy elementów 412 !, gdzie każdy element ma 412 znaków, więc412 * (412!)!
bajtów.EDYCJA: Aby spojrzeć na to z perspektywy, przynajmniej tak jest
bajty, przyćmiewające wszystkie inne dotychczasowe odpowiedzi tutaj.
źródło
Pyth, 26 + 1140850688 + (> 4,37 × 10 20201781 )
Nie mam pojęcia, czy możliwe jest obliczenie dokładnej długości danych wyjściowych dla trzeciego programu. Mogę tylko podać granice. Wydrukuje coś pomiędzy
4.37 × 10^20201781
i1.25 × 10^20201790
znakami.To drukuje:
Pierwszy drukuje alfabet, drugi wszystkie podzbiory alfabetu, a trzeci podzbiory podzbiorów alfabetu, które są listą długości
2^(2^26) ~= 1.09 × 10^20201781
.Oczywiście żaden komputer nigdy nie będzie w stanie obliczyć tej dużej listy i wygenerować jej.
źródło
CJam, 17 + 34 + 72987060245299200000 = 72987060245299200051 bajtów wyjścia
Dla łatwiejszego porównania jest to około 7,3 * 10 19 .
Wydruki:
Cóż, ostatni składa się ze wszystkich permutacji z
[0 1 2 ... 19]
połączonymi liczbami. Nie polecałbym wypróbowania go ... (Spróbuj,4e!
jakbyś miał smak.)Przetestuj tutaj: Program 1 , Program 2 , Zdrowa wersja programu 3 .
źródło
Galaretka , 1,2 × 10 2568 bajtów produkcji
Oblicza 1000 , 1000 1000 i 1000 1000! .
Wypróbuj online: pierwszy program | drugi program | trzeci program (zmodyfikowany)
Do celów zliczania bajtów
ȷ
można go zakodować jako bajt 0xa0 w bieżącej wersji programu Jelly .Jak to działa
W Galaretce
ȷ
może być używany wewnątrz literałów liczbowych jako Pythone
(notacja naukowa). Na przykład3ȷ4
zwraca 30000 . W notacji naukowej Jelly, ustawienia domyślne współczynnika do 1 i domyślnie wykładnik do 3 , takȷ
,1ȷ3
i1000
wszyscy zwracają ten sam numer.źródło
⍳
?ı
jestR
(zakres).ı
iȷ
zrób coś zupełnie niezwiązanego z galaretką. Dodam wyjaśnienie za kilka minut.ȷRR
powoduje?ȷRR
jest⍳¨⍳1000
. Chciałem⍳⍳1000
. W Dyalog⍳⍳7
wyniki 91244,⍳⍳8
wyniki 803487,⍳⍳9
wyniki 7904816, ponieważ zawiera listę wszystkich wskaźników w tablicy 1 × 2 × 3 × 4 × ... Więc⍳⍳1000
teoretycznie (WS FULL!) Wygeneruje tablicę! 1000 list po 1000 elementów każdy!Sześciokąt , 1 + 3 + 6 = 10 bajtów wyjścia
Cóż ... niezbyt imponujący wynik, ale przynajmniej mogę stwierdzić, że jest optymalny. Za pomocą jednego bajtu nie można wydrukować czegoś i zakończyć, więc zaczynamy od dwóch bajtów:
Rozłożony kod to
To drukuje bajt i kończy.
Dla trzech bajtów kodu możemy wydrukować trzy bajty wyjścia. Na przykład:
lub rozwinięty:
odciski
111
. Każda mała litera odd
doz
działa i drukuje kod znaku. Są to jedyne 23 sposoby drukowania 3 bajtów za pomocą 3 bajtów kodu.Wreszcie dla czterech bajtów istnieje 169 sposobów na wydrukowanie 6 bajtów. Ponieważ żadne z nich nie robi nic bardziej interesującego (oprócz nieparzystego przepływu sterowania) niż proste rozwiązanie, przedstawię to:
Rozłożony:
Zgadłeś. Drukuje
111111
.Skąd mam wiedzieć, że są optymalne? Zaadaptowałem brutalnego forcera, który napisałem do katalogu maszyn prawdy, aby szukać maksymalnej skończonej wydajności w 7000 cyklach (nie sądzę, że możesz napisać zajętego bobra z 4 bajtami, który działa przez 7000 cykli, ale wciąż kończy się później.)
źródło
12345
i zatrzymują się. . . tylko ze względu na ciekawość, rozumiesz.Poważnie, 2025409 bajtów
1 bajt:
(daje 11 756 bajtów danych wyjściowych)
2 bajty:
Generuje 153 717 bajtów danych wyjściowych
3 bajty:
Generuje 1 859,936 bajtów danych wyjściowych
Poważnie nie ma jeszcze takich funkcji jak „wszystkie podzbiory” lub „wszystkie kombinacje”, więc wyniki są stosunkowo niskie.
źródło
N
to sprawia, że produkuje tak dużo produkcji?Python 3, 1 + 22 + 23 = 56
Wynik
Wydrukuj 9, a następnie definicję dla
id
iabs
.źródło
Labirynt , 1 + 2 + 4 = 7 bajtów
Kolejny niski wynik, który głównie publikuję, ponieważ udowodniłem, że jest optymalny dla danego języka.
Podobnie jak Hexagony, Labirynt nie może drukować i kończyć jednym bajtem, więc zaczynamy od dwóch bajtów:
Drukuje zero i kończy.
Przez trzy bajty nie możemy pokonać naiwnego rozwiązania:
Spowoduje to wydrukowanie dwóch bajtów przed zakończeniem. Istnieje kilka innych opcji, takich jak drukowanie za
-1
pomocą(!@
lub~!@
lub,!@
. Jest jednak jedno całkiem fajne rozwiązanie, które wykorzystuje rotację kodu źródłowego:To wypisuje zero, a następnie zmienia źródło na
@!>
. W tym momencie uderza w ślepy zaułek, odwraca się i wykonuje!
ponownie w drodze powrotnej, zanim zakończy działanie.W przypadku czterech bajtów jest to trochę przyjemniejsze, ponieważ jedynym sposobem na wydrukowanie 4 znaków jest użycie powyższej sztuczki:
Wydrukuj dwa zera, przejdź do
@!!>
, wydrukuj kolejne dwa zera.We wszystkich tych przypadkach ignoruję to, że możesz również wydrukować bajt za pomocą
\
lub.
, ponieważ zawsze będą one drukować dokładnie jeden bajt, podczas gdy!
wypisuje co najmniej jeden i potencjalnie kilka.źródło
Bash, 1726 bajtów
(Naprawiłem to teraz. Proszę rozważyć głosowanie).
1 bajt :
"
Wyjścia:
307 bajtów:
id
Wyjścia:
1418 bajtów:
zip
(drukuje do STDOUT)źródło
MATL , 313
Używana jest aktualna wersja języka ( 3.1.0 ), która jest wcześniejsza niż to wyzwanie.
Kod (predefiniowany literał: zwraca liczbę 2, która jest domyślnie drukowana):
Wyjście (1 bajt):
Kod (tworzy liczbę pi, która jest domyślnie drukowana z 15 miejscami po przecinku):
Wyjście (17 bajtów):
Kod (liczby od 1 do 99, które są drukowane domyślnie ze spacjami między nimi):
Wyjście (295 bajtów):
źródło
Przetwarzanie, 39 bajtów
Deterministyczny
1 bajt :
Wyjścia
0
.9 bajtów :
Wyjścia
3.1415927
29 bajtów :
Wyjścia
processing.opengl.PGraphics3D
Niedeterministyczny,> = 129 bajtów
> = 32 bajty:
Wyjścia
processing.awt.PGraphicsJava2D@ + [mem-address]
> = 32 bajty:
Wyjścia
processing.awt.PGraphicsJava2D@ + [mem-address]
> = 65 bajtów: (Dziękuję @anOKsquirrel za tę sugestię).
Wyjścia
źródło
JavaScript, 1 + 3 + 18 =
1822Niezbyt interesująca odpowiedź, ale prawdopodobnie najlepsza obsługa JavaScript.
Dodano 4 punkty dzięki @UndefinedFunction !
Dane wyjściowe jako tekst:
źródło
alert()
, otrzymasz wynikundefined
(przynajmniej w Safari).alert(.1)
daje0.1
ialert(1/9)
daje0.1111111111111111
alert
daje mifunction alert() { [native code] }
Befunge, 2 + 4 + 6 = 12
Każdy fragment krótszy niż długość 2 albo nie może wyprowadzać, albo nie może zakończyć wyświetlania.
W Befunge
.
wyświetla najwyższą wartość stosu jako liczbę całkowitą, a następnie spację. Spacja nie jest znakiem nowej linii, więc jest uwzględniana w liczeniu. Dodatkowo stos jest „nieskończenie” wypełniony zerami, więc programy wypisują (odpowiednio):źródło
..<@
drukuje 8 bajtów.SmileBASIC, 1 + 4 + 10 = 15 bajtów
Program 1:
Najkrótszy sposób na wydrukowanie czegoś to? (DRUKUJ) i pojedynczy znak. Może to być liczba lub nazwa zmiennej i nie ma to znaczenia, ponieważ wszystkie mają taką samą długość.
Program 2:
Teraz mamy dostęp do kilku innych rzeczy. Najdłuższe wyrażenie, jakie można wykonać, to jedna ze stałych #Y, #L lub #R, które mają odpowiednio wartości 128, 256 i 512. Zamiast tego używam przecinka, aby (w tym przypadku) wydrukować 3 dodatkowe spacje.
Program 3:
Za pomocą 3 znaków możesz pisać numery notacji elektronicznych:
źródło
HQ9 +, 71304
Drukuje teksty o liczbie 11 884 znaków w „99 butelkach piwa”
Drukuje dwukrotnie „99 butelek piwa”
Drukuje „99 butelek piwa” trzy razy
źródło
Japt
-Q
, Wyprowadza1.0123378918474279e+150
bajtyPełny numer to
bajty.
# 1
Wyjścia
Dla 67 bajtów. (Podziękowania dla Shaggy)
# 2
Wyjścia
czyli 501 bajtów.
(Podziękowania dla @Shaggy)
# 3
Wysyła wszystkie permutacje 95 drukowanych znaków ASCII w formacie
["...","...","..."...]
, który jestMożesz uzyskać nieskończoną ilość bajtów wyjściowych, jeśli użyjesz
-F
flagi w Japt. To, co robi, polega na tym, że jeśli ostatnie wyrażenie programu ma wartość false, to zamiast tego wyprowadza wartość określoną w flagi. Myślę, że wynikiem dla Japt-F"Insert Super Long String Here"
jest nieskończoność.źródło
undefined
in 1 byte:$
.K
and get 26 bytes of output, but your 501 byter is just geniusMalbolge, 1 + 2 + 3 = 6 bytes
Try it online: first, second, third
Outputs:
Brute forced. Assumes
\0
is not a valid output characterWith
\0
:Outputs:
źródło
scg, 1 + 27 + 188 = 216
First one:
Just prints 1, as the stack is outputted at the end of program.
Second:
Prints debug info, which should look like this:
Third:
adds 99 to stack, then uses range function. Outputs 01234567891011.... (this is one of those times I wish I implemented the factorial function. I haven't)
źródło
Marbelous 1 + 1 + 2 = 4 bytes of output
Marbelous is hamstrung here by having two-byte instructions. Pointless comments or unnecessary whitespace are the only ways to get an odd byte count.
print "A" and terminate:
print "B" and terminate, with an empty EOL comment
print "CD" and terminate:
źródło
Mathematica, 6 + 461 + 763 = 1230
1225618163bytes of outputCurrently, the last two use
Information
to get documentation about the symbols, which can output many bytes. Note that this was run on the 10.1 command-lineMathKernel
.źródło
Javascript, 72 bytes
This works in the Mozilla JSShell Javascript command line interpreter.
1 byte:
1
Outputs
1
35 bytes:
gc
Outputs
36 bytes:
run
Outputs
źródło
js
on the command line, you get a JavaScript shell.-bash: js: command not found
Please specify more.js
in the latest version of Bash.gc
doesn't seem to exist in TIO Node, so please find an implementation or remove this answer.Octave, 2818417 bytes
14 bytes for
ans = 2.7183\n
14 bytes for
ans = 3.1416\n
Display the entire documentation. 2818389 bytes, counted with
dd
Try it online! becauseevalc
didn't work.źródło
SmileBASIC 4, 1 + 13 + 15 = 29 bytes
This is going to be similar to 12Me21's SmileBASIC 3 answer, with a couple adjustments.
1
As before, the shortest amount of code to produce some output is 2 bytes:
?
(PRINT
) and some single-byte expression. The consensus is thatPRINT
does not produce a newline when it advances to the next line, due to the way the text screen works. So this results in one byte of output.2
With 3 bytes, we can do something different. SB4 introduces
INSPECT
, aliased as??
, which prints info about a single value. If we give it an empty string, for example, this can produce much more output than SB3 could. This gets us 13 bytes.3
We have 4 bytes to work with, so we have to decide what we should do to maximize our output. Going with
??
is a safe bet; we only have 2 bytes to use on our expression, but the additional output ofINSPECT
is basically free. So I use it to print a label string. This is 15 bytes.The total is 29 bytes.
źródło
Microscript II, 23+47+71=141 bytes
1:
C
The stringification of continuations is not strictly defined by the specs, but in the reference implementation this, run on its own, yields a 23 byte string.
<Continuation @t=\d\d\dus>
(\d
represents a digit, which digits varies).On my computer, at least, this does, in fact, always take between about 180 and about 400 microseconds to run.
The first use I've ever actually had for this instruction.
2:
CP
47 bytes of output- the output from the first one twice with a newline in between.
3:
CPP
Fairly straightforward. 71 bytes of output- the output from the first one three times with newlines in between.
źródło
PowerShell, ~4300 bytes
Approximate output length, given the system that it's run on. All the snippets below are deterministic, in that if given the same initial state of the computer will output the same text, just that in practice the output could change from execution to execution.
Length 1, 107 bytes
This is an alias for
Where-Object
. It will output a user prompt asking for additional information:Length 2, 113 bytes
This is an alias for
Remove-ItemProperty
. It will output a user prompt asking for additional information:Just barely longer than the length 1 snippet.
Length 3, ~4100 bytes
This is an alias for
Get-Process
which will output a formatted table of all running processes on the system:źródło
Javascript, 312 + 318 + 624 = 1254 bytes of output
The two functions
$
and$$
are available in all major browsers' consoles, as shortcuts fordocument.querySelector
anddocument.querySelectorAll
respectively. Different browsers have native code coerced to strings somewhat differently from each other, and IE uses plain JS in each function resulting in much longer representation.For the byte count, I'm taking the length of the string representation of each rather than the sometimes-modified console display, so the total bytes are, for each of the following browsers:
(I'm considering the IE result to be the "official" count because it's the longest.)
For non-console browser environments, the largest outputs come from the following:
Results length by browser:
{}
is usable) + 32 = 38 (or 48) bytes{}
is usable) + 38 = 44 (or 54){}
is usable) + 36 = 42 (or 52)These two sets of input produce the largest output possible in all of these browsers and consoles. To prove this, let's check all alternatives:
Object.getOwnPropertyNames(window).filter(x=>x.length<=3)
, and thenmap
them to their string outputs to determine the larger ones. (Note that in some browsers such as Firefox, certain special console variables cannot be accessed this way as they're not a property of the window.)1234567890
) optionally followed by.
and more decimal digits and/or an exponent part, or be a.
followed by one or more decimal digits and optionally an exponent part. Other kinds of numbers must be either0o
,0x
, or0b
(or uppercase forms), followed by one or more digits. For our purposes, we can deduce the following:$
, a comma, or a single-digit number. Arrays with only one element are coerced to strings as the element itself. Empty arrays become empty strings.{}
alone at the beginning of a script would be treated as an enclosure rather than creating an object.eval({})
returns undefined,eval({$})
returns the$
function. There are insufficient characters to surround the{}
in()
.if
,in
,do
,new
,for
,try
,var
, andlet
would all require a minimum of two other characters to use, exceeding the limit.~
,+
,-
,!
,++
, and--
. The two-character operators can only be used with a single character variable, of which there is only one ($
), which yieldsNaN
. The other four operators can be used with any one- or two- character value, of which there are:$
,$_
,$0
,$1
,$2
,$3
,$4
,$
,$$
,$x
). When used with these operators, the results are limited to-1
,true
,false
, andNaN
.true
,false
.-1
,0
(-0
becomes0
on toString),true
.+
,-
,*
,/
,%
,<
,>
,&
,|
,^
. They can only be used with a single-character value on each side. Options for values include$
and integers 0-9. Results of all combinations of these includeInfinity
, some numbers and binary values mentioned above, and numerous fractions which are coerced to strings of 19 characters or less (1/7
is 19 characters, unlike1/9
suggested above which is only 18), and the text representation of$
preceded or followed by a single-digit integer or itself..
requires an existing variable and a identifier referring to a property. All uses of this here result inundefined
. Surrounding a value in(
)
returns the value, as does assigning it with=
. Using()
or `` to call a value as a function results in undefined or errors with all available values.Adding all this up, there are a grand total of 1651 possible outputs when using a Chrome console. The longest outputs for one, two, and three characters are from
$
,$$
, and$+$
respectively.źródło
dc, 2+5+18=25 bytes
1:
Ff
yields (Try it online!):2:
Fdf
yields (Try it online!):3:
Fd^f
yields (Try it online!)None of which are particularly interesting, but
dc
isn't really great for spitting out piles of output. I do like that each answer builds on the previous. Anyway,F
is just the number 15;f
prints the entire stack;d
duplicates top-of-stack;^
raises next-to-top-of-stack to the power of top-of-stack (in this case, 15^15). I don't believe this can be topped indc
.źródło
Ruby, 3+14+28 = 45 bytes
Why did I do this.
Prints
nil
.Prints
#<IO:<STDOUT>>
.Prints something along the lines of
#<Object:0x0000000003610988>
.Launches an instance of Interactive Ruby. Upon exiting, the returned object is
#<IRB::Irb: @context=#<IRB::Context:0x0000000003643040>, @signal_status=:IN_EVAL, @scanner=#<RubyLex:0x00000000038900a0>>
for 121, but since it requires you to press^D
or something to actually exit the irb instance, I wasn't sure if it'd actually count as a solution in "3 bytes" so I'm not actually including it in the score unless it gets an OK.źródło
Perl 6, 53 (17 + 18 + 18) bytes
e
outputs-e
outputse*e
outputsźródło
Runic Enchantments, 4,000,000 bytes of output
The first program is:
Takes 2 bytes to: push a value to the stack, print a value from the stack, and terminate. In this case it prints
10
(though any integer value from 0 to 16 are also just as valid)For 3 bytes:
Prints
10000
, Again,a
could be 1 through 16 inclusive (in order to generate more output than the original program, 0 is potentially valid under other operators) and there aren't a whole lot of operators that take a single input and produce any output, much less longer output.XCYZ:E
are the only real options.aY@
is just the one that results in the most output.According to language specification, this runs infinitely. However as the interpreter has a built in "ok, that's enough" maximum execution limit, this is the most output achievable in 4 characters (and TIO cuts off execution after ~130,000 bytes for exceeding 128kib) and as the interpreter defines the language, this works. And while I have raised that threshold once before (from 10k steps to 1 million), I don't plan on messing with it any time soon.
Bigger?
If I invoke the three assumptions I made here, then sure.
Which works out to
Ack(65,Ack(65,64))
, which aren't terribly large values to go shoving into the Ackerman function initially--certainly smaller than the 255 in the older post--but its ok, we can call Ack twice in 4 instructions.And only god knows what it'll print.
Note: the
A
instruction has since then been made theMath
meta-instruction, which consumes 3 objects on the stack: a char for what instruction to perform and then two inputs, x and y. As such this program doesn't actually do anything, both because neitherA
nor@
map to a math function and because two subsequent calls results in a stack underflow.źródło