Ini adalah tantangan kode-golf terbatas-sumber , kolmogorov , untuk menghasilkan output yang tetap tanpa input.
Format output, bagaimanapun, fleksibel - dapat dicetak ke standar keluar, dicetak ke kesalahan standar, dikembalikan sebagai daftar karakter, dikembalikan sebagai daftar byte, atau dikembalikan sebagai daftar bilangan bulat. Jika Anda berpikir hal lain tampaknya masuk akal tanyakan di komentar!
Berikut adalah CODEGOLF seni ASCII huruf besar yang sederhana :
CCCC OOO DDDD EEEEE GGG OOO L FFFFF
C O O D D E G O O L F
C O O D D EEE G GG O O L FFF
C O O D D E G G O O L F
CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Tanpa baris baru (atau spasi tambahan pada baris apa pun), panjangnya 256 karakter:
CCCC OOO DDDD EEEEE GGG OOO L FFFFFC O O D D E G O O L FC O O D D EEE G GG O O L FFFC O O D D E G G O O L F CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Indeks (berbasis-0) dari karakter non-spasi adalah:
1, 2, 3, 4, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 24, 25, 29, 30, 31, 36, 37, 38, 42, 49, 50, 51, 52, 53, 54, 61, 65, 68, 72, 75, 82, 89, 93, 96, 103, 104, 111, 115, 118, 122, 125, 126, 127, 132, 135, 136, 139, 143, 146, 153, 154, 155, 156, 163, 167, 170, 174, 177, 184, 188, 191, 195, 198, 205, 207, 208, 209, 210, 214, 215, 216, 220, 221, 222, 223, 227, 228, 229, 230, 231, 235, 236, 237, 238, 242, 243, 244, 248, 249, 250, 251, 252, 255
Anda tidak boleh menggunakan salah satu dari 97 byte ini dalam kode Anda tetapi harus menghasilkan daftar (atau output serupa) byte ini, dalam urutan ini, dengan byte yang hilang diganti dengan byte ke-32 di halaman kode yang Anda gunakan (dalam banyak, banyak kode-halaman karakter spasi).
Anda dapat menyertakan baris baru * yang tercetak cantik (tetapi tidak ada spasi tambahan di baris) jika itu membantu.
Misalnya menggunakan halaman kode Jelly output ini dapat diterima:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 12345
6 = A D H K R Y ] ` g
h o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓ
ƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ
ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
... tapi begitu juga:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 123456 = A D H K R Y ] ` gh o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
... dan begitu juga:
[32, 1, 2, 3, 4, 32, 32, 32, 8, 9, 10, 32, 32, 32, 14, 15, 16, 17, 32, 32, 32, 21, 22, 23, 24, 25, 32, 32, 32, 29, 30, 31, 32, 32, 32, 32, 36, 37, 38, 32, 32, 32, 42, 32, 32, 32, 32, 32, 32, 49, 50, 51, 52, 53, 54, 32, 32, 32, 32, 32, 32, 61, 32, 32, 32, 65, 32, 32, 68, 32, 32, 32, 72, 32, 32, 75, 32, 32, 32, 32, 32, 32, 82, 32, 32, 32, 32, 32, 32, 89, 32, 32, 32, 93, 32, 32, 96, 32, 32, 32, 32, 32, 32, 103, 104, 32, 32, 32, 32, 32, 32, 111, 32, 32, 32, 115, 32, 32, 118, 32, 32, 32, 122, 32, 32, 125, 126, 127, 32, 32, 32, 32, 132, 32, 32, 135, 136, 32, 32, 139, 32, 32, 32, 143, 32, 32, 146, 32, 32, 32, 32, 32, 32, 153, 154, 155, 156, 32, 32, 32, 32, 32, 32, 163, 32, 32, 32, 167, 32, 32, 170, 32, 32, 32, 174, 32, 32, 177, 32, 32, 32, 32, 32, 32, 184, 32, 32, 32, 188, 32, 32, 191, 32, 32, 32, 195, 32, 32, 198, 32, 32, 32, 32, 32, 32, 205, 32, 207, 208, 209, 210, 32, 32, 32, 214, 215, 216, 32, 32, 32, 220, 221, 222, 223, 32, 32, 32, 227, 228, 229, 230, 231, 32, 32, 32, 235, 236, 237, 238, 32, 32, 32, 242, 243, 244, 32, 32, 32, 248, 249, 250, 251, 252, 32, 32, 255]
(Yang terakhir ini adalah keluaran daftar yang valid dalam bahasa apa pun dengan halaman kode apa pun, dan orang juga dapat menggunakan pemformatan daftar yang masuk akal.)
Berikut ini adalah kode Python 3 yang menunjukkan byte ASCII yang tidak tersedia.
* Meskipun pencetakan itu sendiri mungkin tidak terlalu cantik!
sumber
$%&*123456=ADHKRY]``ghosvz}~
dan tidak ada baris baru?array_map(function($n){return sprintf("%6b",$n);},...)
tanpa$
(saya bisa melakukan itu) DAN tanpa}
(tidak tahu). Iya; Saya ingin mengemas data!Jawaban:
Python 2 ,
321203 byteCobalah online!
Penjelasan:
dari dalam keluar:
cfjdbljcibkeajjejiljjlcbjddlafklebajjlceljdeadficijflealkeklkljadfbbckjebclk
adalah nomor yang25731972618407747697792173390589410779249734035626759409848989703511287412985
dikodekan dengan karakter yang diizinkan. (Tidak123456
diizinkan)reduce(lambda x,y:x+repr('abcdefijkl'.find(y)),'cfjdbl..bclkf','')
memetakan string ke string desimalnya:reduce(lambda x,y:x+y,'..','')
sama dengan''.join('..')
(Tidako
diizinkan)repr('..')
alih-alihstr('..')
(Tidaks
diizinkan)'abcdefijkl'.find(y)
memetakan char ke digit.enumerate(bin(int(...)))
mengubah string angka menjadi string biner, dan menghitungnya. Ini memberi pasangan[(0,0), (1,b), (2,1), (3,1), ...]
map(lambda(i,x):(x>'0'and i-8-8-8-8)+8+8+8+8, ... )
mengkonversi daftar yang disebutkan ke hasil akhir.map(lambda(i,x):.. , .. )
alih-alih[... for(i,x)in ...]
(Tidako]
diizinkan)lambda(i,x): ..
mengkonversi setiap pasangan (indeks, nilai) menjadi indeks atau32
.(x>'0'and i-8-8-8-8)+8+8+8+8
sama dengan:x>'0'and i or 8+8+8+8
, (Tidako
diizinkan)[8+8+8+8,i][x>'0']
atau[8<<9-7,i][x>'0']
, (Tidak]
diizinkan)8+8+8+8
=32
(Tidak23
diizinkan)Ini berarti bahwa program ini pada dasarnya sama dengan:
sumber
C (gcc) , 318 byte
Cobalah online!
Yang ini sedikit perjalanan ...
1. Mengompresi daftar
Entah bagaimana kita perlu memeriksa apakah integer yang diberikan adalah salah satu poin kode khusus. Daftar 'telanjang' akan terlalu panjang, jadi kami menggunakan daftar periksa. Daftar ini memiliki nilai bukan nol pada titik kode yang 'dibatasi' dan nilai nol pada titik yang tidak.
Sayangnya ini masih membutuhkan 512 byte hanya untuk memiliki daftar (sepertinya
0,0,7,7,0,7,0,...
). Ini bisa disingkat dengan bitmask.Untuk memanfaatkan bitmask, kami akan memecah setiap byte menjadi dua bagian. 3 bit pertama akan memilih topeng dari array sementara 5 bit terakhir akan memilih sedikit dalam array. Kami tidak dapat mengecilkan array lebih jauh karena integer 32-bit yang digunakan secara default tidak mendukung lebih dari 2 ^ 5 = 32 bit.
Menggunakan implementasi referensi saya menulis:
Saya bisa menghasilkan nilai yang sesuai untuk array baru ini menggunakan perintah
echo "obase=16;ibase=2;$(./a.out | rev)" | bc
. Ini meneruskan output dari program di atas (./a.out
) kerev
program, yang membalikkan setiap baris. Ini mencetak ini bersama dengan header ke bc yang menetapkan basis output ke 16 dan basis input ke 2. Dengan demikian bc mengubah digit biner menjadi bitmask heksadesimal.Array yang dihasilkan dapat dilihat dalam solusi 'beta' ini:
2. Menangani kendala
Ada banyak kendala yang perlu ditempatkan pada kode di atas. Di sini saya membahas masing-masing 1-per-1.
Ini dirasakan oleh bahasa lain juga, tanpa penugasan dalam C sangat sulit untuk mendapatkan nilai yang dijamin ke dalam variabel. Cara termudah bagi kita adalah menulis fungsi kita sebagai program lengkap. Argumen pertama
main
akan melewati nilaiargc
yang akan menjadi 1 jika dipanggil tanpa argumen.Konstruksi hanya perulangan di C adalah
for
,while
, dangoto
semua yang berisi karakter terbatas. Ini membuat kita menggunakan rekursi. Fungsi utama akan mulai dari 1 dan berulang sampai argumen adalah> 256, sementara itu akan mengurangi argumen secara internal untuk menggunakan nilai 0-diindeks.Nilai-nilai dalam array di atas adalah heksadesimal, bahkan ketika dikonversi ke desimal, ini mengandung beberapa simbol terbatas, terutama 123456 (AD dapat lebih rendah-cased). Untuk mengatasinya, setiap konstanta di-XOR dengan konstanta lain sehingga karakter yang dibatasi dihapus. 1 menjadi 9 ^ B, 2 menjadi C ^ E, 3 menjadi B ^ 8, 4 menjadi 8 ^ C, 5 menjadi 9 ^ C, dan 6 menjadi 9 ^ F (ada lebih banyak cara untuk melakukannya, saya memilih cara ini) .
Pembatasan tidak meninggalkan banyak fungsi pencetakan yang tersisa untuk kita.
putchar
danputs
keduanya dibatasi, meninggalkanprintf
. Sayangnya kami harus mengirimprintf
string format, idealnya "% c". Semua string seperti itu memiliki tanda sial yang ingin kita hapus. Untungnya kami menganggap mesin little-endian (karena ternyata itulah yang digunakan TIO, dan itu cukup khas). Dengan membangun integer yang byte dalam memori adalah 0x25 (%), 0x63 (c), 0x00 (\ 0), apa saja (tidak masalah, setelah terminator nol) kita bisa meneruskan alamatnyaprintf
dan akan menganggapnya adalah sebuah string. Salah satu nomor yang berfungsi adalah -989830363 (0xC5006325). Ini mudah dibuat di bawah batasan sebagai 77707-989908070.Masih ada masalah bahwa kami tidak dapat mereferensikan nilai apa pun (karena kami tidak dapat menetapkannya dan karena kami tidak dapat menggunakan &), jadi kami harus menggunakan array literal (int []) {...}. Kami sebenarnya menggunakan ini untuk array bitmask di atas juga.
Kami tidak dapat menggunakan ']' atau '}' untuk menutup array atau fungsi kami. Untungnya C memiliki digraf dan trigraph yang berfungsi.
:>
akan menjadi]
, sementara??>
akan menjadi}
. Ini membutuhkan gcc untuk-trigraphs
beralih, karena mengabaikan trigraph secara default (melanggar standar).Kita tidak bisa menggunakan
&
untuk menutupi bit dari indeks kita, juga tidak bisa kita gunakan%
untuk sampai ke sana dengan cara kuno. Karena itu kami mengandalkan implementasi perilaku spesifik. Secara khusus kami menggeser bilangan bulat 32-bit kami cukup jauh ke kiri untuk kehilangan bit, lalu kembali ke kanan. Sebagai contoh untuk mendapatkan 5 bit terakhir dari nomor kami, pertama-tama kita menggesernya meninggalkan 27 bit (meninggalkanabcde00000...
) kemudian menggesernya kembali ke kanan sebesar 27 bit (meninggalkan...00000abcde
).Kami membutuhkan beberapa nilai literal di seluruh kode - ini diambil dari jawaban JS Arnauld, ditambah 27 (untuk alasan di atas) ditambahkan oleh saya sebagai
9+9+9
.3. Menyatukannya
Berikut ini deskripsi sumber dengan semua perubahan ini secara bersamaan.
sumber
?:
ekstensi g ++ , penyalahgunaan modulo bitwise shift 32, 273 byte-trigraphs
opsi pada beberapa kompiler C, sementara?:
membutuhkan gcc yang membutuhkan-trigraphs
.brainfuck , 635 byte
Cobalah online!
Menanggapi akhirnya dikalahkan oleh Javascript, saya telah melakukan golf apa yang saya bisa dari ini:
1 byte disimpan dengan memiliki 32 di sel 0 dan menambah sel 1 (satu-satunya alasan saya awalnya memilikinya dengan cara lain adalah karena perbaikan cepat ketika OrjanJohansen menunjukkan saya tidak bisa menggunakan
]
)1 byte disimpan dengan mengurangi sel ketiga (awalnya pada 0) untuk menghasilkan
255
=-1
2 byte disimpan dengan mencetak spasi antara karakter 31 dan 36 tanpa menggunakan
<>
tetapi sebaliknya hanya berhenti pada 32 untuk mencetak dari sel 0 saat bertambah dari 31 hingga 33.brainfuck , 639 byte
Cobalah online!
Pertama kita menghasilkan angka 32. Kemudian kita hanya melalui peningkatan satu sel dan beralih pencetakan antara sel itu dengan yang berisi 32. Angka yang terus bertambah adalah sesuatu yang dilakukan Brainfuck dengan baik.
Menyenangkan mengalahkan Javascript dengan Brainfuck, itu tidak sering terjadi!
sumber
]
bukan karakter yang diizinkan. Meskipun Anda masih harus bisa memperbaikinya dan mengalahkan Javascript. :)]
tidak diizinkan, saya pikir jawaban BF saya mungkin optimal sekarang.JavaScript (SpiderMonkey) ,
1918159814871431 byteDisimpan 56 byte berkat @ user202729
Cobalah online!
Bagaimana?
Fakta yang
=
tidak diizinkan adalah show-killer di JS. Kami tidak dapat melakukan tugas variabel apa pun, dan kami juga tidak dapat menggunakan fungsi panah apa pun.+
-
/
|
^
<<
>>
8<<98
8<<2
sumber
32
sebagai8<<9-7
menyimpan satu byte untuk masing-masing32
.32 = 8<<98
(karena ). Beberapa ekspresi lagi dapat dipersingkat dengan cara ini. Masih mengerjakannya.Haskell,
623617614594360342 byteSunting: -234 bytes berkat @Lynn dengan menemukan pengkodean pola sebagai string. -18 byte terima kasih kepada @ Ørjan Johansen.
Cobalah online!
Bagaimana itu bekerja
sumber
(id:pure(\_->8+8+8+8))
olehuntil((||" XXXX XXX XXXX XXXXX XXX XXX X XXXXXX X X X X X X X X X XX X X X X XXX X XX X X X XXXX X X X X X X X X X X X XXXX XXX XXXX XXXXX XXXX XXX XXXXX X"!!i<'X').(<1))pred 1
dan menyimpan banyak byte.filter
alih - alihuntil
cabang (dancycle
untuk menghindari tambahan++pure(...)
).Brain-Flak -r,
41904188 byteCobalah online!
Yang ini agak sulit untuk Brain-flak karena kita tidak bisa menggunakan
]
atau}
. Berarti satu-satunya karakter yang bermanfaat adalah<>()
.Inilah program Haskell yang membantu saya menulis ini
Itu hanya menghitung melewatkan di mana ruang perlu dan mendorong mereka secara individual.
sumber
{}
pencarian komputer sebenarnya dapat menemukan yang optimal dalam waktu yang terbatas.JavaScript (SpiderMonkey) ,
1001919789441 byteCobalah online!
Akhirnya mengalahkan BF !!!
Ide umum
Konversi setiap karakter string string panjang ke indeks atau 32, tergantung pada nilainya.
Array.prototype.map
? Cara mendapatkan arrayBrute paksa untuk melihat objek mana yang dapat diakses dengan mengakses properti objek (karena
]
tidak diperbolehkan, jadi hanya properti dengan nama yang cocok dengan pengidentifikasi yang dapat diakses).RegExp.prototype.exec
mengembalikan objek seperti array ketika ada kecocokan. Ketika tidak ada argumen yang diberikan, argumen default keundefined
, jadi/u/.exec()
cocok dan mengembalikan array.Dapatkan 2 nilai berbeda yang sewenang-wenang pada 2 karakter yang berbeda
Kami ingin memiliki
(x,y)=>x=='0'?32:y
, tetapi kami tidak dapat menggunakan=
.Sebaliknya, kita akan lakukan
Kita dapat
map
merangkai beberapa fungsi, tetapi=>
tidak diizinkan, jadi hanya beberapa fungsi yang dapat digunakan. Itu mungkin telah terikatthis
dan beberapa argumen terikat (sehingga memiliki bentuk(x,y,z)=>pre_filled_function.call(pre,filled,args,etc,x,y,z)
)Setelah mempertimbangkan daftar fungsi (
repeat exec bind create map indexOf replace fill find reduce filter findIndex call bind apply
), saya memutuskan bahwa fungsi berikut akan digunakan (setelah mempertimbangkan semua kombinasi lainnya)repeat
: number -> string yang berbeda.find
: thisArg -> elemen pertama dalam kecocokan array.Gagasan umumnya adalah:
di mana
somefunction
mempertimbangkanthis
argumen (x
) dan argumen pertama (elem1
atauelem2
) dan mengembalikan apakah cocok.Fungsi panah terakhir ditulis ulang menjadi
[].find.bind([elem1,elem2],somefunction)
.Array literal
Kita bisa menggunakan regex exec untuk mendapatkan array, dan
fill
itu dengan nilai yang berbeda. Misalnya/()/.exec()
mengembalikan array panjang-2, maka kita bisa mengisinya sesuai kebutuhan.Yang
somefunction
mana yang kita butuhkan?Kita memerlukan satu yang mengembalikan nilai kebenaran / kepalsuan bergantung pada
this
(yang merupakan 1 dari 2 fungsi yang akan kita kembalikan) dan argumen pertama (harus berupa string atau array).Untuk itu, saya menggunakan
indexOf
- itu mengembalikan nilai fals jika iff argumen pertama adalah awalan darithis
argumen.Mewakili fungsi literal
sumber
TI-Basic (83 series), 578 bytes
TI-Basic memiliki "halaman kode" yang sangat istimewa dengan pilihan desain yang aneh seperti memindahkan karakter spasi ke 0x29 sehingga 0x20 dapat menjadi
randM(
perintah.Sulit untuk mengetahui bagaimana mendapatkan TI-Basic untuk menghasilkan objek yang tepat. String tidak akan berfungsi karena berbagai alasan: tidak ada cara untuk mereferensikan token tanpa menggunakan token, dan kami juga tidak diizinkan
"
karakternya. Kami tidak bisa hanya menulis daftar, karena{
dan}
dilarang. Kami diizinkan[
dan]
karakter untuk matriks, tetapi matriks 1 oleh 256 tidak berfungsi, karena matriks diizinkan paling banyak 99 baris dan kolom. Kita tidak dapat menggunakan→
untuk menetapkan variabel, dan kita tidak bisa mendapatkan variabel daftarʟ
atauL₁
melaluiL₆
pula.Jadi di sini, kita menuliskan formula logis yang rumit dengan ketidaksetaraan yang mengatakan kapan karakter adalah salah satu yang ingin kita hasilkan. Kemudian kami menggunakan
seq(
perintah untuk membuat daftar dengan1
posisi itu dan di0
tempat lain. Dari sana,seq(
perintah lain dan beberapa aritmatika menyelesaikan pekerjaan.Itu adalah bagian yang menyenangkan; sisanya adalah bermain golf konstanta dan saya mungkin belum melakukan itu sebanyak mungkin. Salah satu trik yang saya gunakan adalah bahwa secara default,
Xmax
adalah 10,XFact
adalah 4, danΔTbl
1.sumber
(
dilarang.[A](I,J)
, dan dari apa yang saya mengerti Anda ingin melakukan sesuatu seperti[A](int(I/99),I-99int(I/99))
membaca semua elemen dari matriks[A]
- kami juga tidak bisa melakukan itu. (Ngomong-ngomong,)
juga dilarang. Untungnya, kita tidak harus menutup tanda kurung, tetapi membatasi bagaimana kita dapat menggunakan banyak perintah.)Brain-Flak -r, 3894 bytes
Cobalah online!
Saya menulis sebuah program untuk menghasilkan program Brain-Flak yang optimal untuk output apa pun. Asumsikan bahwa:
<>
tidak digunakan, maka solusi ini optimal.
sumber
Python 2 ,
162157 bytePeringatan : Karakter yang tidak dapat dicetak di depan!
Cobalah online!
Berdasarkan jawaban TFeld yang ada , tetapi dengan beberapa perubahan:
0xe0/7
alih-alih8+8+8+8
untuk mewakili 32. ( program untuk menemukan representasi terpendek dari angka )bytearray
untuk mewakili literal besar.A
bytearray
mirip denganstr
yang iterable, namun, iterasi memberikan bilangan bulat, bukan karakter. Kita dapat menggunakannya untuk mengkodekan basis-N literal danreduce(lambda x,y: x*N+y, my_bytearray)
mendekodekannya.Karena file Python 2 tidak memiliki encoding secara default, hanya karakter dalam ASCII (0..127) yang dapat digunakan. Null byte, baris baru, garis miring terbalik dan kutipan membutuhkan 1 byte lebih.
Juga, tidak mungkin menggunakan semua pangkalan.
Saya menulis sebuah program untuk menemukan representasi terpendek dari
n
, mengingat pembatasan itu.sumber