Najkrótszy kod dla najdłuższego wyjścia [zamknięty]

10

Ten jest dość prosty.

Napisz najkrótszy program, jaki możesz, generując jak najwięcej wyników.

Aby było fajnie, programy wytwarzające nieskończone wyjście zostaną zdyskwalifikowane.

Zwycięzcą jest program o największym stosunku wielkości wyjściowej do wielkości kodu.

Wyniki są oparte na tym, co działa na moim komputerze, którym jest Mac z systemem Mac OS X 10.7.5 z procesorem Intel Core i5 i 8 GB pamięci.

tbodt
źródło
Nie jest jasne, o co dokładnie pytasz. Czy odpowiedzi powinny zakładać nieograniczoną pamięć, nieograniczony rozmiar indeksu itp.?
Peter Taylor
@PeterTaylor Naprawiłem to.
tbodt
5
Daj się porwać, jeśli potrafię to rozgryźć, ale jestem pewien, że istnieje sposób, aby jakiś tłumacz interpretował pusty plik i tworzył dowolną treść - co również dawałoby nieskończony stosunek .
8
@LegoStormtroopr GolfScript pasuje do rachunku. Wykonanie pustego skryptu spowoduje wygenerowanie dokładnie jednego znaku wyjściowego:\n
primo
1
@ user2509848 nie, ponieważ, jak powiedziałem, nieskończone wyjście się nie liczy.
tbodt

Odpowiedzi:

18

Python: kod 8 znaków, wyjście 387420489 znaków - Stosunek: 48427561.125: 1

'a'*9**9

Możemy mieć stosunek do nieskończoności, dodając więcej **9s:

'a'*9**9**9
'a'*9**9**9**9
etc.

Na przykład:

'a'*9**9**9**9**9**9

który ma stosunek ~ 10 10 10 10 10 8,568 (niewyobrażalnie duża liczba).

arshajii
źródło
Lepszy od drugiego ...
tbodt
@tbodt Dlaczego? O_o @arshajii Jeśli dodasz wystarczającą liczbę **9s, czy w końcu nie stanie się Infinity?
Klamka
@Doorknob Przepraszamy, nie wiem wszystkiego o python. Teraz wyzwanie brzmi: ustal maksymalną liczbę **9s, jaką możesz umieścić, zanim stanie się wyjście Infinity.
tbodt
1
@Doorknob Python ints mają dowolną precyzję.
arshajii
@tbodt Zobacz komentarz powyżej.
arshajii
16

Są to więc dobre programy, które generują dużo danych wyjściowych przy bardzo małym kodzie, ale żaden z nich nie jest naprawdę krótki ...

brainfuck, 5 znaków, 255 bajtów wyniku

-[.-]

Myślę, że to jedyny przypadek użycia, w którym pieprzenie mózgu naprawdę się wyróżnia. Wiem, że ten nie wygra, ale nie sądzę, że moglibyśmy być lepsi niż przykład w Pythonie. Nie tylko to, ale ...

pieprzenie mózgu, 4 znaki, nieskończona moc wyjściowa

-[.]

Przypuszczam, że jest to najkrótszy dostępny program o nieskończonej wydajności.

Właściwie, poczekaj, mój kumpel właśnie wymyślił naprawdę dobry.

Python, 80 bajtów, nieznana ilość danych wyjściowych

from datetime import datetime
while datetime.now()!=datetime.max()
 print "This will probably get disqualified"

Ten program ostatecznie zostanie ostatecznie zatrzymany, ale nastąpi to dopiero po około 8 000 latach. Dokładna liczba znaków wyjściowych zależy od szybkości, z jaką komputer może wytwarzać znaki.

ymbirtt
źródło
1
Podoba mi się python one: D
Kevin Cox
2
„Przypuszczam, że jest to najkrótszy dostępny program do generowania nieskończoności” nope, tutaj przydatna jest pętla niejawna Befunge (poprzez zawinięcie): .generuje nieskończony strumień 0 znaków.
FireFly,
14

Perl - 19 bajtów, wyjście 187200000000000000 bajtów (9852631578947368.42: 1)

print+($]x9e7)x26e7

166 petaby z pojedynczym wyciągiem, zużywając nie więcej niż 1,7 GB pamięci.

Jest kilka rzeczy, które uczyniły to wyzwanie bardziej interesującym, niż się spodziewałem. Perl wydaje się odmawiać przydzielania więcej niż 1 GB pamięci do dowolnej listy. Dlatego 4-bajtowe odniesienie skalarne do wewnętrznego łańcucha można powtórzyć tylko 26e7 ≈ 2 28 razy. $]jest liczbą „starej wersji perla”, która jako ciąg znaków ma długość 8 bajtów i przypomina 5.016002.

