Keluarkan lagu alfabet ŋarâþ crîþ tanpa menggunakan (m) huruf apa pun


12

Tujuan Anda adalah menulis program yang tidak mengambil input dan menghasilkan teks berikut:

ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos.

Tapi ada yang menarik: untuk setiap huruf (karakter apa pun yang kategori umum dalam Unicode dimulai dengan L) di sumber Anda, Anda mendapat penalti 20 karakter! (Untuk referensi, teks yang akan dicetak memiliki 81 huruf.)

Kode Perl 6 di bawah ini memiliki 145 byte dan 84 huruf, sehingga mendapat skor 1.845:

say "ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos."

Kode di bawah ini memiliki 152 byte dan 70 huruf, sehingga mendapat skor 1.552:

$_="C e N ŋa V o S;
Þ Š R L Ł.
M a P F G T Č;
în J i D Ð.
ar ħo ên ôn ân uħo;
Crþ Tŋ neŋ es nem.
elo cenvos.";s:g/<:Lu>/{$/.lc~'a'}/;.say

Celah standar dilarang.

Awalnya, saya berpikir untuk melarang semua surat, tetapi saya tidak berpikir ada banyak bahasa yang memungkinkan hal ini. Anda dipersilakan untuk mencoba.

(ŋarâþ crîþ [ˈŋaɹa̰θ kɹḭθ] adalah salah satu teman saya. Saya ingin menggunakan huruf kapital namanya di sini, tetapi saya mendapatkan huruf besar yang jelek di sini. Oh, bahasa itu toh tidak menggunakan huruf kapital dalam romanisasi juga.)

Sunting: menyadari bahwa salah satu kalimat salah, tetapi saya akan menyimpannya karena sudah ada jawaban. Versi yang benar dari baris ketiga adalah ma a fa ga pa ta ča; sesuai pilihan Anda, Anda dapat memilih untuk menghasilkan teks yang diperbaiki sebagai gantinya.


11
kolmogorov-kompleksitas , sumber terbatas , dan penilaian khusus adalah segala macam hal yang mendapat manfaat besar dari pertimbangan yang cermat di kotak pasir. Saat ini, sepertinya pendekatan terbaik untuk tantangan ini adalah dengan menuliskan semua codepoint dalam desimal kemudian mengubahnya menjadi teks dengan builtin, dengan beberapa jalan pintas untuk menyandikan semua as - atau tidak, tergantung pada berapa banyak dibutuhkan 20 huruf, karena 20 karakter adalah penalti yang sangat besar (walaupun ketika semuanya dicetak dengan byte, itu tidak didefinisikan dengan baik ...)!
String Tidak Terkait

4
Dan mengingat permohonan Unicode, beberapa aturan eksplisit yang mengatur kode-kode khusus seperti yang digunakan oleh sebagian besar golf mungkin diminta (di samping mungkin tautan ke skrip untuk memvalidasi penilaian).
String Tidak Terkait

Jawaban:


21

7 , 410 karakter, 154 byte dalam encoding 7, 0 huruf = skor 154

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

Cobalah online!

Dalam tantangan yang tidak suka menggunakan huruf, bahasa apa yang lebih baik untuk digunakan daripada yang hanya terdiri dari digit?

Ini adalah program lengkap yang keluar melalui crash, jadi ada output tambahan untuk stderr, tetapi stdout benar.

Penjelasan

Program 7, pada iterasi pertama, hanya mendorong sejumlah elemen ke stack (karena dari 12 perintah yang ada di 7, hanya 8 di antaranya yang dapat diwakili dalam program sumber, dan 8 yang khusus untuk menulis kode untuk mendorong struktur data tertentu ke stack). Program ini tidak menggunakan 6perintah (yang merupakan cara paling sederhana untuk membuat struktur bersarang, tetapi sebaliknya cenderung tidak muncul secara harfiah dalam program sumber), jadi hanya 7perintah yang menentukan struktur; 7mendorong elemen kosong baru ke atas tumpukan (sedangkan 0... 5perintah hanya menambahkan ke atas tumpukan). Dengan demikian kami dapat menambahkan spasi putih ke program untuk menunjukkan strukturnya:

551040105042001444344515102013040042201205040054344 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302245341351525 7

55102440304030434030421030442030424030455 7

33413512410523142410523030523112411350143355142410523414252410523102410523002
41052341334241114525 7

551220304010420030455 7

41403

