Büyük büyük sayılar


25

Cevaplarımın birçoğunu golf oynamaya çalışırken, mümkün olduğu kadar az karakterle büyük tamsayılar yazmam gerekiyordu.

Şimdi bunu yapmanın en iyi yolunu biliyorum: Bu programı yazmanıza başlamanızı sağlayacağım .

Meydan okuma

  • Olumlu bir tamsayı verildiğinde, onu stdout'a veya eşdeğerine basan bir program çıktısı veren bir program yazın.
  • Çıktı programlarının yaratıcınızla aynı dilde olması gerekmez.
  • Çıktı en fazla 128 bayt olmalıdır.
  • Stdin veya dengi bir giriş kabul edebilirsiniz (fonksiyon girişi değil)
  • Elde edilen programı stdout veya eşdeğeri olarak verebilirsiniz.
  • Sayı çıkışı ondalık basamakta olmalıdır (temel 10)

puanlama

Puanınız, programınızın kodlayamadığı en küçük pozitif tamsayıya eşittir.

En yüksek puana sahip olan giriş kazanır.


Metagolf etiketini ekledim, çünkü çıktı programında golf oynuyoruz.
orlp

1
@orlp Aslında bunu bilerek ihmal ettim, çünkü metagolf "puanın çıktınızın uzunluğu olduğunu" söyleyen bir puanlama ölçütü etiketi. Buna rağmen ters puanlamaya izin vermek için bir meta yazı eklemeyi de düşünüyorum (örneğin bu en hızlı kod için geçerlidir).
Martin Ender

1
@ MartinBüttner Meta-kısıtlı-kaynağa ihtiyacımız var :)
orlp

2
Buradaki zorluk, "hangi dilin en büyük tamsayı aralığına sahip olduğu" dan farklı ?
nwp

5
@ nwp Sanırım soruyu yanlış anladınız. Soru sıkıştırma ile ilgilidir. Büyük bir tamsayı aralığına sahip bir dili kullanmak faydalı olabilir, ancak gerekli değildir.
patates

Yanıtlar:


2

Python 3 → CJam, (163 122 - 1) · 255/162 + 1, 1.213 · 10 270

import sys
n = int(input())
for b in range(163, 1, -1):
    s = []
    m = n
    while m:
        m, r = divmod(m - 93, b)
        if m < 0:
            break
        s.append(r + 93)
    else:
        sys.stdout.buffer.write(b'"%s"%db' % (bytes(s[::-1]), b))
        break
else:
    sys.stdout.buffer.write(b'%d' % n)

1023'ten (163 122 - 1) · 255 / 162'ye kadar olan her tamsayı, en az bir şekilde bir taban b 93 163 dönüşümü ile 93 ila b + 92 kodlu en fazla 122 karakterli bir dizgeden temsil edilebilir. normal 0 - b - 1 yerine . Bu, fazladan bir çıkış kodu olmadan 34 (çift tırnak) ve 92 (ters eğik çizgi) sıkıntılı karakterlerinden kaçınır.


12

Pyth, 252 111 ≈ 3.593 × 10 266

Js[
"ixL-rC1`H``N"
N
s@L-rC1`H``NjQ252
N
"252")$import sys$$sys.stdout.buffer.write(J.encode('iso-8859-1'))$

Biraz Python sözdizimi kullanmak zorunda kaldım, çünkü Pyth printyazdıramıyor iso-8859-1.

Rakam 252 bazında kodlanır ve bu bazdaki her basamağı bir iso-8859-1 karakteri olarak temsil eder. Karakterler \ve "kaçmaya ihtiyaç duyarlar ve bu nedenle kullanılmazlar. Char `kullanılmıyor çünkü golf oynuyor ... Ve ayrıca boş bayt da kullanılmıyor, Pyth derleyicisi yasaklıyor.

Çıktı, 17 baytlık bir yükü olan bir programdır:

ixL-rC1`H``N""252

İşte mümkün olan en fazla sayıda örnek kullanım:

kullanım

açıklama

çıkış programının.

ixL-rC1`H``N""252
    rC1`H          create the range of chars: ['\x01', '\x02', ..., '{}']
         ``N       creates a string containing the 3 chars " ' \
   -               remove strings which consists of these 3 chars
 xL         ""     determine the index of each char in "" (encoded number)
i             252  convert from base 253 to base 10

1
12Pyth ne yazık ki CR'yi LF olarak okuduğu için bu program şifrelemiyor .
Anders Kaseorg,

10

CJam, 254 109 , 1.34 x 10 262

q~254b{_33>+_91>+c}%`"{_'[>-_'!>-}%254b"

Sayı 254'teki sayıyı kodluyorum ve bu tabandaki her basamağı, atlama "ve ve , ISO 8859-1 karakteri olarak temsil ediyorum \. Çıktıda 19 baytlık bir yük vardır ""{_'[>-_'!>-}%254b, bu yüzden her şeyi 254 128-19'dan küçük veya açıkça temsil edebilirim

13392914970384089616967895168962602841770234460440231501234736723328784159136966979592516521814270581662903357791625539571324435618053333498444654631269141250284088221909534717492397543057152353603090337012149759082408143603558512232742912453092885969482645766144

Örnek olarak, 6153501olarak kodlanmış

"abc"{_'[>-_'!>-}%254b

İşte kodlanmış tamsayıyı basan ve daha sonra uzunluğunu basan ve ardından geçerliliğini göstermek için hemen yürüten bir test programı (bu, yazdırılamayan karakterleri her zaman işe yaramayan yeni bir programa kopyalamak zorunda kalmaz) çevrimiçi tercüman ile).


8

Perl, 10 216

print"print unpack'h*',q{",(pack'h*',<>),"}"

Ayrıca biraz daha zarif, 100 kodlama taban. Çıktı 12345678şöyle olurdu:

print unpack'h*',q{!Ce‡}

Silgiler {ve sırasıyla }hex değerlerine karşılık gelir b7ve d7bunlar girdide görünmeyen ve bu nedenle kaçmalarına gerek yoktur.

20 bayt tepegöz vardır, kodlama için 108, maksimum 10 216 -1 değerine ulaşırlar .


Perl, 10 206

print"ord=~print\$' for'",(map chr"1$_",<>=~/.{1,2}/g),"'=~/.|/g"

Basit taban 100 kodlaması. Bunun için çıktı 12345678şöyle görünür:

ord=~print$' for'p†œ²'=~/.|/g

En fazla 10 206 -1 değerine ulaşan, kodlama için 103'ü bırakarak 25 bayırlık ek yükü vardır .


6

Common Lisp, 36 114 - 1 ~ 2.62 × 10 117

(lambda(x)(format t"(lambda()#36r~36r)"x))

En büyük sayı:

2621109035105672045109358354048170185329363187071886946329003212335230440027818091139599929524823562064749950789402494298276879873503833622348138409040138018400021944463278473215

Sadece 36 tabanını kullanın. En büyük girdi için 128 bayt uzun çıktı:

(lambda()#36rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)

1

CJam, 233 114 , 7.561, 10 269

ri233b{Kms/m]_34=+c}%s`"{iKms*}%233b"

Çıkış programı "…"{iKms*}%233b, bir dizgenin 8 bit karakterlerini n ↦ ⌊ n ile 233 hane baz alır. ⌊ ⋅ sin 20⌋ = ⌊ n ⋅ 0.913 dayandırır. Bu dönüşüm, girdi olarak kritik kod noktaları 34 (çift alıntı) ve 92 (ters eğik çizgi) gerektirmeden hassas olur.

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.