Yazdırılabilir ASCII ile İlgili Üretken Mükemmel Pangram Programları


23

Güncellemeler: Zaman sınırı kaldırıldı. Çıktıyı tanımlayabilmeniz gerekir - yeni kurala bakın.

Bir pangram alfabedeki her harfi en az bir kere kullanan bir cümledir, örneğin:

Hızlı kahverengi tilki tembel köpeğin üstünden atlar.

Bir mükemmel pangram tam olarak bir kez her harfi kullanır.

Yazdırılabilir 95 ASCII karakterini (onaltılık kodlar 20 ila 7E) alfabetik harf kullanarak kullanarak mükemmel bir pangram olan bir program yazmayı düşünün :

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Böyle bir program, her yazdırılabilir ASCII karakterinin tam olarak bir kez, ancak herhangi bir sırada gerçekleşmesi durumunda, tam olarak 95 karakter içermelidir. (Böylece 95! = 1.03 × 10 148 olasılık vardır.)

Göreviniz bu programı stdout'a yazdırılabilir yazdırılabilir ASCII karakterlerinin sayısı mümkün olduğu kadar yüksek olacak şekilde yazmaktır (yani üretken).

Puanınız, programınızın çıkardığı yazdırılabilir ASCII karakterlerinin sayısıdır ( toplam tutar, farklı miktar değil : AABCpuanlar 4 iken ABCpuanlar 3) . En yüksek puan kazanır.

ayrıntılar

  • Çıktı herhangi bir karakter (kopyalar dahil) içerebilir, ancak yalnızca yazdırılabilir ASCII karakterlerinin örnekleri, puanınıza göre sayılır.
  • Dilinizde stdout yoksa en uygun alternatifi kullanın.
  • Programın ...
    • Sonlu çalışma zamanına sahip olmalı (zaman sınırı kaldırıldı)
    • sonlu çıkışa sahip olmalı
    • yorum içerebilir
    • derlenmeli ve hatasız olarak çalıştırılmalıdır
    • bilgi istememeli veya giriş gerektirmemeli
    • zamanla değişmez ve deterministik olmalı
    • harici kütüphaneleri kullanmamalı
    • ağ bağlantısı gerektirmemelidir
    • harici dosyaları kullanmamalı
      • (dosya adını değiştirmek programın davranışını değiştirmediği sürece programın kendisini kullanabilirsiniz)
  • Bu görev mümkün değilse, sadece çok kötü olan bir dildir.
  • Tam çıktınızı vermelisiniz veya bir gönderiye sığmayacak kadar büyükse kesin olarak tanımlamanız gerekir . Aslında programınızı çalıştırmak zorunda değilsiniz. Sürece olarak olur bir bellek sınırsız miktarda bir bilgisayarda bir zaman sonlu miktarda çalıştırmak o geçerlidir.

Örnek

Bu basit Python 2 programı olası bir çözümdür:

print 9876543210#!"$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjklmoqsuvwxyz{|}~

9876543210Yazdırılabilir 10 ASCII karakteri içeren ve böylece 10 puan alan çıktılar .


14
Aliterasyon göründüğü kadar şaşırtıcı derecede hayranlık uyandıran pangramlar sadece oldukça sinir bozucu oldukları için güçlü bir yumruk atıyorlar.
Geobits

2
Ben de tamamen farklı olmayan kuralı yeniden okudum. Bunun üzerine daha önce göz gezdirmiştim, açık bir şekilde toplamı olmayan bir kural olduğu sonucuna vardı; çünkü alternatif, mektubu aaltı katrilyon kez basmak gibi saçma bir konstrüksiyona yol açacaktı; karakter sayımı. Her neyse, 95 yaşımla hala gurur duyuyorum, küçük olsa bile. Boyut her şey değildir, biliyorsun.
COTO

Neden bu görevin HQ9 + 'da imkansız olduğunu düşünüyorsunuz?
Peter Taylor

Bunu FORTRAN'da yapmaya çalışacağım (böylece küçük harf duyarsızlığından faydalanabilirim). --- ve onu çiz. O harfine 4 kez: program bildirimi için 2 kez ve döngü bildirimi için 2 kez ihtiyacım var.
Nzall

1
@Dennis No. 5more
Calvin'in Hobileri

Yanıtlar:


12

GolfScript, 2 ↑↑↑ (9871 ↑↑ 2) karakter üzerinde

2 9871.?,{;0$[45)63]n+*~}/
#!"%&'(-:<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ\^_`abcdefghijklmopqrstuvwxyz|