Elemen-elemen di dekat akhir program didorong terakhir, begitu juga di atas tumpukan pada awal iterasi kedua. Pada iterasi ini, dan semua iterasi yang akan datang, 7 juru bahasa secara otomatis membuat salinan bagian atas tumpukan dan menafsirkannya sebagai suatu program. Literal 41403mendorong (non-literal, live code) 47463(7 memiliki 12 perintah tetapi hanya 8 dari mereka memiliki nama; dengan demikian, saya menggunakan huruf tebal untuk menunjukkan kode, dan non-tebal untuk menunjukkan literal yang menghasilkan kode itu, yang berarti itu, mis. 4adalah perintah yang ditambahkan 4ke elemen tumpukan atas). Jadi program yang berjalan pada iterasi kedua adalah 47463. Inilah yang dilakukan:

47463 
4        Tukar dua elemen tumpukan teratas, tambahkan elemen kosong di antara
  7       Tambahkan elemen tumpukan kosong ke atas tumpukan
   4      Tukar dua elemen tumpukan teratas, tambahkan elemen kosong di antara
    6     Berolahraga yang perintahnya akan menghasilkan elemen tumpukan atas;
        menambahkan itu ke elemen di bawah ini (dan pop bagian atas tumpukan)
    3    Keluarkan elemen tumpukan atas, pop elemen di bawah ini

Ini lebih mudah dipahami jika kita melihat apa yang terjadi pada stack:

  • ... d c b a 47463 (kode untuk dijalankan 47463:)
  • ... d c b kosong a (kode untuk dijalankan :)47463 7463
  • ... d c b mengosongkan sebuah kosong (kode untuk menjalankan: )47463 463
  • ... d c b 47463 kosong kosong kosong a (kode untuk dijalankan 63:)
  • ... d c b 47463 kosong kosong " a " (kode untuk dijalankan 3:)
  • ... d c b kosong (kode untuk dijalankan: kosong )47463

Dengan kata lain, kita mengambil bagian atas tumpukan sebuah , pekerjaan apa kode yang paling mungkin telah menghasilkan itu, dan output kode. 7 juru bahasa secara otomatis muncul elemen kosong dari atas tumpukan pada akhir iterasi, jadi kami berakhir dengan 47463kembali di atas tumpukan, seperti dalam program aslinya. Seharusnya mudah untuk melihat apa yang terjadi selanjutnya: kita akhirnya mengaduk-aduk setiap elemen tumpukan satu demi satu, mengeluarkan semuanya, hingga tumpukan mengalir dan program macet. Jadi pada dasarnya kami telah membuat loop keluaran sederhana yang melihat kode sumber program untuk menentukan apa yang akan dikeluarkan (kami tidak mengeluarkan struktur data yang didorong ke stack oleh 05perintah, kami malah menciptakan kembali perintah apa yang digunakan dengan melihat struktur apa yang dibuat, dan mengeluarkannya). Dengan demikian, bagian pertama dari output data adalah 551220304010420030455(kode sumber yang menghasilkan elemen tumpukan kedua-dari-atas), yang kedua adalah 3341351…114525(kode sumber yang menghasilkan elemen tumpukan ketiga-dari-atas), dan seterusnya.

Namun, jelas, kode-kode sumber ini tidak sedang di-output. 7 berisi beberapa bahasa spesifik domain yang berbeda untuk output enkode; setelah bahasa khusus domain dipilih, tetap digunakan sampai dihapus secara eksplisit, tetapi jika belum ada bahasa yang dipilih, digit pertama dari kode yang dihasilkan menentukan bahasa mana yang akan digunakan. Dalam program ini, hanya dua bahasa yang digunakan: 551dan 3.

551cukup sederhana: ini pada dasarnya Baudot / kode teletype lama yang digunakan untuk mengirimkan surat melalui teletype, sebagai rangkaian karakter 5-bit, tetapi dimodifikasi untuk membuat semua huruf menjadi huruf kecil. Jadi potongan kode pertama yang akan di-dekode output seperti ini:

551  22 03 04 01 04 20 03 04  55
     c  a  SP e  SP n  a  SP  reset output format

Seperti yang dapat dilihat, kami menyesuaikan setiap karakter menjadi dua digit oktal, yang merupakan rasio kompresi yang cukup baik. Pasangan digit dalam rentang 0-5 memberi kita 36 kemungkinan, berbeda dengan 32 kemungkinan yang dibutuhkan Baudot, sehingga empat digit sisanya digunakan untuk perintah khusus; dalam hal ini, 55pada akhirnya menghapus format output yang diingat, membiarkan kami menggunakan format berbeda untuk potongan output berikutnya yang kami hasilkan.

