Program Pangram Prolific Perfect Berkaitan dengan Printable ASCII

23

Pembaruan: Batas waktu dihapus. Anda harus dapat menggambarkan output - lihat aturan baru.

Sebuah pangram adalah kalimat yang menggunakan setiap huruf dalam alfabet setidaknya sekali, seperti:

Rubah cokelat cepat melompati anjing malas.

Sebuah sempurna pangram menggunakan setiap huruf tepat sekali.

Pertimbangkan untuk menulis program yang merupakan pangram sempurna, menggunakan 95 karakter ASCII yang dapat dicetak (kode hex 20 hingga 7E) sebagai alfabet:

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

Program semacam itu harus mengandung tepat 95 karakter, dengan setiap karakter ASCII yang dapat dicetak muncul tepat sekali, tetapi dalam urutan apa pun. (Dengan demikian ada 95! = 1,03 × 10 148 kemungkinan.)

Tugas Anda adalah menulis program ini sedemikian sehingga jumlah karakter ASCII yang dapat dicetak yang dicetak ke stdout setinggi mungkin (mis. Produktif).

Skor Anda adalah jumlah karakter ASCII yang dapat dicetak yang dihasilkan program Anda ( jumlah total , bukan jumlah yang berbeda : AABCskor 4 sedangkan ABCskor 3) . Skor tertinggi menang.

Detail

  • Keluaran dapat berisi karakter apa saja (termasuk duplikat) tetapi hanya contoh dari 95 karakter ASCII yang dapat dicetak yang dihitung untuk skor Anda.
    • Anda dapat menggunakan JSFiddle ini untuk menghitung jumlah karakter ASCII yang dapat dicetak dalam string apa pun.
  • Jika bahasa Anda tidak memiliki stdout gunakan alternatif yang paling tepat.
  • Program anda ...
    • harus memiliki runtime yang terbatas (batas waktu telah dihapus)
    • harus memiliki keluaran yang terbatas
    • dapat berisi komentar
    • harus mengkompilasi dan menjalankan tanpa kesalahan (tidak tertangkap)
    • tidak boleh meminta atau membutuhkan input
    • harus waktu invarian dan deterministik
    • tidak boleh menggunakan perpustakaan eksternal
    • harus tidak memerlukan koneksi jaringan
    • tidak boleh menggunakan file eksternal
      • (Anda dapat menggunakan file program itu sendiri selama mengubah nama file tidak mengubah perilaku program)
  • Jika tugas ini tidak mungkin adalah beberapa bahasa yang terlalu buruk.
  • Anda harus memberikan output yang tepat atau menggambarkannya dengan tepat jika terlalu besar untuk dimuat dalam sebuah posting . Anda sebenarnya tidak harus menjalankan program Anda. Selama itu akan berjalan dalam jumlah waktu yang terbatas pada komputer dengan jumlah memori yang tidak terbatas itu valid.

Contoh

Program Python 2 sederhana ini adalah solusi yang memungkinkan:

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

Ini output 9876543210yang berisi 10 karakter ASCII yang dapat dicetak, sehingga mencetak 10.

Hobi Calvin
sumber
14
Luar biasa mengagumkannya seperti aliterasi muncul, pangram hanya mengemas pukulan yang kuat, karena mereka cukup menjengkelkan.
Geobits
2
Saya hanya membaca ulang aturan total-tidak-berbeda juga. Saya telah membaca sepintas lalu, menyimpulkan itu jelas aturan yang berbeda-tidak-total karena alternatif akan menyebabkan konstruksi yang absurd seperti mencetak surat aenam kuadriliun kali, di mana bahkan tidak mungkin untuk mendapatkan batas atas yang akurat pada jumlah karakter. Lagi pula, saya masih bangga dengan 95 saya, bahkan jika itu agak kecil. Ukuran bukan segalanya, Anda tahu.
COTO
Menurut Anda mengapa tugas ini tidak mungkin dilakukan di HQ9 +?
Peter Taylor
Saya akan mencoba dan melakukan ini dalam FORTRAN (sehingga saya dapat memanfaatkan ketidaksensitifan case). --- DAN goreskan itu. Saya membutuhkan huruf O 4 kali: 2 kali untuk deklarasi program dan 2 kali untuk deklarasi loop saya.
Nzall
1
@Dennis No. 5more
Hobi Calvin

Jawaban:

12

GolfScript, lebih dari 2 ↑↑↑ (9871 ↑↑ 2) karakter

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

Mencetak integer. Manfaatkan ukuran register CPU tanpa batas (yang menentukan panjang string maksimum di Ruby), memori dan waktu proses. Linefeed hanya untuk dibaca.

Kode

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.
 }/           #

Nilai