Bir tamsayı yazdırır. Sınırsız CPU kayıt büyüklüğünden (Ruby'de maksimum string uzunluğunu belirleyen), bellekten ve çalışma süresinden yararlanın. Kazık sadece okunabilirlik içindir.

Kod

2             # Push 2.
9871.?        # Push b := 9871↑↑2 = 9871↑9871 = 9871**9871.
,{            # For each i from 0 to b - 1:
  ;0$         #   Discard i and duplicate the integer on the stack.
  [45)63]n+*  #   Replicate ".?\n" that many times.
  ~           #   Evaluate.
 }/           #

Puan

B = 9871 ↑↑ 2 tanımlayın (bkz. Knuth'un yukarı ok gösterimi ).

  • .? f: x ↦ x ↑ x komutunu çalıştırır .

  • İç blok g: x ↦ f x (x) yürütür .

    Yana f (x) = ↑ x = x ↑↑ 2 , f 2 (x) = (x ↑ x) ↑ (x ↑ x)> x ↑ X ↑ x = x ↑↑ 3 ,
    f 3 (x) = ((x ↑ x) ↑ (x ↑ x)) ↑ ((x ↑ x) ↑ (x ↑ x))> (x ↑ x ↑ x) ↑ (x ↑ x ↑ x)> x ↑ x ↑ x ↑ x = x ↑↑ 4 ve benzeri,
    g (x)> x ↑↑ (x + 1)> x ↑↑ x var .

  • Dış blok h: x ↦ g b (x) yürütür .

    Yana g (x) = x ↑↑ x = x ↑↑↑ 2 , g 2 (x) = (x ↑↑ x) ↑↑ (x ↑↑ x)> x ↑↑ X ↑↑ x = x ↑↑↑ 3 ,
    g 3 (x) = ((x ↑↑ x) ↑↑ (x ↑↑ x)) ↑↑ ((x ↑↑ x) ↑↑ (x ↑↑ x))> (x ↑↑ x ↑↑ x) ↑ (x ↑↑ x ↑↑ x)> x ↑↑ x ↑↑ x ↑↑ x = x ↑↑↑ 4 ve bunun gibi, h (x)> x ↑↑↑ (b + 1) değerine sahibiz .

  • Yığındaki 2 tamsayısıyla başlıyoruz , böylece kod h (2)> 2 ↑↑↑ (b + 1) değerini hesaplar .

  • Skor ondalık hane sayısı h (2) olup, Log (H (2)) + 1> log (2 ↑↑↑ (B + 1))> 2 ↑↑↑ b .

Böylece, skor 2 ↑↑↑'dan (9871 ↑↑ 2) büyüktür .

2 ↑↑↑ n olarak saçma bir tempoda büyür n daha büyük oluyor. 2 ↑↑↑ 4: = 2 ↑↑ 2 ↑↑ 2 ↑↑ 2 = 2 ↑↑ 2 ↑↑ 4 = 2 ↑↑ 65536 bir sağ birleştirici güç kulesi, 65536 kopyaları 2 :

                                                                2 ↑↑↑ 4                                                                 

Benzer şekilde, 2 ↑↑↑ 5: = 2 ↑↑ (2 ↑↑↑ 4) , ki bu 2 ↑↑↑4 kopya 2 adet güç kulesidir .

Şimdi, skor değil 2 ↑↑↑ 4 veya 2 ↑↑↑ 5 , daha büyük daha var 2 ↑↑↑ b , b> 2 × 10 39 428 . Bu büyük bir sayı ...


@DigitalTrauma - Madeni kontrol etmelisiniz;)
Doktor

@Dennis - Kabaca ne kadar?
Doktor,

@Optimizer Beni anladım ;-)
Digital Trauma

Müthiş! Bana Graham'ın numarasını hatırlatıyor ... Bu büyük!
yeniden yazıldı

3
Bunun teorik olarak çok sayıda sıfır yazdırması gerektiğine dikkat edin, pratikte tercümanı sadece çökertir in `*': bignum too big to convert into `long' (RangeError).
Ilmari Karonen

22

Perl, 70 * 18446744073709551615 * 10 ^ 987654320