3secara konseptual bahkan lebih sederhana, tetapi dengan twist. Ide dasarnya adalah untuk mengambil kelompok tiga digit (sekali lagi, dalam kisaran 0-5, karena itu adalah angka yang dapat kami jamin bahwa kami dapat membuat ulang kode sumber asli dari outputnya), menafsirkannya sebagai tiga digit nomor dalam basis 6, dan hanya output sebagai byte dalam biner (sehingga membiarkan kami menampilkan karakter multibyte dalam output yang diinginkan hanya dengan menghasilkan beberapa byte). Twist, meskipun, berasal dari fakta bahwa hanya ada 216 angka tiga digit (dengan kemungkinan nol terkemuka) di basis 6, tetapi 256 byte mungkin. 7 menyelesaikan ini dengan menghubungkan angka dari 332₆ = 128₁₀ ke atas ke dua byte yang berbeda;332dapat menampilkan byte 128 atau 192, 333byte 129 atau 193, dan seterusnya, hingga 515output byte 191 atau 255.

Bagaimana program mengetahui mana dari dua kemungkinan untuk dihasilkan? Dimungkinkan untuk menggunakan kembar tiga digit dari520 atas untuk mengontrol ini secara eksplisit, tetapi dalam program ini kita tidak harus: default 7 adalah untuk memilih semua byte yang ambigu sedemikian rupa sehingga outputnya valid UTF-8! Ternyata selalu ada paling banyak satu cara untuk melakukan ini, jadi selama itu UTF-8 yang kita inginkan (dan kita lakukan dalam kasus ini), kita bisa membiarkannya ambigu dan program tetap bekerja.

Akhir dari masing-masing 3…bagian adalah 525, yang me-reset format output, membiarkan kita kembali ke 551bagian selanjutnya.


Ini adalah 410 byte + 0 huruf dalam representasi yang tidak dibongkar, atau 154 byte + banyak huruf dalam representasi yang dikemas. Menghitung byte dalam satu dan huruf-huruf di yang lain tampaknya curang.
Grimmy

1
@ Grimy: Anda membingungkan byte dengan karakter. Representasi yang dikemas terdiri dari 154 byte dalam pengkodean 7 yang mengkodekan 410 digit oktal, yang masing-masing merupakan digit bukan huruf. Alasan Anda menyiratkan bahwa, katakanlah, ɓdi Jelly bukan huruf (karena penyandiannya dalam penyandian Jelly sesuai dengan kode kontrol "CSI" jika ditafsirkan dalam rangkaian karakter 8-bit, bukan huruf). Sama seperti Jelly, 7 juga menggunakan penyandian khusus; tetapi karena 7 tidak menggunakan huruf, encoding tidak perlu untuk menyandikan huruf dan karenanya tidak bisa.
ais523

10

Haskell, 0 huruf, 423 byte = skor 423

(['\10'..]!!)<$>[89,87,22,91,22,100,87,22,321,87,22,108,87,22,101,22,105,87,49,0,244,87,22,343,87,22,104,87,22,98,87,22,312,87,36,0,99,87,22,87,22,102,87,22,92,87,22,93,87,22,106,87,22,259,87,49,0,228,100,22,96,87,22,95,22,90,87,22,230,87,36,0,87,104,22,285,101,22,224,100,22,234,100,22,216,100,22,107,285,101,49,0,89,87,104,244,22,106,87,321,22,100,91,321,22,91,105,22,100,91,99,36,0,91,98,101,22,89,91,100,108,101,105,36]

Cobalah online!


6

Jelly ,  274 260  212 byte + 2 huruf =  314 300  252

-48 byte terima kasih kepada Nick Kennedy

“19ב+49;7883,8220,8216,7884Ọ“19937801,1169680277365253“38“68112“;107¤+1+\“@“&%"("/%"@%"6%"0"3%$!<%" %"2%"-%"?%#!.%"%"1%")%"*%"4%"=%$!9/",%"+"'%":%#!%2">0"8/";/"7/"5>0$!&%2<"4%@"/(@"(3"/(.#!(-0"&(/603#“_32¤”;";/V