Przy większej pamięci systemowej powinna być w stanie przejść wyżej. Zakładając, że pełne 8 GB byłyby faktycznie dostępne, powinieneś być w stanie użyć $]x9e8zamiast tego wewnętrznego łańcucha, który dałby 1,62 eksabajtów.

primo
źródło
16
„Jeśli dasz 1 000 000 małp 1 000 000 maszyn do pisania i dasz im 1 000 000 lat na pisanie różnych rzeczy, jedna małpa ostatecznie napisze program Java. Inne po prostu produkują skrypty Perla.” Tak myślałem, gdy to zobaczyłem: Źródło
Klamka
5

Ruby i Python, 13 znaków, wyjście 599994 znaków, stosunek ~ 46153: 1

999999**99999

Po prostu podnosi bardzo dużą liczbę do potęgi innej bardzo dużej liczby. Uruchomienie zajmuje około 20 sekund. Nie mogę zwiększyć liczb, ponieważ dzięki temu liczba stałaby się Nieskończonością.

(Zrobiłem to wcześniej , obecnie pracuję nad stworzeniem pętli dla jeszcze dłuższych wyników)

Edycja: Zrobiłem to!

Ruby, 28 znaków, wyjście char 6e599999, współczynnik ~ 6e599998 (myślę)

a=999999**99999;a.times{p a}

Nie przetestowano (z oczywistych powodów), ale jestem pewien, że pierwsza liczba to około 1e599994, która pomnożona przez 599994 to około 6e599999. Teoretycznie to zadziałałoby, ale nie jestem pewien, czy spowodowałoby to awarię komputera, więc zrzeczenie się odpowiedzialności: Nie jestem odpowiedzialny, jeśli w jakikolwiek sposób wyrządzi on szkody Twojemu komputerowi: P

Oczywiście możesz kontynuować:

Ruby, 37 znaków, wyjście 6e359992800041 char, współczynnik ~ 6e359992800040

a=999999**99999;a.times{a.times{p a}}

I tak dalej, ale wątpię, aby jakikolwiek komputer to poradził: P

Klamka
źródło
To naprawdę poliglot ...
tbodt
@tbodt Hehe, racja! Kiedy dodam moje zmiany, nie będzie to jednak możliwe
Klamka
5

Jeśli dozwolone było nieskończone wprowadzanie danych,

cat /dev/random

Ponieważ to nie jest

head -99 /dev/random

(25128 danych wyjściowych: 20 danych wejściowych = 1256,4: 1)

Nie jestem na Linux-ie, ale wyobrażam sobie, że możesz zrobić coś takiego

timeout 99d cat /dev/random

i uzyskać ogromną wydajność. (poprzez odpowiedź GigaWatt)

tristyna
źródło
2
Można zastąpić jeden znak i dokonać wyjście 8562 razy dłużej: timeout 99d. Tak, 99-dniowy czas pracy. Nie jestem tego pewien, ale ostatecznie opróżnisz pulę entropii /dev/randomi zostanie ona zablokowana, więc /dev/urandommoże być bardziej odpowiednie. (Udało mi się uzyskać 40 MB / si urandomtylko 128 KB / s random)
Pan Llama,
@GigaWatt, który jest niesamowity.
tristin
4

HQ9 +, 11471

9

Rzeczywista liczba znaków różni się w zależności od tłumacza, ale prawdopodobnie około 10000 miałoby rację?

Dom Hastings
źródło
Co to jest HQ9 +? Nigdy o tym nie słyszałem.
tbodt
Ach, przepraszam, to był głównie żart, ponieważ nie jest to „prawdziwy” język programowania, ale: esolangs.org/wiki/HQ9%2B
Dom Hastings
2

C #: 108 znaków. Przełożenie: 742123445489230793057592: 1

for(ulong i=0;i<ulong.MaxValue;i++){Console.Write(new WebClient().DownloadString(@"http://bit.ly/dDuoI4"));}

Po prostu pobiera i drukuje listę prawników Sądu Najwyższego Stanów Zjednoczonych w Wikipedii (4344904 znaków) 18446744073709551615 razy.

thepirat000
źródło
Wymaga to skracacza adresów URL. Nie jestem co do tego pewien.
tbodt
1
Ok. A co z tym: for(ulong i=0;i<ulong.MaxValue;i++){Console.Write(new string('a',int.MaxValue));}2147483647 znaków * 18446744073709551615 razy = 39614081238685424720914939905/81 => Stosunek: 489062731341795366924875801
thepirat000
Dużo lepiej. Nie wymaga skracania adresów URL.
tbodt
2

