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:
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 : AABC
skor 4 sedangkan ABC
skor 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 9876543210
yang berisi 10 karakter ASCII yang dapat dicetak, sehingga mencetak 10.
sumber
a
enam 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.Jawaban:
GolfScript, lebih dari 2 ↑↑↑ (9871 ↑↑ 2) karakter
Mencetak integer. Manfaatkan ukuran register CPU tanpa batas (yang menentukan panjang string maksimum di Ruby), memori dan waktu proses. Linefeed hanya untuk dibaca.
Kode
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 :
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 ...
sumber
in `*': bignum too big to convert into `long' (RangeError)
.Perl, 70 * 18446744073709551615 * 10 ^ 987654320
Keluaran:
diulang 18446744073709551615 * 10 ^ 987654320 kali.
$[
secara default0
, jadi~$[
sama dengan18446744073709551615
.Sebagai catatan, saya kehabisan memori mencoba membuat nomor
10^987654320
.Jawaban Lama (7703703696):
Output adalah:
diulang 98765432 kali.
Catatan: Jalankan semua sampel dengan
perl -Mbignum -E
sumber
perl -E'say qw{m}x(9876543210*ord$")'
Bash + coreutils, 151.888.888.888.888.905 (1,5 * 10 ^ 17)
Output bilangan bulat 1 hingga 9x10 15 , satu per baris. Butuh waktu lama.
Mengapa
9E15
? Ternyata GNUseq
tampaknya 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:
Saya bisa menyalurkan output ini melalui
od
untuk besarnya tambahan atau lebih, tapi itu membuat perhitungan skor jauh lebih sulit.Pra-aturan ubah jawaban:
Bash + coreutils, 18.926.221.380
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:
sumber
seq 9876543210;
?9876543210
. Anda mungkin ingin membaca aturan terakhir yang baru.GolfScript, ≈ 3 * 10 ^ (2 * 10 ^ 7) yaitu ≈ 3x10 20000000
Bagaimana itu bekerja
Berikut
X
ini 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 diX
sini untuk menemukan skor saya.(87^9654321) - 1
kira10^(10^7.272415829713899)
- kira dengan18724742
angka desimal.X
kira-kira3*10^(2*10^7)
begituX*X
juga sama saja. Perhatikan bahwa nilai-nilai ini berada di sisi yang sangat rendah karena keterbatasan perhitungan wolframa (bahkan) , saya tidak dapat menghitungsum (floor(log10(x)) + 1) for x = 1 to (87^9654321 - 1)
yang merupakan nilai sebenarnya dariX
sumber
87 9654321?
adilInfinity
.2**(2**64)-1
untuk Ruby 64-bit.MATLAB, 95
Kode
Keluaran
Output berisi semua karakter ASCII yang ditentukan, masing-masing tepat sekali, dan berurutan.
sumber
Ruby, 89
Keluaran:
Berisi semua karakter ASCII kecuali,
p
,,
%
,q
,{
, dan}
.sumber
GolfScript, 93
Keluaran:
Berisi semua karakter ASCII kecuali
"
dan'
.sumber
"
atau'
salah.#
dari posisi saat ini dan tambahkan#"'
sampai akhir. Namun skor akan turun satu.Golfscript - 27 * 2 6543 9870
Ini pengajuan Golfscript pertama saya! :)
Penjelasan:
Outputnya memuat daftar angka. Pertimbangkan kode berikut:
Dengan
12,
itu menghasilkan array berikut:Backtick mengubah itu menjadi string, meneruskannya ke blok
{.+}
. Ini menggandakan string dan kemudian menggabungkan keduanya, menghasilkan:The
1*
memberitahu juru bahasa untuk mengeksekusi blok sebelumnya satu kali (2 1 = 2).Jadi, berdasarkan itu:
Menghasilkan output
12,`
2 n kali.sumber