Tentukan b = 9871 ↑↑ 2 (lihat notasi panah atas Knuth ).

  • .? mengeksekusi f: x ↦ x ↑ x .

  • Blok dalam mengeksekusi g: x ↦ f x (x) .

    Karena f (x) = 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 dan seterusnya, kita memiliki
    g (x)> x ↑↑ (x + 1)> x ↑↑ x .

  • Blok luar mengeksekusi h: x ↦ g b (x) .

    Karena 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 dan seterusnya, kita memiliki h (x)> x ↑↑↑ (b + 1) .

  • Kita mulai dengan bilangan bulat 2 pada tumpukan, sehingga kode menghitung h (2)> 2 ↑↑↑ (b + 1).

  • Skor adalah jumlah digit desimal h (2) , yaitu log (h (2)) + 1> log (2 ↑↑↑ (b + 1))> 2 ↑↑↑ b .

Dengan demikian, skor lebih besar dari 2 ↑↑↑ (9871 ↑↑ 2) .

2 ↑↑↑ n tumbuh dengan kecepatan yang konyol ketika n menjadi lebih besar. 2 ↑↑↑ 4: = 2 ↑↑ 2 ↑↑ 2 ↑↑ 2 = 2 ↑↑ 2 ↑↑ 4 = 2 ↑↑ 65536 , yang merupakan menara tenaga asosiatif-kanan 65536 salinan dari 2 :

                                                                2 ↑↑↑ 4                                                                 

Demikian pula, 2 ↑↑↑ 5: = 2 ↑↑ (2 ↑↑↑ 4) , yang merupakan menara listrik 2 ↑↑↑ 4 salinan dari 2 .

Sekarang, skornya bukan 2 ↑↑↑ 4 atau 2 ↑↑↑ 5 , ini lebih besar dari 2 ↑↑↑ b , di mana b> 2 × 10 39 428 . Itu jumlah yang besar ...

Dennis
sumber
@DigitalTrauma - Anda harus memeriksa milik saya;)
Pengoptimal
@ Dennis - Berapa kira-kira?
Pengoptimal
@Optimizer Anda mendapatkan saya ;-)
Digital Trauma
Luar biasa! Ini mengingatkan saya pada nomor Graham ... Itu besar!
ditulis ulang
3
Perhatikan bahwa, sementara ini secara teoritis harus mencetak angka nol yang sangat besar, dalam praktiknya hanya menabrak juru bahasa in `*': bignum too big to convert into `long' (RangeError).
Ilmari Karonen
22

Perl, 70 * 18446744073709551615 * 10 ^ 987654320

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

Keluaran:

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

diulang 18446744073709551615 * 10 ^ 987654320 kali.