say q{!"#%&'+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\]^_`bcdfghijklmnoprtuvwz|}x(1e987654320*~$[)

Çıktı:

!"#%&'+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\]^_`bcdfghijklmnoprtuvwz|

Tekrarlanan 18446744073709551615 * 10 ^ 987654320 kez.

$[varsayılan olarak 0, ~$[eşdeğerdir 18446744073709551615.

Not olarak, numarayı oluşturmaya çalışırken hafızam tükenmişti 10^987654320.


Eski Cevap (7703703696):

say qw(!"#$%&'*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bcdefghijklmnoprtuvz{|}~10)x98765432

Çıktı:

!"#$%&'*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bcdefghijklmnoprtuvz{|}~10

98765432 kez tekrarlandı.

Not: Tüm örnekleri ile çalıştırın perl -Mbignum -E


Güzel! fakat özyinelemeyi kullanıp kullanamayacağını merak ediyorum ... (eğer kendi isminizi kullanmak zorunda kalırsanız, bir kimseyi aramak mümkün değil, çünkü isimdeki karakterleri tekrar eder) ama işlev adınız $ _ ile sonuçlanamadı veya Perl'in değişkenlerinden bir başkası mı?) .. veya akıllıca $ 0 çağrı kullanın (öbek doldurmadan)
Olivier Dulac

Yeterli hafızanız olsaydı, yapabileceklerinizperl -E'say qw{m}x(9876543210*ord$")'
hmatt1

2
Yardımcı olursa, artık bir zaman veya hafıza sınırı yoktur.
Calvin'in Hobileri

2
Üstelik, Perl’in ^ yerine ** yerine kullanması talihsizlik.
Mark

11

Bash + coreutils, 151,888,888,888,888,905 (1,5 * 10 ^ 17)

seq 9E15;#\!%*+,-./2346780:=@ABCDFGHIJKLMNOPQRSTUVWXYZ]^_abcdfghijklmnoprtuvwxyz~"'$&()?<>`{}|[

Her satıra bir adet olan 1 - 9x10 15 arasındaki tamsayıları çıkarır . Uzun zaman alır.

Neden 9E15? GNU'nun seqdahili olarak 64-bit float (double) kullandığı görülüyor. Bu tür ile temsil edebileceğimiz en büyük tam sayı, hassasiyet eksikliği nedeniyle çalışmayı bir duraklama ile artırmadan önce, 2 53 veya 9007199254740992'dir.

Puanı hesaplamak için, tüm sayıları belirli bir sayı hanesinde toplayıp 9E15 ekleyerek kullanıyorum, çünkü her sayı arasında yeni bir satır var:

8000000000000001*16 + 900000000000000*15 + 90000000000000*14 + 9000000000000*13 + 900000000000*12 + 90000000000*11 + 9000000000*10 + 900000000*9 + 90000000*8 + 9000000*7 + 900000*6 + 90000*5 + 9000*4 + 900*3 + 90*2 + 9 + 9000000000000000

Bu çıktının odekstra bir büyüklük sırası için yönlendirilmesini sağlayabilirim, ancak bu skor hesaplamasını çok daha zorlaştırır.


Kural öncesi değişiklik cevabı:

Bash + coreutils, 18,926,221,380

seq 1592346780;#\!%*+,-./:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ]^_abcdfghijklmnoprtuvwxyz~"'$&()?<>`{}|[

1'den 1592346780'e kadar çıktılar. 2012 ortası macbook'umda (bu bağlantı ölçütün çok da dışında değildi), bu yaklaşık 9m45s sürüyor.

Muhtemelen anlamsız olsa bile, onu biraz daha optimize etmeye dayanamadım.

Çıktı:

$ time ./pangram.sh | wc
 1592346780 1592346780 18926221380

real    9m46.564s
user    11m7.419s
sys 0m10.974s
$ 

Neden yapmıyorsun seq 9876543210;?
durron597

@ durron597 Çünkü bu çok uzun sürüyor - muhtemelen yaklaşık bir saat. 10 dakikadan kısa sürede tamamlanması gerekiyor.
Dijital Travma

ama elbette bu programın tek sınırlayıcı faktörü i / o ... Başka bir dilde başka bir program bu gerçekten yenemezdi.
durron597

@ durron597 Evet, doğru olduğunu düşünüyorum. Bu topluluktaki biri akıllıca bir yol bulursa şaşırmam ...
Digital Trauma

1
@DigitalTrauma Aslında bunun son derece bir cevap olmadığından emin olmak için zaman sınırını kaldırıyorum (alınma). Yarışmanın bu kadar çabuk bitmesini istemiyorum: P), bu yüzden kullanmaktan çekinmeyin 9876543210. Yeni son kuralı okumak isteyebilirsiniz.
Calvin'in Hobileri

6

GolfScript, ≈ 3 * 10 ^ (2 * 10 ^ 7) yani ≈ 3x10 20000000

 87 9654321?,`0${;.p}/#!"%&'()*+-9:<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnoqrstuvwxyz|~

Nasıl çalışır

87 9654321?                "Pushes 87^9654321 to stack";
           ,               "Pushes an array [0, 1, 2 ... (87^9654321) - 1] to stack";
            `              "Creates a string representation of the array like "[0 1 2...]";
             0$            "Copies the string";
               {;.p}/      "Print the string wrapped in quotes X times";
                     #...  "This is all comment";

İşte gibi olacak Xdizinin dize gösteriminin karakter sayımı (uzunluk)[0, 1, 2..,(87^9654321) - 1][0 1 2 3 4 ... (87^9654321) - 1]

Skorumu Xbulmak için burada hesaplamaya çalışıyorum . (87^9654321) - 1kabaca olduğu 10^(10^7.272415829713899)ile 18724742ondalık basamak.

Xkabaca 3*10^(2*10^7)yani X*Xsadece aynı. Bu değerlerin (hatta) wolframa'nın hesaplama sınırlamaları nedeniyle çok daha düşük bir seviyede sum (floor(log10(x)) + 1) for x = 1 to (87^9654321 - 1)olduğunu unutmayın. Bunun gerçek değerinin hangisi olduğunu hesaplayamadım .X


Teoride, bunu daha heuger yapmanın birkaç yolu olabilirdi, ama ne yazık ki Ruby'nin BigNum'unun sınırları var ve 87 9654321?haklı Infinity.
Dennis,

Ah! ? Maksimum biliyor musun? ;)
Doktor

Tam olarak değil. Tamsayı RAM'e sığması gerektiğinden, makineye bağlı görünüyor. Sınırsız hafıza ile limitin nerede olacağını bilmiyorum. Muhtemelen 2**(2**64)-164-bit Ruby için.
Dennis,

Sınırsız miktarda RAM sahibiz
Optimizer

Evet, bu yüzden açıklığa kavuştum. CJam için sabit bir limit var ve yorumlayıcı sadece belleği doldurduğunuzda çöküyor. Ruby farklı görünüyor.
Dennis,

4

MATLAB, 95

kod

char(37-5:126)% !"#$&'*+,./0489;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bdefgijklmnopqstuvwxyz{|}~

Çıktı

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Çıktı, her biri tam olarak bir kez ve sırayla belirtilen tüm ASCII karakterlerini içerir.


1
İzleyicilere not: Bu cevap, teknik özellik benzersiz karakterleri en üst düzeye çıkarmak istediğinde gönderildi . Bu artık amaç değil, ancak bu cevap geçerli olduğundan beri kalırsa sorun değil.
Calvin'in Hobileri

2

Ruby, 89

p %q{!"#$&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnorstuvwxyz|~}

Çıktı:

"!\"\#$&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnorstuvwxyz|~"

Tüm ASCII karakterleri hariç İçerir, p, , %, q, {, ve }.


1
İzleyicilere not: Bu cevap, teknik özellik benzersiz karakterleri en üst düzeye çıkarmak istediğinde gönderildi . Bu artık amaç değil, ancak bu cevap geçerli olduğundan beri kalırsa sorun değil.
Calvin'in Hobileri

2

GolfScript, 93

{ !#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz|~}

Çıktı:

{ !#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz|~}
}

Tüm ASCII karakter hariç İçerir "ve '.


6
Programın mükemmel bir pangram değil, değil mi? İçeriyor "ya 'da ikisinden de görünmüyor .
Martin Ender,

İzleyicilere not: Bu cevap, teknik özellik benzersiz karakterleri en üst düzeye çıkarmak istediğinde gönderildi . Bu artık amaç değil, ancak bu cevap geçerli kılsaydı kalırsa sorun değil.
Calvin'in Hobileri

1
Bunu yeni kurallar altında geçerli kılmak yeterince kolaydır: sadece #geçerli konumundan çıkın ve sonuna ekleyin #"'. Ancak skor bir düşecek.
Ilmari Karonen

2

Golf Betiği - 27 * 2 6543 9870

Bu benim ilk Golfscript gönderim! :)

12,`{.+}6543 9870?*#!"$%&'()-/:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz|~

Açıklama:

12,                     - Creates an array of ascending numbers from 0 to 11
   `                    - Converts the array to a string
    {.+}                - Duplicates the string on the stack and concatenates the two
        6543 9870?      - Calculates 6543^9870 and pushes it to the stack
                  *     - Repeat the block 6543^9870 times
                   #... - The rest is a comment

Çıktı, sayı listelerinin bir yüküdür. Aşağıdaki kodu göz önünde bulundurun:

12,`{.+}1*

Bununla beraber 12,, aşağıdaki diziyi üretir:

[0 1 2 3 4 5 6 7 8 9 10 11]

Geri döndürme çubuğu, bunu bir dizeye dönüştürür ve bloğa iletir {.+}. Bu, dizeyi çoğaltır ve ardından ikisini birleştirir:

[0 1 2 3 4 5 6 7 8 9 10 11][0 1 2 3 4 5 6 7 8 9 10 11]

1*Bir önceki bloğu bir kez (2 yürütmek için tercüman söyler 1 = 2).

Yani, buna dayanarak:

 12,`{.+}n*

12,`2 n kez çıkış verir .

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.