Bir dizenin googol kopyalarını çıktılar


63

Herhangi bir girdi talep etmeyen programları görmek, boş olmayan bir dizgenin googol kopyalarını yazdırmak , daha az, daha fazla değil, daha sonra durmakla ilgileniyorum . Bir googol 10 ^ 100, yani 1 ve ardından yüz 0'ları ondalık olarak tanımlanır.

Örnek çıktı:

111111111111111111111111111111111111111111111111111111111111111111111111...

veya

Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
...

Dize ayrıca tamamen beyaz boşluktan veya özel sembollerden oluşabilir. Sabit bir dizenin özdeş kopyalarının tek istisnası, dilinizin çıktısını önlenemeyen bir şekilde süslemesi, ancak her satırın satır numarasını hazırlama gibi bir sarmalayıcı komut dosyasında önemsiz şekilde geri alınabilmesi olabilir. Bu gibi durumlarda sarıcı komut dosyasının sağlanması gerekmez.

Bilgisayarınızın hiçbir zaman tükenmeyeceğini varsayabilirsiniz, ancak bunun dışında programınızın makul bir kaynak talebine sahip olması gerekir. Ayrıca, seçtiğiniz programlama dilinin ortaya koyduğu kısıtlamalara uymanız gerekir; örneğin, tamsayı türleri için izin verilen maksimum değeri aşamaz ve 4 GB'den fazla belleğe ihtiyaç duymazsınız.

Başka bir deyişle, program prensip olarak bilgisayarınızda çalıştırılarak test edilebilir olmalıdır . Ancak bu rakamın kapsamı nedeniyle ispatlamanız istenecektir çıktılan dizenin kopya sayısının tam olarak 10 ^ 100 olduğunu ve programın daha sonra durduğunu . Bir hata nedeniyle durma, durma veya durma veya hatta sonlandırma olabilir, ancak öyleyse, hatanın programın çıktısından kolayca ayrılamayacak herhangi bir çıktı üretmemesi gerekir.

Bu , bu yüzden en az bayt ile çözüm kazanır.

Örnek çözüm (C, ungolfed, 3768 bytes)

#include <stdio.h>

int main() {
  int a00, a01, a02, a03, ..., a99;
  for(a00 = 0; a00 < 10; a00++)
  for(a01 = 0; a01 < 10; a01++)
  for(a02 = 0; a02 < 10; a02++)
  for(a03 = 0; a03 < 10; a03++)
  ...
  for(a99 = 0; a99 < 10; a99++)
    puts("1");
  return 0;
}

10
Sandbox'ı bir dahaki sefere düşünün .
Kedi,

9
Yeni bir soru gönderdiğinizde, önce onu sanal alana göndermeniz istenir .
kusur,

1
@KritixiLithos Bu fikirle oynuyordu ancak hızlı bir şekilde örnek bir çözüm bulamadım. Bir devamı yapmaktan çekinmeyin :-)
The Vee

3
@closevoter Bunun çok geniş olduğuna emin misiniz? Sağduyu, bunu otomatik olarak "10 ^ 100 kez boş bir dizge yazdırmak" ve "10 ^ 100 kez bir karakter yazdırmak" şeklinde daraltır.
dorukayhan

Yanıtlar:


34

Jöle , 6 4 bayt

³Ȯ*¡

Bu baskılar (bağımsız değişkenler w / o fonksiyonu) bir giriş parametresiz bağlantı 10 200 dize kopyalarını 100 basıldıkça yani, 10 100 oluşur dize kopyalarını 10 100 dize kopyaları 100 .

Çevrimiçi deneyin!

Çevrimiçi tercümanın, pratik nedenlerden dolayı çıktıyı 100 KB olarak kestiğini unutmayın. Kod ayrıca tam bir program olarak da çalışır, ancak örtük çıktı nedeniyle bu program bir kopyayı çok fazla yazdırır.

Nasıl çalışır

³Ȯ*¡  Niladic link. No arguments.

³     Set the left argument and initial return value to 100.
 Ȯ    Print the current return value.
  *   Compute 100 ** 100 = 1e200.
   ¡  Call Ȯ 1e200 times. 

3
Şey ... Vay ... 10^100Orijinal çıktının 10^100kopyalarını (bir dizgenin kopyaları) iki tam bayt için bile biraz ileri götürüyor . Bunu "puan çıktı / program uzunluğu, en yüksek kazançlar" mücadelesine gönderdiniz mi?
wizzwizz4

1
Hangi meydan okuduğunuzdan emin değiliz (bu türden bir kaç tane vardı), ancak 3e200 muhtemelen zaten rekabetçi değil.
Dennis,

2
@ wizzwizz4 Numaranızı standart gösterimde ifade edebiliyorsanız, muhtemelen çok küçüktür.
orlp

1
"Düşme" = başarısız / çökme
Loren Pechtel

4
@LorenPechtel Jelly, 665 bitlik tamsayıları kolaylıkla idare eden Python'da uygulanır.
Dennis

60

Bulanık Octo Guacamole, 13 12 11 10 bayt

9+ddpp![g] 

Açıklama:

9+ddpp![g]
9+           # push 9 and increment, giving 10
  dd         # duplicate, twice. now you have [10,10,10]
    pp       # raise a 10 to the 10th power, then raise that to the 10th again. That ends up being 10^100.
      ![ ]   # for loop, `!` sets the counter to the top of stack
        g    # prints an ASCII art goat. 