$[secara default 0, jadi ~$[sama dengan 18446744073709551615.

Sebagai catatan, saya kehabisan memori mencoba membuat nomor 10^987654320.


Jawaban Lama (7703703696):

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

Output adalah:

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

diulang 98765432 kali.

Catatan: Jalankan semua sampel dengan perl -Mbignum -E

es1024
sumber
bagus! tapi saya ingin tahu apakah seseorang dapat menggunakan pengulangan ... (tidak mungkin untuk memanggil diri sendiri jika Anda harus menggunakan nama Anda sendiri, karena itu akan mengulangi karakter dalam nama ... tetapi tidak bisa nama fungsi Anda berakhir dengan $ _ atau variabel Perl lainnya?) .. atau gunakan panggilan $ 0 secara cerdik (tanpa mengisi tumpukan)
Olivier Dulac
Jika Anda memiliki cukup memori, Anda bisa melakukannyaperl -E'say qw{m}x(9876543210*ord$")'
hmatt1
2
Jika itu membantu tidak ada lagi batas waktu atau memori.
Calvin Hobbies
2
Sangat disayangkan bahwa Perl menggunakan ** daripada ^ untuk eksponensial.
Tandai
11

Bash + coreutils, 151.888.888.888.888.905 (1,5 * 10 ^ 17)

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

Output bilangan bulat 1 hingga 9x10 15 , satu per baris. Butuh waktu lama.

Mengapa 9E15? Ternyata GNU seqtampaknya menggunakan floats 64-bit (ganda) secara internal. Bilangan bulat terbesar yang dapat kami wakili dengan tipe ini, sebelum bertambah satu kali bekerja karena kurangnya presisi, adalah 2 53 atau 9007199254740992. Angka terdekat yang bisa kita dapatkan dengan notasi eksponensial adalah 9E15 atau 9000000000000000000.

Untuk menghitung skor, saya menggunakan menjumlahkan semua angka dengan jumlah digit tertentu dan menambahkan 9E15, karena ada baris baru di antara setiap angka:

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

Saya bisa menyalurkan output ini melalui oduntuk besarnya tambahan atau lebih, tapi itu membuat perhitungan skor jauh lebih sulit.


Pra-aturan ubah jawaban:

Bash + coreutils, 18.926.221.380

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

Output 1 hingga 1592346780. Pada pertengahan 2012 macbook saya (yang tidak jauh dari patokan tertaut), ini membutuhkan waktu sekitar 9m45s.

Saya tidak bisa menahan diri untuk mengoptimalkannya sedikit lagi, meskipun mungkin itu tidak ada artinya.

Keluaran:

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

real    9m46.564s
user    11m7.419s
sys 0m10.974s
$ 
Trauma Digital
sumber
kenapa kau tidak melakukan seq 9876543210;?
durron597
@ durron597 Karena itu terlalu lama - mungkin sekitar satu jam. Perlu selesai dalam waktu kurang dari 10 menit.
Digital Trauma
tetapi tentunya satu-satunya faktor pembatas dari program ini adalah i / o ... program lain dalam bahasa lain tidak dapat mengalahkan hal ini.
durron597
@ durron597 Ya, saya pikir itu benar. Meskipun saya tidak akan terkejut jika seseorang di komunitas ini menemukan cara yang cerdas ...
Digital Trauma
1
@DigitalTrauma Saya benar-benar menghapus batas waktu untuk memastikan ini bukan jawaban kedua dari belakang (jangan tersinggung saya hanya tidak ingin kontes selesai begitu cepat: P), jadi jangan ragu untuk menggunakannya 9876543210. Anda mungkin ingin membaca aturan terakhir yang baru.
Calvin Hobbies
6

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

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

Bagaimana itu bekerja

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";

Berikut Xini jumlah karakter (panjang) dari representasi string dari array [0, 1, 2..,(87^9654321) - 1]yang akan seperti[0 1 2 3 4 ... (87^9654321) - 1]

Saya mencoba menghitung di Xsini untuk menemukan skor saya. (87^9654321) - 1kira 10^(10^7.272415829713899)- kira dengan 18724742angka desimal.

Xkira-kira 3*10^(2*10^7)begitu X*Xjuga sama saja. Perhatikan bahwa nilai-nilai ini berada di sisi yang sangat rendah karena keterbatasan perhitungan wolframa (bahkan) , saya tidak dapat menghitung sum (floor(log10(x)) + 1) for x = 1 to (87^9654321 - 1)yang merupakan nilai sebenarnya dariX

Pengoptimal
sumber
Secara teori, akan ada beberapa cara untuk membuat ini lebih penipu, tetapi sayangnya BigNum Ruby memang memiliki batas dan 87 9654321?adil Infinity.
Dennis
Oh! ? Apakah Anda tahu yang maksimal? ;)
Pengoptimal
Tidak persis. Tampaknya bergantung pada mesin, karena integer harus masuk ke dalam RAM. Dengan memori tidak terbatas, saya tidak tahu di mana batasnya. Mungkin 2**(2**64)-1untuk Ruby 64-bit.
Dennis
Kami memiliki jumlah RAM yang tidak terbatas
Pengoptimal
Ya, itu sebabnya saya mengklarifikasi. Untuk CJam, ada batas tetap dan juru bahasa hanya crash ketika Anda kehabisan memori. Ruby tampaknya berbeda.
Dennis
4

MATLAB, 95

Kode

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

Keluaran

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

Output berisi semua karakter ASCII yang ditentukan, masing-masing tepat sekali, dan berurutan.

COTO
sumber
1
Catatan untuk pemirsa: Jawaban ini diajukan ketika spek diminta untuk memaksimalkan karakter unik . Ini bukan lagi tujuannya, tetapi tidak apa-apa jika jawaban ini tetap karena valid.
Calvin Hobi
2

Ruby, 89

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

Keluaran:

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

Berisi semua karakter ASCII kecuali, p, , %, q, {, dan }.

Gagang pintu
sumber
1
Catatan untuk pemirsa: Jawaban ini diajukan ketika spek diminta untuk memaksimalkan karakter unik . Ini bukan lagi tujuannya, tetapi tidak apa-apa jika jawaban ini tetap karena valid.
Calvin Hobbies
2

GolfScript, 93

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

Keluaran:

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

Berisi semua karakter ASCII kecuali "dan '.

Gagang pintu
sumber
6
Programmu bukan pangram yang sempurna, kan? Sepertinya tidak mengandung "atau 'salah.
Martin Ender
Catatan untuk pemirsa: Jawaban ini diajukan ketika spek diminta untuk memaksimalkan karakter unik . Ini bukan lagi tujuannya, tetapi tidak apa-apa jika jawaban ini tetap jika itu valid.
Hobi Calvin
1
Cukup mudah untuk membuat ini valid di bawah aturan baru: cukup hapus #dari posisi saat ini dan tambahkan #"'sampai akhir. Namun skor akan turun satu.
Ilmari Karonen
2

Golfscript - 27 * 2 6543 9870

Ini pengajuan Golfscript pertama saya! :)

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

Penjelasan:

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

Outputnya memuat daftar angka. Pertimbangkan kode berikut:

12,`{.+}1*

Dengan 12,itu menghasilkan array berikut:

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

Backtick mengubah itu menjadi string, meneruskannya ke blok {.+}. Ini menggandakan string dan kemudian menggabungkan keduanya, menghasilkan:

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

The 1*memberitahu juru bahasa untuk mengeksekusi blok sebelumnya satu kali (2 1 = 2).

Jadi, berdasarkan itu:

 12,`{.+}n*

Menghasilkan output 12,`2 n kali.

Peluruhan Beta
sumber