(Penggunaan !"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”yang Vdan adalah huruf Unicode dan digunakan sekali masing-masing)

Cobalah online!




@NickKennedy Saya bermain-main dengan bermain golf nomor, tetapi tidak mundur dan melihat hanya mengimbangi peraturan, hal-hal baik - terima kasih!
Jonathan Allan

3

PowerShell , skor 601 546

-join(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14|%{[char]($_+32)})

Cobalah online!

Pendekatan naif; Saya hanya mengambil poin kode dan mengubahnya menjadi desimal, dikurangi 32, lalu kode ini memperlakukan mereka sebagai charsebelum -joinmemasukkannya kembali menjadi satu string.




3

Jelly , 321 byte + 2 huruf = skor 361

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

Cobalah online!

Ini mengerikan dan seseorang pasti bisa berbuat lebih baik.

Verifikasi skor .


1
sebenarnya kurang buruk dari yang terlihat
ASCII-only

2

Python 3 , 380 byte + 5 huruf = 480

print("""\143\141 \145 \156\141 \513\141 \166\141 \157 \163\141;
\376\141 \541\141 \162\141 \154\141 \502\141.
\155\141 \141 \160\141 \146\141 \147\141 \164\141 \415\141;
\356\156 \152\141 \151 \144\141 \360\141.
\141\162 \447\157 \352\156 \364\156 \342\156 \165\447\157;
\143\141\162\376 \164\141\513 \156\145\513 \145\163 \156\145\155.
\145\154\157 \143\145\156\166\157\163.""")

Cobalah online!


1

Retina , 140 karakter, 159 byte, 14 huruf = skor 439


%# ' 1# !# 9# 2 6#;¶þ# š# 5# /# ł#.¶0# # 3# (# )# 7# č#;¶î1 ,# + &# ð#.¶#5 ħ2 ê1 ô1 â1 8ħ2;¶%#5þ 7#! 1'! '6 1'0.¶'/2 %'1926.
T`!--/-9`ŋ\`-{

Cobalah online! Sunting: Disimpan 1 huruf dengan beralih dari K`ke baris baru. Sekarang juga berfungsi di Retina 0.8.2 (tetapi judulnya terlalu panjang).


1

Japt -S , 304 286 byte + 2 1 huruf s = 344 306

Yah, ini mengerikan sekali!

"3 1
5
14 1
235 1
22 1
15
19 1 -37 -86 158 1
257 1
18 1
12 1
226 1 -50 -86 13 1
1
16 1
6 1
7 1
20 1
173 1 -37 -86 142 14
10 1
9
4 1
144 1 -50 -86 1 18
199 15
138 14
148 14
130 14
21 199 15 -37 -86 3 1 18 158
20 1 235
14 5 235
5 19
14 5 13 -50 -86 5 12 15
3 5 14 22 15 19 -50"·®¸®°d96} ¬

Cobalah


1

PHP -a, 402 bytes + 200 penalti = skor 602

foreach([67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,8,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14] as $i){echo ''.mb_chr($i+32);}

Jawaban Port of Artermis Fowl , dan entri codegolf pertamaku!

Meninggalkan saya berharap itu chr()hanya bisa mendukung UTF-8; ekstra 3 byte + 40 karakter itu menyakitkan!


Selamat datang di PPCG :)
Shaggy

1

05AB1E , skor 209 (189 byte + 20 penalti untuk 1 huruf)

•£?;\:'%¢;.'¡£/':¢?'¢°':¢°#@¢«>#%¡¤;®[¢:¥¢:©¢:¦¢;®¢>#¡£#¨¢#&¢+¢#,¢:§¡¤#¬¢#@¢#)¢#(¢#<¢#¢#/¡£#¯¢#.¢#>¢#±¢#«¡¤#?¢;¢#\¢#°¢#:¢'¢#%•[₅‰`©®_#∞158+902201401301670804020409010150250102709022¾¡.¥>:ç?

Cobalah online!

Satu-satunya surat adalah ç. Simbol mata uang €£¢tidak dianggap sebagai huruf dalam Unicode.


0

Python 3 , 397 byte + 19 huruf = 777 skor

print(''.join(chr(i+32)for i in[67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14]))

Cobalah online!

Jawaban Port of AdmBorkBork .




562 , -2 jika menggunakan python 2
ASCII-only

TIO tidak berfungsi di organisasi saya, jadi saya harus menunggu untuk pulang untuk menambahkannya.
Artemis masih tidak percaya SE

0

R , 384 byte + 12 huruf * 20 poin = skor 684

Tidak terlalu orisinal.

cat(intToUtf8(c(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14)+32))

Cobalah online!


0

05AB1E , skor 383 365 (325 byte + 2 huruf * 20 penalti)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

Port dari jawaban Jelly @HyperNeutrino .

Akan mencoba untuk meningkatkan di sini. Jumlahnya dapat dibagi dengan banyak angka , tetapi tidak satupun dari mereka akan menyimpan byte, sayangnya, dan pembagi yang lebih besar dikompresi mengandung setidaknya 1 huruf ..

-18 (+2 bytes dan -20 penalti) terima kasih kepada @Grimy , ganti surat J(gabung) dengan .««(kurangi dengan menyatukan).

Cobalah online.


1
Jbisa .««untuk -18. Atau untuk pendekatan yang sama sekali berbeda, lihat jawaban saya .
Grimmy

@ Terima kasih kotor! :) Dan jawaban yang bagus!
Kevin Cruijssen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.