~ - ~! - Stosunek: (64 4 4 4 64 ) / 154 ~ = 10 10 10 10 10 1,583328920493678

'=~~~~,~~~~,~~~~:''=|*<%[%]'=',',',':''&*-~|:'''=|*<%[%]''&',',',':'''&*-~|:''''=|*<%[%]'''&',',',':''''&*-~|:''''&':''=|*<%[%]@~~~~,~~~~,~~:''&*-~|:''&':

Jak to działa: Najpierw ustawia się 'na 4 ^ 3 lub 64. Następnie tworzy ''funkcję, która ustawia się 'na '^ 4 * razy (gdzie * jest to wejście). '''jest następnie wykonywana funkcja, która wywołuje ''z wejściem jako '^ 4. Następnie ''''tworzona jest funkcja, która wywołuje '''z '^ 4 jako wejściem. ''''jest następnie wywoływany z wejściem 64. Na koniec ''zmienia się na funkcję, która wypisuje spację * razy; jest to następnie wywoływane z wejściem' .

Okazuje się, że w końcu 'wynosi 64 4 4 4 64 , a długość mojego programu to 154 ; uderz go w Wolfram | Alpha i wypluje 10 10 10 10 10 1.583328920493678 , którego nawet nie zawracał sobie głowy obliczeniem. Nie wiem nawet, ile cyfr zawiera , ale 64 4 4 zawiera 463. Całkiem nieźle jak na język, który obsługuje tylko jednoznaczne liczby wyraźne i nie ma funkcji wykładniczej; 3

Mógłbym to znacznie zwiększyć, ale przesada.

cjfaure
źródło
1

JavaScript: 27 znaków; 260 431 976 znaków wyjściowych; 9 964 628.74

for(s=i=61;s=btoa(s),i--;)s

Ten kod rekurencyjnie koduje dane wejściowe 61do Base64 61 razy. Kodowanie dowolnego wejścia długości ndo Base64 daje wynik długości n * 8/6zaokrąglony w górę do wielokrotności 4.

Musi to zostać uruchomione ze środowiska konsoli JavaScript, które natywnie obsługuje funkcję kodowania Base64 btoa. (Każda nowoczesna przeglądarka, ale nie Node.js.) Uwaga Chrome nie może działać wyżej i=61, a Firefox tylko i=60. Pamiętaj też, że konsola Chrome nie może faktycznie wyświetlić wyniku, ponieważ jest on zbyt duży, ale możesz sprawdzić rozmiar wyniku, uruchamiając

for(s=i=61;s=btoa(s),i--;)s.length

Gdyby ten program działał maksymalnie i=99, wygenerowałby hipotetyczny wynik o wielkości 14 566 872,071,840 (14,5 biliona, 14,5e12) znaków, przy hipotetycznym stosunku około 540 miliardów (5,39e11).

apsillery
źródło
1

Rubinowy, 23 znaki - ~ 500000000000000 (5e14) Wyjście

while rand
puts 0
end

Ti-Basic 84, 13 znaków - ~ 3000 Wyjście

:Disp 1
:prgmA

Nazwij program prgmA

Timtech
źródło
1

rubin, 283 96 44 znaków

a=1e99.times;a{a{a{a{a{puts'a'*99}}}}}}}}}}

Niezbyt krótki, ale rekompensuje to na wyjściu, a tyle, że nie byłem jeszcze w stanie go zmierzyć.

tbodt
źródło
2
według moich obliczeń będzie to dotyczyło 1e127wyjścia znaków. w każdym razie przypisanie do zmiennej zmniejszy rozmiar kodu o połowę. Ponadto, 1e99jest większa liczba, która zajmuje mniej miejsca. również użyj mapzamiast each, użyj putszamiast print, usuń dodatkowe spacje między printi "ier.... Możesz także zamienić ten duży ciąg na 'a'*999(lub nawet ?a*999), który jest dłuższy i zajmuje mniej miejsca. Podsumowanie: to wcale nie jest gra w golfa
Klamka
@Doorknob Thanks. Nic nie wiem o ruby, oprócz 3 rozdziału przejmującego przewodnika po ruby.
tbodt
tak, dlaczego po prostu nie przypiszesz (0..1e99).mapdo zmiennej? jaka=(0...1e99).map;a{a{a{a{a{puts'a'*99}}}}}
Klamka
W moim tłumaczu Ruby zabrakło oceny pamięci a=(0...1e99).map. Być może zechcesz to nieco uspokoić. 0..1e9zużyłby około 4 GB.
primo
1

Mathematica 9 znaków Stosunek: ~ 4564112: 1

Poniżej znajduje się obraz danych wejściowych Mathematica. Nie zastanawiałem się, jak to zrobić w SE.

wykładniki

Oto zrzut ekranu pokazujący liczbę cyfr na wyjściu. IntegerDigitskonwertuje dane wyjściowe na listę cyfr. Lengthliczy liczbę cyfr.

liczyć

Klawisze, aby wprowadzić: 9 , ctrl6, 9, ctrl6, 9, ctrl6, 9, ctrl6, 9....

DavidC
źródło
1
Co? Możesz wpisać to w Mathematica?
tbodt
Tak, jest to uzasadniony wkład do Mathematica.
DavidC,
I jakie są wymagane naciśnięcia klawiszy?
tbodt
@tbodt Klawisze są teraz wyświetlane w odpowiedzi.
DavidC
1
Nie wiem, czy musisz podać kolejność, ale chcesz, aby obliczała się z góry na dół: (9 ^ 9) ^ 9 to 78 cyfr, ale 9 ^ (9 ^ 9) to 369,693,100 cyfr (dzięki, wolframalpha)
SeanC
0

Befunge-93: 48 znaków, około ((2 ^ 32) ^ 2) * 10 znaków wyjściowych

Stos Befunge jest teoretycznie nieskończony, ale liczby przechowywane w stosie są ograniczone do wielkości długiej liczby całkowitej bez znaku (tutaj zakłada się, że to 32 bity). Zatem dla interpretera Befunge (x + 1)> x jest fałszem dla prawidłowej wartości x. Używamy tego faktu, aby najpierw przesunąć wszystkie wartości od zera do maksimum (dwa razy, z jedną co trzecią liczbą), a następnie dla każdej wartości na stosie, wyprowadzamy ją i zmniejszamy, a następnie wyskakujemy, gdy osiągnie zero. W końcu stos opróżnia się, a program się kończy. Być może jestem trochę zaniepokojony wielkością wyjściową, ale powinna być gdzieś na tym boisku.

>::1# + #1\`# :# _> #- #1 :# :# .# _# .# :# _@
MDS
źródło
0

C: 48 znaków, ok. (2 ^ 32-1) * Wyjście 65090 bajtów

main(){for(int i=1<<31;i<~0;)puts("!");main();}

Pamiętaj, że 65090 nie jest dokładny i zależy od wielkości stosu. Program ostatecznie się zatrzyma, gdy się zawiesi. Mógłbym też po prostu wstawić coraz dłuższy ciąg w puts (), aby racja zbliżała się do nieskończoności, ale wydaje się to dość oszukańcze.

Stuntddude
źródło
1
to nieskończona pętla
izabera
Ojej, masz rację, tak myślę. Zobaczę, czy mogę wymyślić, jak to naprawić.
Stuntddude,
0

java (131): nieznana, ale skończona kwota

class A{public static void main(String[] args){while(Math.random()>0){for(long l=0;l!=-1;l++){System.out.println("1234567890");}}}}

Używając niskiej szansy Math.random (), aby dostać się do 0 w pętli, a następnie przejść do 2 ^ 64-1 pętli przez foreach z wyjściem 1234567890;

masterX244
źródło
0

Python 3, 115 bajtów, działa przez 7983 lata (nieznana liczba znaków)

EDYCJA: ymbirtt mnie pobił ._.

Wiem, że to nie jest naprawdę krótkie i wiem, że druga odpowiedź w Pythonie jest znacznie dłuższa, ale postanowiłem spróbować.

Program działa przez około 8000 lat, co, jak wiadomo, trwa dość długo.

Ciągle pobiera bieżący czas za pomocą datetime.datetime.now()funkcji i porównuje go z tym 9999-12-31 24:59:59.999999, o ile wiem o maksymalnej dacie w Pythonie.

Jeśli to jest równe, program zatrzymuje się. Jeśli tak nie jest, ciągle się wyświetla a.

import datetime
while 1:
    if str(datetime.datetime.now())=="9999-12-31 24:59:59.999999":exit
    else:print("a")
m654
źródło
1
Co jeśli przegapisz ten moment?
C5H8NNaO4
@ C5H8NNaO4 Jeśli pozostawisz to włączone przez 7983 lata, mam nadzieję, że nie przegapisz tego.
m654