Basılı keçi örneği:

                  ___.
                 //  \\
                ((   ""
                 \\__,
                /6 (%)\,
               (__/:";,;\--____----_
                ;; :";,:";`;,";,;";`,`_
                  ;:,;;";";,;":,";";,-Y\
                   ;,;,;";";,;":;";"; Z/
                   / ;,";";,;";,;";;"
                  / / |";/~~~~~\";;"
                 ( K  | |      || |
                  \_\ | |      || |
                   \Z | |      || |
                      L_|      LL_|
                      LW/      LLW/

2
Keçinin başını anlamak biraz zaman aldı. Kolayca tanınabilir değil.
mbomb007

Gaot bana ASCII sanatını verdi, ona sor.
Rɪᴋᴇʀ

9
Ne hakkında konuştuğun hakkında hiçbir fikrim yok. +1.
djechlin

15
@djechlin Downgoat benden bir keçi basmak için bir eklenti eklememi istedi. Mecburum.
Rɪᴋᴇʀ

21

Python, 28 bayt

Jonathan Allan'a -1 bayt teşekkürler!

Python 2:

i=10**100
while i:print;i-=1

Python 3 (30 bayt):

i=10**100
while i:print();i-=1

2
i=10**100Newline while i:print();i-=1bir bayt kaydeder. Python 2'yi kullanarak - iki tane daha kaydedinwhile i:print;i-=1
Jonathan Allan

@JonathanAllan -1 bayt için teşekkürler. Python 2 çözümüne gelince, bunu yayınlamanız için bırakacağım :)
FlipTack

Güzel ilk cevap! :)
Daniel

Python aslında 10'dan 100'e bir tamsayıda depolayabilir mi?
Arturo Torres Sánchez

7
@ ArturoTorresSánchez Evet,
python'da

18

Haskell, 28 bayt

main=putStr$[1..10^100]>>"1"

Dizenin 10 ^ 100 kopyasını birleştirir "1"ve yazdırır.


Dize bitiştirme, baskı başlamadan önce yapılıyor mu? Öyleyse bunun "en fazla 4 GB bellek" hakkındaki kuralı
ihlal ettiğini düşünürdüm

8
@daniero: Haskell'in tembellik baskısı sayesinde hemen başlar. Bilgisayarımda programın 2 MB'tan daha az belleğe ihtiyacı var (çalışma zamanı sistemi RTS dahil).
nimi

s=[1..10^100]>>"1"izin verilen bir yanıt biçiminde?
user253751

Sonsuz tamsayılar? Aksi halde 10 ^ 100'e düşüyor
Loren Pechtel

@ immibis: meydan okuma genellikle "stdout'a yazdır" anlamına gelen "yazdır" diyor. sÖrneğinizden yazdırmıyor - ya da REPL kullanıyorsanız 1ile çevreleyen ". Ben sadece tahmin putStr$[1..10^100]>>"1"olmadan main=iyi olurdu, ama tam bir program sunmayı istedik.
nimi

17

brainfuck, 480 188 114 106 98 bayt

Sadece yapılması gereken için.

Kaydırma ile 8-bit hücreleri varsayar. 250 255 NUL bayt yazdırır , 10 100 kez 10 155 çarpı 25 255 NUL bayt.

>>>>>>-[[->>>+<<<]------>>>-]<<<[<<<]+[+[>>>]<<<->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-[<<<].>>>-]

Açıklama:

>>>>>> biraz çalışma alanı bırakmak gerekiyor.

- 255 üretir.

[[->>>+<<<]------>>>-] bunu 250 değerinin 255 kopyasına dönüştürür ve şöyle bir kaset verir:

0 0 0 0 0 0 250 0 0 250 0 0 ... 250 0 0 [0]

<<<[<<<]+ veri işaretçisini geri taşır ve ilk verileri tamamlar:

0 0 0 [1] 0 0 250 0 0 250 0 0 ...

Sonra döngü geliyor: [+...-]başlangıçta 1'i 2'ye ayarlar, bu döngü sonunda 1'e geri döner. Döngü gövdesi zaten 2 - 1 olarak ayarlandığında, döngü sona erer.

Şimdi, 2 250 250 250 ... 250 sayıları, baz 250'de, her biri temsil ettiği sayıdan daha büyük olan bir sayacı temsil eder.

  • [>>>]<<<sonuna kadar sağa doğru hareket eder. Her hane sıfır olmayan bir sayı ile temsil edildiğinden, bu önemsizdir.

  • ->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-sayacı 1 azaltır. Son rakamla başlayarak: rakam azalır. Olumlu kalırsa, bittik. Sıfıra dönerse, 250'ye ayarlayın ve önceki rakamlarla devam edin.

  • [<<<].>>>işaretçiyi en soldaki haneden önce geri hareket ettirir ve bu NUL baytını yazdırmak için güzel bir andır. Ardından, işimiz bittiyse görmek için tam olarak en soldaki haneye konumlandırın.

Doğruluğunu doğrulamak için, ilkini 250 2 için 250 1 NUL bayt yazdırmak -üzere değiştirin .+++


16

C, 51 bayt

İşlev derinlik 99'a g()özyinelemeli işlevi çağırır f().

Netlik için f()ve arasına eklenen gereksiz newline dahil değildir g().

f(n,i){for(i=10;i--;)n?f(n-1):puts("");}
g(){f(99);}

//call like this
main(){g();}

1E100 yeni satır yazdırır.

Beyanı iitibariyle ikinci parametre f()kendi makinede (CygWin üzerinde GCC) ve (onlar da GCC çalıştırmak inanmak) ideone.com üzerinde test C. tüm sürümlerinde çalışması garanti değil yukarı f (99) açıkça değil nedenleri!


1
Bu 4 GiB hafıza sınırına uyuyor mu?
Dennis,

3
@Dennis Yapması gerekir, sadece f, n ve i'nin 99 nolu derinliklerini yığın üzerinde depolar, C'nin 100 basamaklı bir sayı ile sayıyı kaldıramayacağı gerçeğini yakalar. f()1980 baytlık örneklerin her biri için maksimum 20 bayt tahmin ediyorum . Yeni putssatırları API'ye döker ve API, arabelleği gerektiği gibi çıkarır ve temizler.
Seviye Nehri St

3
Yerel olarak test edildi ve bellek kullanımı 1 MiB'yi bile geçmiyor.
Dennis,

İ'nin f () parametresinin ikinci parametresi olarak bildirilmesi, C'nin tüm sürümlerinde çalışması garanti edilmez : Callee'nin çıkardığı yığında beliren bir yığın-arkı çağırma kuralıyla kırılabilir (ya fda arayanın olduğu yere yığmak için yazarsa) beklemeyin). clang, “f” çağrısında çok az sayıda argüman olduğu konusunda uyarır -std=c89ve -std=c99bu nedenle tanım, belirli sayıda argüman ile bildirimde bulunur. Ama unuttum; Bence bu derleyici, fonksiyonun 2 argüman beklediğini bildiği anlamına gelir ve her zaman 2. bir argüman için yer bırakacaktır.
Peter Cordes

1
@FelixDombek, bir süre önce "program" ın "tam program" açıkça belirtilmediği sürece bir program veya işlev yazabileceğiniz anlamına geldiğine karar verdi. meta.codegolf.stackexchange.com/a/6912/15599 . Bu nedenle benim gönderim, gyardımcı işlevini içerir f. maindaha uzun olurdu. Eğer bakarsanız, burada birkaç başka fonksiyon gönderimi var.
Seviye Nehri St

14

Commodore VIC 20 makine kodu (40 bayt)

... burada onaltılık olarak gösterilir:

1040   A9[64]A2 00 9D 68 10 E8  E0[32]D0 F8 A9 00 9D 68
1050   10 A9[31]20 D2 FF A2 00  A9[64]DE 68 10 30 08 D0
1060   F0 9D 68 10 E8 D0 F3 60

(Kullanarak başladı SYS 4160)

Parantez içindeki baytların anlamı

  • 0x64 (iki kez oluşur) bazdır (100); (2 ila 127 arasındaki değerler çalışmalıdır)
  • 0x32 üs (50) 'dir (sıfır olmayan herhangi bir değer (1-255) çalışmalıdır)
  • 100 ^ 50 = 10 ^ 100 olduğuna dikkat edin; Programı 100 ^ 50 kez çalıştırmak, 10 ^ 100 kez yapmaktan daha fazla RAM verimlidir
  • 0x31, yazdırılacak ASCII karakteridir

ve hiçbir noktada 4 G B'den fazla belleğe ihtiyaç duyulmamalıdır.

Bu bir yazım hatası mı?

1981 yılına sahibiz.

Tipik bir ev bilgisayarında 1 ila 16 K B RAM bulunur! Ve 1 M B veya daha fazla olan profesyonel modelleri bulmak zor .

(Tamam. Sadece bir şaka.)

Başka bir deyişle, program prensip olarak bilgisayarınızda çalıştırılarak test edilebilir olmalıdır. Ancak, bu sayının kapsamı nedeniyle, çıktılan dizenin kopya sayısının tam olarak 10 ^ 100 olduğunu ve programın daha sonra durduğunu ispatlamanız beklenir.

Program diğer üs ve üslerle test edildi. 100 ve 50 ile de çalışacağından şüphem yok.

En azından bu sayılarla çarpışmaz (ancak ölçülebilir zamanda da sona ermez).

Hafıza boyutu 50 ve 100'lük bir üs için 127'den küçüktür, bu nedenle 100'lük bir temel sorun olmamalıdır.

Temel fikir

100 sistemde sayılan 50 basamaklı bir sayaç var. Bayt 0x01-0x64, 0-99 basamaklarını gösterir. Sayaçtaki ilk bayt en düşük hanedir. Sayaçtaki son baytı (en yüksek basamak), 0x00 değerine sahip bir bayt izler.

Sayaç başlangıç ​​değeri 100 ^ 50'dir.

Bir dış döngü "mevcut kanala" bir bayt yazıyor (modern sistemlerde "standart çıktı"; tipik olarak ekran) ve sonra sayacı azaltır.

Azaltma iç döngü tarafından yapılır: Bir basamağı azaltır ve 1'den 99'a kadar bir taşma durumunda bir sonraki haneye ilerler. Sayacın sonundaki bayt 0x00 azalırsa, program durur.

Montaj kodu

    ; Some constants
    base=10
    exponent=100
    character=0x32

    ; Initialize the content of the counter to 100^50
    ; (Fill the first 50 bytes with the value 100)
    lda  #base
    ldx  #0
initLoop:
    sta  counter,x
    inx
    cpx  #exponent
    bne  initLoop
    ; (The terminating 0 at the end of the counter)
    lda  #0
    sta  counter,x

    ; Now do the actual job
outerLoop:
    ; Output a character
    lda  #character
    jsr  (0xFFD2)
    ; Prepare for the inner loop
    ldx  #0
    lda  #base
innerLoop:
    ; Decrement one digit
    dec  counter,x
    ; Result is negative -> must have been the terminating
    ; NUL byte -> Exit
    bmi  progEnd
    ; Result is not zero -> Print the next byte
    bne  outerLoop
    ; Result is zero -> Was 0x01 before -> As 0x01 represents
    ; digit 0 this is an underflow -> set the digit to
    ; "exponent" (100) again (which represents digit 99)
    sta  counter,x
    ; Go to the next digit and...
    inx
    ; ... repeat the inner loop (decrement next digit)
    ; (Note that this conditional branch is ALWAYS taken)
    bne  innerLoop

progEnd:
    rts

counter:
    ; The memory used by the counter is here...

DÜZENLE

Program Commodore C64'te de çalışıyor!


@ LevelRiverSt'in özyineleme fikrini benim için ödünç aldım. x86-64 makine kodu uygulamam libc'den putchar kullanarak) ödünç aldım. Uzatılmış bir döngü sayacı olarak düşündüm ve x86'da da işe yarayacaktı. (Ve benzer şekilde oldukça ucuz bir şekilde başlatılabilir). Belki bir ara deneyeceğim ...
Peter Cordes

1
LOL vay, ben .... <golf alkış> ... 6502 montaj görmedim ... uzun zamandır.
Alex Howansky,

12

Düğüm, 89 bayt

for(i="0".repeat(100)+1;+i;i=i.replace(/0*./,x=>"9".repeat(x.length-1)+~-x))console.log()

10 100 yeni satır çıktısı. (Teorik olarak, yani; değiştirerek testi 100ile 110 çıkışına 1 yeni satır yerine).

Bu idize ayarlayarak çalışır

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001

(100 sıfır ve 1; bir googol ters), sonra tekrar tekrar "1" in bir regex ile çıkarılması ve dizenin tamamı sıfır olana kadar yeni bir satır çıktısı alın.

C ++ cevabının portu 49 bayttır:

(f=n=>{for(i=10;i--;)n?f(n-1):console.log()})(99)

1
Bu bir dahi! Ya öyle ya da Retina'da bir uzmansınız, ki bu da "dahi" yi
Patrick Roberts

7

05AB1E , 6 bayt

Tn°F1?

açıklama

Tn°    # push 10^100
   F   # 10^100 times do
    1? # print 1

5
@ MartinCosenau: Neyse ki 05AB1E, sınırı olmayan python 3 tam sayılarını kullanır.
Emigna 29:16

1
@JanDvorak: Python 3 dokümanlarına göre , tamsayıların değeri için artık bir sınır yoktur .
Emigna

1
@JanDvorak: Gerçekten de. Sorunsuz oldukça büyük rakamlar kullandım (ancak bu kadar büyük değil). Burada sadece 1e100 kullanmamız gerekiyor ve python kesinlikle bunu
kaldırabilir

1
@JanDvorak Maksimum Python tamsayıları boyutu yalnızca mevcut belleğin miktarına bağlıdır.
Mego

4
Daha önce uzun bir sayıyı şaşırtmaya çalışırken sınırına ulaştım. Kullandığım makine bir tamsayı taşmasından önce 10 ^ 3000'den büyük sayıları idare edebildi.
Esolanging Fruit,

6

Ruby, 20 bayt

(10**100).times{p 1}

1 ve ardından 1E100 kez yeni satır yazdırır.

1E100 İsteğe bağlı hassas bir tamsayı değil, bir kayan nokta olarak değerlendirildiği gibi çalışmaz.


Parantezleri kaldırabilir misiniz?
OldBunny2800

1
@ OldBunny2800 No. yöntemleri operatörler üzerinde önceliklidir, bu nedenle şu şekilde yorumlanır10**(100.times{p 1})
Level River St

1
Merak edenler için, 1E100.to_ibilgisayarımda 10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104 olarak değerlendirildi.
Andrew Grimm

6

/// , 36 ASCII karakter (4 farklı)

/t./.ttttt//.t/t\..........//t//t...

Çıkışlar .bu 3 * 10 ^ 25 tekrarlar oluşan dizge çıktılar, yani karakter 3 * 10 ^ 125 defa. 100 kez karakterin .

Açıklama:

  1. /t./.ttttt/: Değiştir t.ile .ttttthiçbir örneklerini kadar tekrarlayarak, programın geri kalanı boyunca t.kalır. Bu değiştirir t...ile... 125 ts .
  2. /.t/t\........../: Değiştir .tile t..........hiçbir örneklerini kadar tekrarlayarak, programın geri kalanı boyunca .tkalır. Bu alan ...125 ardından ts ve 125 haline dönüşür t10 ^ 125 olaylar, ardından s ....
  3. /t//: Kalan tümleri ts.
  4. t...: Bu, 3 * 10 ^ 125 .s ile değiştirilir. Onları çıkar.

Şimdi, 10 * 100 tekrarlayan 3 * 10 ^ 25 tekrarlama çıktısı aldatma gibi bir şey. Bu program ., 45 ASCII karakterini kullanarak karakteri tam olarak 10 ^ 100 kez verir:

/T/tttttttttt//.t/t..........//t//.TTTTTTTTTT

Bunun açıklaması:

  1. /T/tttttttttt/: Değiştir Tile ttttttttttprogramın geri kalanı boyunca. Bu TTTTTTTTTT100 tekrarı ile değiştirir t.
  2. /.t/t........../: Değiştir .tile t..........programın geri kalanı boyunca. Bu, .onu 100 tsaniye takip eder ve onu 100'e dönüştürür.t sn ardından 100 ^ olur.. sn alır.
  3. /t//: Kalan tümleri kaldır ts.
  4. .TTTTTTTTTT: Bu 10 ^ 100 ile değiştirilir . s . Onları çıkar.

Son olarak, işte .40 karakter kullanarak 2 * 10 ^ 100 kez karakter çıktısı veren bir uzlaşma programı :

/t./.tttttttttt//.t/t\..........//t//t..

6

Befunge 93, 33 bayt

1>01g0`#@!# _01v
d^.1 **52p10-1g<

Ne yazık ki, Befunge'ın bir güç işlevi yok, bu yüzden bu kodun neredeyse tümü benim bir güç işlevi uygulamamdır. Hala bunun üzerinde çalışıyorum.

Açıklama:

1 > 01g 0` #@!# _ 01g 1- 01p 25** 1. v
d ^                                  <

1: 1Sol üstte başlayın , böylece çoğaldığımızda 0her seferinde anlamıyoruz .

01g: karakteri dASCII kodu 100 olan (0, 1) konumunda olsun .

0`: bakın (0, 1) 'de saklanan değer 0'dan büyük mü; bu değer değişecektir.

#@!# _: !Son adımdan (0 veya 1) elde ettiğimiz değere mantıklı değil , eğer 1 ise, şimdi 0'a sahibiz ve biz #koddaki bir sonraki karakteri atladığın anlamına gelir.

01g 1- 01p: (0, 1) 'te saklanan değeri tekrar alın, 1' i çıkarın ve bu yeni değeri (0, 1) 'e kaydedin.

25**: yığının üst değerini 10 ile çarp

1.: 1bu döngüler her zaman yazdır

1 (teoride) googol zamanları basılır, ancak bu çabucak bunu test ettiğim sayfadan çıkar.

Befunge 93 kodunu burada çalıştırabilirsiniz . Bazı nedenlerden dolayı, yığının en büyük değeri 1.0000000000000006e+100olması gerektiği zamandır 1.0e+100. Bunun nereden 6geldiğini bilmiyorum , ama orada olması gerektiğini ve bunun bir yuvarlama hatası veya bunun gibi bir şey olabileceğini sanmıyorum.


4

ABCR , 56 bayt

++++++++++AAAAAAAAAA7a*A!(x4bBBBBBBBBBB7b+B@(xa(Ax5b(Box

Torna tezgahları eğlencelidir, özellikle kolay çarpma veya üstlere sahip olmadıkları zaman. Öte yandan, sadece üç kuyruktan ikisini kullanmam gerekiyordu!

Açıklama:

++++++++++                                             Set register to 10
          AAAAAAAAAA                                   Queue 10 to queue A 10 times
                    7a*A!(x                            Sum up all of queue A by:
                    7     x                             While the register is truthy:
                     a*                                 Dequeue two elements of A, sum them...
                       A                                ...and queue the result back to A.
                        !(                              If there's only one element left,
                                                        i.e. !(A.len - 1),
                                                        break from the loop.  A now has 100, our exponent.

                             4                        While A's front is truthy:
                              bBBBBBBBBBB              Clone the front of B 10 (our base) times.  (The first iteration fills it up with ten 1s)
                                         7b+B@(x       Sum up all of queue B like we did with A
                                                a(A    Decrement a (so that the loop actually ends. Runs 101 times like it should) x   

                                                       B now contains 10^100 only.

                                                   5b(B x   10^100 times:
                                                       o     print the front of queue A (0)

4

Toplu iş, 574 242 bayt

@echo off
set t=for /l %%a in (2,1,33554432)do call:
set f=for /l %%a in (2,1,9765625)do call:
%t%a
:a
%t%b
:b
%t%c
:c
%t%d
:d
%f%e
:e
%f%f
:f
%f%g
:g
%f%h
:h
%f%i
:i
%f%j
:j
%f%k
:k
%f%l
:l
%f%m
:m
%f%n
:n
echo

Bu nedenle her döngü bir ek yineleme gerçekleştirerek düşmektedir. 32 bit tamsayı sınırı nedeniyle döngüler ~ 2³² ile sınırlıdır. İlk dört döngü her biri 2⁵⁵ olmak üzere toplam 2¹⁰⁰, geri kalan on döngüde 5¹⁰ total olmak üzere toplam 5¹⁰⁰.

Düzenleme: @ ConorO'Brien sayesinde hayal edilemez bir% 58 kaydedildi.



1
@ ConorO'Brien Bekle, yapabilir misin? Asla bilemezdim!
Neil,

4

TI-Basic, 20 bayt

Basit. Bir kerede yalnızca sekiz satır görüntülenir ve önceki satırlar bellekte kalmaz. Çünkü ᴇ100desteklenmeyen, biz gelen döngü gerekir -ᴇ99için 9ᴇ99. Sonra ise I!=0, dizeyi göster (bu arada, bu 3'tür). Bu şekilde, tam olarak yazdırırız ᴇ100.

For(I,-ᴇ99,9ᴇ99:If I:Disp 3:End

"I" değişkeninin 99 basamağı saklayacak kadar kesin olduğundan emin misiniz?
Martin Rosenau

Tamam, evet, "Disp" kullanıyorsanız sadece 14'e kadar gösterebilse de, bunu elde etmek için yeterli olmalıyım, ancak aslında çıktı vermiyoruz, sadece sıfıra eşit olmadığını kontrol edin. Ayrıca, sembol konusunda haklısın, ama ne demek istediğimi anlayacağını düşündüm. Bunu şimdi yazıma kopyalayacağım.
Timtech

Sonsuz tamsayılara sahip bir BASIC sürümüyle hiç karşılaşmadım, ancak bu, döngünüzün neredeyse yeterince zaman çalıştırmadığı için önemli değil.
Loren Pechtel

1
Evet, burada sonsuz tam sayı yok. Tam
sayıların

4

x86-64 makine kodu işlevi, 30 bayt.

@Level River St. C ile aynı özyineleme mantığını kullanır . (Maksimum özyineleme derinliği = 100)

puts(3)Yine de normal çalıştırılabilir dosyalara karşı bağlı olan libc işlevini kullanır . X86-64 System V ABI kullanılarak, yani Linux'tan veya OS X'deki C'den çağrılabilir ve olması gerekmeyen kayıtları engellemez.


objdump -drwC -Mintel çıktı, açıklama ile yorumlandı

0000000000400340 <g>:  ## wrapper function
  400340:       6a 64                   push   0x64
  400342:       5f                      pop    rdi       ; mov edi, 100  in 3 bytes instead of 5
  ; tailcall f by falling into it.

0000000000400343 <f>:  ## the recursive function
  400343:       ff cf                   dec    edi
  400345:       97                      xchg   edi,eax
  400346:       6a 0a                   push   0xa
  400348:       5f                      pop    rdi       ; mov edi, 10
  400349:       0f 8c d1 ff ff ff       jl     400320 <putchar>   # conditional tailcall
; if we don't tailcall, then eax=--n = arg for next recursion depth, and edi = 10 = '\n'

  40034f:       89 f9                   mov    ecx,edi   ; loop count = the ASCII code for newline; saves us one byte


0000000000400351 <f.loop>:
  400351:       50                      push   rax       ; save local state
  400352:       51                      push   rcx
  400353:       97                      xchg   edi,eax   ; arg goes in rdi
  400354:       e8 ea ff ff ff          call   400343 <f>
  400359:       59                      pop    rcx       ; and restore it after recursing
  40035a:       58                      pop    rax
  40035b:       e2 f4                   loop   400351 <f.loop>
  40035d:       c3                      ret    
# the function ends here

000000000040035e <_start>:

0x040035e - 0x0400340 = 30 bytes

# not counted: a caller that passes argc-1 to f() instead of calling g
000000000040035e <_start>:
  40035e:       8b 3c 24                mov    edi,DWORD PTR [rsp]
  400361:       ff cf                   dec    edi
  400363:       e8 db ff ff ff          call   400343 <f>
  400368:       e8 c3 ff ff ff          call   400330 <exit@plt>    # flush I/O buffers, which the _exit system call (eax=60) doesn't do.

İle oluşturulmuş yasm -felf64 -Worphan-labels -gdwarf2 golf-googol.asm && gcc -nostartfiles -o golf-googol golf-googol.o . Orijinal NASM kaynağını gönderebilirim, ancak asm talimatları orada demontajda olduğu için karışıklık gibiydi.

putchar@pltondan 128 bayttan daha az jl, bu nedenle 6 bayt yakınına atlamak yerine 2 bayt kısa atlamayı kullanabilirdim, ancak bu daha büyük bir programın parçası olarak değil, sadece küçük bir çalıştırılabilir dosya için geçerlidir. Bu yüzden, eğer ulaşmak için kısa bir jcc kodlaması kullanmamdan faydalanırsam, libc'nin uygulama koyduğunun büyüklüğünü saymamayı haklı çıkaracağımı sanmıyorum.

Her tekrarlama seviyesi, 24B yığın alanı kullanır (2 basış ve CALL tarafından basılan dönüş adresi). Diğer her derinlik putcharistif 16 ile değil, 8 ile aynı hizada olacak ve böylece ABI'yi ihlal edecek. Xmm kayıtlarını yığına dökmek için hizalanmış depoları kullanan bir stdio uygulaması hata verir. Fakat glibc'ler putcharbunu yapmaz, tam tamponlama ile bir boruya yazma veya satır tamponlama ile bir terminale yazma. Ubuntu 15.10'da test edilmiştir. Bu .loop, özyinelemeli çağrıdan önce yığını 8 ile dengelemek için, kukla bir itme / patlatma ile sabitlenebilir .


Doğru sayıda yeni satır yazdırdığını gösteren kanıt:

   # with a version that uses argc-1  (i.e. the shell's $i)  instead of a fixed 100
$ for i in {0..8}; do echo -n "$i: "; ./golf-googol $(seq $i) |wc -c; done
0: 1
1: 10
2: 100
3: 1000
4: 10000
5: 100000
6: 1000000
7: 10000000
8: 100000000
... output = 10^n newlines every time.

Bunun ilk versiyonum 43B idi ve kullanılmış puts() 9 yeni satırlık bir tamponda (ve 0 bitlik bir sonlandırmada) kullanıldı, bu yüzden puts 10'unu ekleyecekti. Bu özyinelemenin temel durumu C ilhamına daha da yakındı.

10 ^ 100 faktoring farklı bir yolla, arabellek kısaltabilir, belki 4 yeni satıra indirebilir, 5 bayt tasarruf edebilir, ancak putchar kullanmak daha iyidir. Sadece bir tamsayı argümanına ihtiyaç duyar, bir işaretçi değil, hiç tampon içermez. C standardı bir makronun bulunduğu uygulamalara izin verir putc(val, stdout), ancak glibc'de asm'den çağırabileceğiniz gerçek bir fonksiyon olarak mevcuttur.

Çağrı başına 10 yerine sadece bir yeni satır yazdırmak, 10 yeni satırın başka bir faktörünü elde etmek için özyineleme derinliğini 1 arttırmamız gerektiği anlamına gelir. 99 ve 100'ün ikisi de 8-bitlik bir işaret genişletilmiş işaretiyle gösterilebildiğinden beri push 100, hala sadece 2 bayttır.

Daha da iyisi, 10bir kayıt defterine sahip olmak hem yeni bir satır hem de bir döngü sayacı olarak çalışarak bir bayt tasarrufu sağlar.

Bayt tasarrufu için fikirler

32 bitlik bir sürüm, bayt için tasarruf sağlayabilir dec edi, ancak yığın çağrısı çağırma kuralı (putchar gibi kütüphane işlevleri için), kuyruk çağrısı işini daha az kolay yapar ve muhtemelen daha fazla yerde daha fazla bayt gerektirir. Özel için register-arg kuralını kullanabildim f(), sadece çağırdım g(), ama sonra kuyruk çağrısı yapamadım (çünkü f () ve putchar () farklı sayıda yığın arşivi alacaktır).

Arayana kaydetme / geri yükleme yapmak yerine f () işlevinin arayanın durumunu koruması mümkün olacaktır. Bu muhtemelen berbattır, çünkü muhtemelen dalın her iki tarafına ayrı ayrı girmesi gerekir ve kuyruk çağırma ile uyumlu değildir. Denedim ama tasarruf bulamadım.

Bir döngü sayacını yığında tutmak (döngüdeki push / popping rcx yerine) da yardımcı olmadı. Kullanılan sürümü ile 1B daha kötüydü ve rcx'i daha ucuza ayarlayan bu sürümde muhtemelen daha da büyük bir kayıp meydana geldi.


2
Montaj cevapları için yaşasın! :)

4

PHP, 44 bayt

for($i=bcpow(10,1e2);$i=bcsub($i,print 1););

Bu pasajı 1googol süreleri çıkarır. Belleği tükenmeyecek, ancak çok yavaş. Uzun tamsayıları işlemek için BCMath kullanıyorum.

Biraz daha iyi performans gösteren ancak küçük olmayan (74 byte):

for($m=bcpow(10,100);$m;$m=bcsub($m,$a))echo str_repeat(a,$a=min(4e9,$m));

aGoogol harfinin zamanını verir. Bir seferde yaklaşık 4e9 karakter çıkaran neredeyse 4GB bellek tüketecek.


Eğer sadece bir 'a' neredeyse 4GB alıyorsa, 'aaa' ne yapmalı? Daha fazla kod alacaktır, ancak ob_flush (); çok daha ileri gidebilirsin
Martijn

Uhm, bir değil a, 4 * 10 ^ 9 as'lik bir ip . Oraya 3 kat daha fazla koyacağınız zaman 4GB üzerinden geçemezsiniz a. Ob_flush'ın bununla hiçbir ilgisi yok, ikinci örneğin amacı, her seferinde az miktarda karakter çıktısı almak yerine, büyük dizgelerin tek seferde çıkmasıdır; bu, programın daha fazla bellek kullanımı pahasına, biraz daha hızlı çalışmasına neden olur.
chocochaos

Bildiğim kadarıyla "> =" büyük tamsayılarla başa çıkamıyor, bccomp kullanmalısınız
Crypto

Haklısın, dizeleri karşılaştırırken doğru sonuçlar vermiyor. Bir dakika içinde tamir edeceğim.
chocochaos

Biraz farklı ama çalışma çözümüyle
düzenleyin

3

Haskell, 45 43 bayt

r 0=[]
r i='1':r(i-1)
main=putStr.r$10^100

3

Pyke, 6 5 bayt

TTX^V

Burada dene!

Tarayıcımı çöktüğünde denenmedi. İlk 4 karakter 10 ^ 100 üretiyor ve Vbirçok yeni satırın çıktısını alıyor. İle test et 100V.


3

Raket 36 bayt

(for((i(expt 10 100)))(display "1"))

Çıktı:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111...

3

JAISBaL , 4 bayt

˖Q

Chrome tüm sembolleri okuyamıyor ve diğer tarayıcılardan emin değilim, işte bir resim:

Açıklama:

# \# enable verbose parsing #\
10^100       \# [0] push 10^100 onto the stack #\
for          \# [1] start for loop #\
    space    \# [2] print a space #\

Oldukça basit .... sadece bir googol alanı yazdırır. Üç komut, ancak googol sabiti iki bayttır.

(3.0.5 sürümünde yazıldı)


Bu 6 UTF-8 bayttır. Hangi kodlamayı kullanıyorsunuz?
Conor O'Brien,

"bayt" bağlantısı var ...
Socratic Phoenix

Gah, özür dilerim. Bağlantıların normal metin gibi görünmesini sağlayan bir kullanıcı kimliğim var.
Conor O'Brien,

Oh, bunun mümkün olduğunu bilmiyordum, tamam :)
Sokratik Phoenix

@ ConorO'Brien umm, neden?
Cyoce

3

JavaScript ES6, 85 83 bayt

ETHproductions sayesinde 2 bayt kurtarıldı!

eval([...Array(i=100)].map(_=>`for($${--i}=0;$${i}++<10;)`).join``+"console.log()")

Bu 1e100 yeni satır yazdırır.

İç kısım, daha sonra değerlendirilecek olan bu programı oluşturur.

for($0=0;$0++<10;)for($1=0;$1++<10;)for($2=0;$2++<10;)for($3=0;$3++<10;)for($4=0;$4++<10;)for($5=0;$5++<10;)for($6=0;$6++<10;)for($7=0;$7++<10;)for($8=0;$8++<10;)for($9=0;$9++<10;)for($10=0;$10++<10;)for($11=0;$11++<10;)for($12=0;$12++<10;)for($13=0;$13++<10;)for($14=0;$14++<10;)for($15=0;$15++<10;)for($16=0;$16++<10;)for($17=0;$17++<10;)for($18=0;$18++<10;)for($19=0;$19++<10;)for($20=0;$20++<10;)for($21=0;$21++<10;)for($22=0;$22++<10;)for($23=0;$23++<10;)for($24=0;$24++<10;)for($25=0;$25++<10;)for($26=0;$26++<10;)for($27=0;$27++<10;)for($28=0;$28++<10;)for($29=0;$29++<10;)for($30=0;$30++<10;)for($31=0;$31++<10;)for($32=0;$32++<10;)for($33=0;$33++<10;)for($34=0;$34++<10;)for($35=0;$35++<10;)for($36=0;$36++<10;)for($37=0;$37++<10;)for($38=0;$38++<10;)for($39=0;$39++<10;)for($40=0;$40++<10;)for($41=0;$41++<10;)for($42=0;$42++<10;)for($43=0;$43++<10;)for($44=0;$44++<10;)for($45=0;$45++<10;)for($46=0;$46++<10;)for($47=0;$47++<10;)for($48=0;$48++<10;)for($49=0;$49++<10;)for($50=0;$50++<10;)for($51=0;$51++<10;)for($52=0;$52++<10;)for($53=0;$53++<10;)for($54=0;$54++<10;)for($55=0;$55++<10;)for($56=0;$56++<10;)for($57=0;$57++<10;)for($58=0;$58++<10;)for($59=0;$59++<10;)for($60=0;$60++<10;)for($61=0;$61++<10;)for($62=0;$62++<10;)for($63=0;$63++<10;)for($64=0;$64++<10;)for($65=0;$65++<10;)for($66=0;$66++<10;)for($67=0;$67++<10;)for($68=0;$68++<10;)for($69=0;$69++<10;)for($70=0;$70++<10;)for($71=0;$71++<10;)for($72=0;$72++<10;)for($73=0;$73++<10;)for($74=0;$74++<10;)for($75=0;$75++<10;)for($76=0;$76++<10;)for($77=0;$77++<10;)for($78=0;$78++<10;)for($79=0;$79++<10;)for($80=0;$80++<10;)for($81=0;$81++<10;)for($82=0;$82++<10;)for($83=0;$83++<10;)for($84=0;$84++<10;)for($85=0;$85++<10;)for($86=0;$86++<10;)for($87=0;$87++<10;)for($88=0;$88++<10;)for($89=0;$89++<10;)for($90=0;$90++<10;)for($91=0;$91++<10;)for($92=0;$92++<10;)for($93=0;$93++<10;)for($94=0;$94++<10;)for($95=0;$95++<10;)for($96=0;$96++<10;)for($97=0;$97++<10;)for($98=0;$98++<10;)for($99=0;$99++<10;)console.log()

Şimdi, bir doğruluk kanıtı için, bazı indüksiyon kullanacağız. En genel olarak, diğer değerler için, ilk 100 yerine olsun , N . I sokulması iddia K 10 verecek N yeni satırlar. Bunun sonucunu wc -lgirelim. Girdide yeni satır sayısını sayalım . N girişini alan bu değiştirilmiş ancak eşdeğer komut dosyasını kullanacağız :

eval([...Array(+process.argv[2])].map(_=>`for($${i}=0;$${i++}++<10;)`,i=0).join``+"console.log()")

Şimdi, işte bazı çıktı:

C:\Users\Conor O'Brien\Documents\Programming
λ node googol.es6 1 | wc -l
10

C:\Users\Conor O'Brien\Documents\Programming
λ node googol.es6 2 | wc -l
100

C:\Users\Conor O'Brien\Documents\Programming
λ node googol.es6 3 | wc -l
1000

C:\Users\Conor O'Brien\Documents\Programming
λ node googol.es6 4 | wc -l
10000

Bunun N girişini küçük değerler için 10 N yeni satıra dönüştürdüğünü görebiliriz .

N = 1 için örnek çıktı :

C:\Users\Conor O'Brien\Documents\Programming
λ node googol.es6 1











C:\Users\Conor O'Brien\Documents\Programming
λ

Güzel. Birkaç eval([...Array(i=100)].map(_=>`for($${--i}=0;$${i}++<10;)`).join``+"console.log()")
byte'ınızı

@ETHproductions teşekkürler! : D
Conor O'Brien

PS 83 bayt sayar;)
ETHproductions

Burada başka bir örnek . Başkası için faydalı olup olmadığından emin değilim, ancak bunun nasıl çalıştığından ve değerlendirme işlevinin oynaması için bir sarmalayıcı işlevi yazdığından emin değildim. 10 ^ n'a kadar olan programı net bir şekilde görebilirsiniz; burada n, değerlendirilen döngü sayısıdır. Bir iade koşulu belirledim, bu yüzden googolden önce iyi kırılıyor; farklı döngü seviyelerini saymak için bu durumda kullanılan değişkeni değiştirin. Ayrıca, bir nitpick: ikinci kod numaranız dış döngüyü $ 0 olarak gösterir, $ 99'a düşer; 99 $ dış döngü olan, ters çevrilmelidir.
MichaelS

@MichaelS doğru. Bunu bir sonraki şansımda değiştireceğim.
Conor O'Brien

3

Mathematica, 48 30 25 bayt

For[n=1,n++<Echo@1*^100,]

Çıktı:

>> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
etc.

Şu anda test edemiyorum, peki ya For[n=0,n++<10^100,Echo[]]?
Martin Ender

>>Çıktının başını düşünürdüm . EchoKonsolda kullanırsanız basılırlar .
Martin Ender

@MartinEnder Whoops, sabit
LegionMammal978

Echo@0&~Array~10^100;21 bayt nasıl ?
Greg Martin

3

Fortran 95, Serbest Biçimli, Özyinelemeli, 117 bayt

Program M
Call R(99)
END
Recursive Subroutine R(L)
IF(L)3,1,1
1 DO 2 I=1,10
2 Call R(L-1)
RETURN
3 PRINT*,0
END

İçerdiği satırlardan oluşan bir googol yazdırır

          0

Fortran 90, özyinelemeli, 149 bayt

     CallR(99)
     END
     RecursiveSubroutineR(L)
     IF(L)3,1,1
   1 DO2I=1,10
   2 CallR(L-1)
     RETURN
   3 PRINT*,0
     END     

Tekrarlayan bir şekilde 100 iç içe döngüyü aramak, her 10 yineleme, tam olarak bir googol yapar. N, L ve döngü sayaçlarının tümü bayt boyutlu tam sayılara uyar.

99, 1, 2, 3, 4, 5 ile değiştirilerek test edildi ve her durumda "wc" den elde edilen satır sayısının n + 1 sıfır olduğuna dikkat edildi.

Fortran II, IV, 66 veya 77, 231 bayt:

      N=2*10**9
      DO1I0=1,5**10
      DO1I=1,N
      DO1J=1,N
      DO1K=1,N
      DO1L=1,N
      DO1M=1,N
      DO1I1=1,N
      DO1J1=1,N
      DO1K1=1,N
      DO1L1=1,N
      DO1M1=1,N
1     PRINT2
2     FORMAT(X)
      END

Newlines bir googol yazdırır.

Bu programların tümü 32 bit makinelerde çalışacak; Aslında, özyinelemeli sürümleri bir 16-bit makinede sadece iyi çalışacak. Biri kaba kuvvet sürümünde, 60 bit tamsayıları olan eski bir Cray üzerinde çalıştırarak daha az döngü kullanabilirdi. Burada, 5 ^ 10 (9765625) bir döngü içindeki 2 * 10 ^ 9 iç içe döngüler, 10 ^ 100 toplam yinelemeye eşittir.

Sürümlerin hiçbiri, nesne kodunun kendisinden, sayaçlardan, çıkış dizesinin bir kopyasından ve özyinelemeli sürümde, 100 düzeyli bir iade yığından başka bir şey kullanmak için herhangi bir bellek kullanmaz.

Karşılaştırarak faktörleri kontrol edin

bc<<<2000000000\^10*5\^10
bc<<<10\^100

3

Turing makinesi simülatörü, 1082 bayt

0 * 6 r 1
1 * E r 2
2 * C r 3
3 * 1 r 4
4 * B r 5
5 * C r 6
6 * F r 7
7 * 4 r 8
8 * 6 r 9
9 * 8 r A
A * 8 r B
B * 3 r C
C * 0 r D
D * 9 r E
E * G r F
F * H r G
G * 8 r H
H * 0 r I
I * 6 r J
J * H r K
K * 9 r L
L * 3 r M
M * 2 r N
N * A r O
O * D r P
P * C r Q
Q * C r R
R * 4 r S
S * 4 r T
T * E r U
U * E r V
V * G r W
W * 6 r X
X * D r Y
Y * E r Z
Z * 0 r a
a * F r b
b * E r c
c * 9 r d
d * F r e
e * A r f
f * H r g
g * D r h
h * E r i
i * 6 r j
j * 6 r k
k * D r l
l * G r m
m * H r n
n * 1 r o
o * 0 r p
p * 8 r q
q * C r r
r * 9 r s
s * G r t
t * 3 r u
u * 6 r v
v * 2 r w
w * 3 r x
x * E r y
y * 0 r z
z * 4 r +
+ * 5 r /
/ * A r =
= * 0 r -
- * H r \
\ * 7 r !
! * A r @
@ * 9 r #
# * 5 r $
$ * A r %
% * B r ^
^ * 5 r &
& * 9 r ?
? * 4 r (
( * C r )
) * E r `
` * 9 r ~
~ * 9 r _
_ * A * .
. 0 I l *
. 1 0 r <
. 2 1 r <
. 3 2 r <
. 4 3 r <
. 5 4 r <
. 6 5 r <
. 7 6 r <
. 8 7 r <
. 9 8 r <
. A 9 r <
. B A r <
. C B r <
. D C r <
. E D r <
. F E r <
. G F r <
. H G r <
. I H r <
. _ * r ]
< _ * r >
< * * r *
> _ = l [
> * * r *
[ _ * l .
[ * * l *
] _ * * halt
] * _ r *

Turing makine simülatörü

Bunun doğru çıktı olarak sayılıp sayılmadığını bilmiyorum, çünkü 82 satır aralığı var.

Bunun 4 GB sınırına uyup uymadığını bilmiyorum, bu yüzden eğer yapmazsa, rekabet dışı ve sadece vitrin için geçerli. Çıktı 1e100 bayttır, bu nedenle hafıza byte sayısından düşülmelidir. Son bayt sayısı 82 bayttır.

İşte bir açıklama:

Kod ilk 80 satır ana-19 üretir 80 farklı durumları olan 1 döngü sayısı 6EC1BCF4688309GH806H932ADCC44EEG6DE0FE9FAHDE66DGH108C9G3623E045A0H7A95AB594CE99A.

Sonraki 19 kod satırı, her karakter basıldığında sayıyı azaltan sayaç durumudur.

Sonraki 6 satır, eklenmiş olan yazıcı durumudur =.

Son olarak, son 2 satır, yalnızca çıktının olduğundan emin olmak için gereken daha temiz durumdur =====...=====. Önde gelen / sondaki boşluklar kaçınılmaz yan etkiler olduğu için çıktı olarak sayılmaz.

Ardından program durur.

1 Bunun için matematiği yaptım.


2

Pyth, 7 Bayt

Yeni (Rekabetçi)

V^T*TTG

açıklama

G=The alphabet
Repeat 10^(10*10) times
    print(G)

Eski (Rekabet Etmeyen) 7 Bayt

*G^T*TT

açıklama

G=The alphabet
G*(10^(10*10))==G*10^100

1
Bu, 4 GiB hatırlatma sınırına uymuyor.
Dennis,

@Dennis Düzeltdim
Dignissimus - Spammy 20

Golf tavsiyesi değil, ama *TTovadan daha kısa olduğunu sanmıyorum 100.
Outgolfer Erik

2

Python 3, 32 bayt

for i in range(10**100):print()

Alternatif çözüm, 33 bayt:

[print()for i in range(10**100)]

Python 2'de bu özellikle harika bir cevap.

1
Çok değil, @Lembik. Python 2'de, range(10**100)numaralarının listesini oluşturur [1, 2, 3, 4, ...]sonuçlanır OverflowError: range() result has too many items. Bu, Python 2'de xrange()bunun yerine bir çağrı ile çalışacak ve xrange()yeniden adlandırıldığından beri Python 3'te çalışacak range()ve range()bir liste oluşturan orijinal kullanımdan kaldırılacaktı.
James Murphy,

2
@JamesMurphyb Evet bunu biliyorum. Codegolf cevaplarının dayanılmazlığı konusunda komik olmaya çalışıyordum.

1
Üzgünüm. SE yorumlarında mizahı okumakta zorlanıyorum.
James Murphy,

2

Java, 198 179 155 bayt

import java.math.*;class a{void A(a[]x){for(BigInteger b=BigInteger.ZERO;!(b=b.add(BigInteger.ONE)).equals(BigInteger.TEN.pow(100));)System.out.print(x);}}

Baskılar ( x== null? null: İle başlayan bir dize [La;@veya böyle bir şey) 10 100 kez O (sonsuza) zamanı.


3
Bir class, ama public static void main(String[]a)yöntem yok . Golf ipuçları gelince: Eğer yerini alabilir new BigInteger("0"), new BigInteger("1")ve new BigInteger("10")ile BigInteger.ZERO, BigInteger.ONEve BigInteger.TEN; import java.math.BigInteger;ile değiştirebilirsiniz import java.math.*;.
Kevin Cruijssen

1
İthalata gerek yok: buna benzer bir şey olmalı:java.math.BigInteger b=null;for(b=b.ZERO;!(b=b.add(b.ONE)).equals(b.TEN.pow(100);)System.out.print(x);
Olivier Grégoire

@ OlivierGrégoire Bu bana bir NullReferenceException verir, çünkü muhtemelen bnull.
Xanderhall

@Xanderhall muhtemelen bunu C # 'da denediniz (çünkü NRE dedin, NPE değil). Java sürümünü şu anda test edemiyorum bu yüzden neyin yanlış olduğunu söyleyemem. Her durumda, "çalışmalı" dedim, "işe yaramaz" değil. Alınacak fikir, örnek referanslar üzerinde boş yöntemlerle bile statik yöntem çağrıları yapabileceğinizdir.
Olivier Grégoire

@ OlivierGrégoire Java ile denedim. Ben C # kodlamıyorum.
Xanderhall

2

Java, 153 bayt

import java.math.*;interface M{static void main(String[]a){for(BigInteger i=BigInteger.ZERO;!i.add(i.ONE).equals(i.TEN.pow(100));)System.out.print(1);}}

Çıkış: 1e100 1s

Ben de oldukça yakın olan başka bir Java cevabı olduğunu biliyorum. Benimki bir ana var ve yine de daha kısa.

Bu benim ilk kod-golf girişim. İpuçları takdir edildi.


Bu lambda kullanarak 117 bayta kadar golf yapılabilir. Bununla birlikte, yine de içe aktarmayı eklemeniz gerekir. import java.math.*;()->{for(BigInteger i=BigInteger.ZERO;!i.add(i.ONE).equals(i.TEN.pow(100));)System.out.print(1);};
Shaun Wild

@BasicallyAlanTuring Aslında benim derlememe javacizin vermeyeceğim.
Niclas M

Java’nı daha sonra güncelleyin. Ayrıca, bu tamamlanmış derlenebilir kod değildir. Bir giriş için sadece minimum izin verilir.
Shaun Wild

@BasicallyAlanTuring Java 8 aldım. Sanırım OP tarafından fonksiyonlara izin verilmiyor.
Niclas M

Sana verdiğim kod tam bir program değil. Sadece geçerli bir CG cevabı olması gereken şey.
Shaun Wild

2

Pyth, 8 7 bayt

V^T100G

bağlantı

Çözüm küçük çıktılarla test edildi ancak yazdırılmalı abcdefghijklmnopqrstuvwxyz ila 100 kez .

Nedense, p31343 (Maltysen) dediği gibi, gereksiz oldu .


P neden gerekli?
Maltysen

@Maltysen 4 GB sınırı nedeniyle düşünüyorum.
Outgolfer Erik,

Neden? Tamponun kuzesi? Bu otomatik olarak akmıyor mu?
Maltysen

@Maltysen Bilmiyorum, çevrimiçi tercüman hemen çıkış işlevine sahip değil.
Yıkanabilir

Yerel olmadan çalışanp
Maltysen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.