Salah satu tugas standar yang paling umum (terutama ketika menampilkan bahasa pemrograman esoterik) adalah untuk mengimplementasikan "program cat" : membaca semua STDIN dan mencetaknya ke STDOUT. Meskipun ini dinamai setelah utilitas shell Unix cat
, tentu saja jauh lebih kuat daripada yang asli, yang biasanya digunakan untuk mencetak (dan menyatukan) beberapa file yang dibaca dari disk.
Tugas
Anda harus menulis program lengkap yang membaca isi dari aliran input standar dan menulisnya kata demi kata ke aliran output standar. Jika dan hanya jika bahasa Anda tidak mendukung input standar dan / atau aliran keluaran (sebagaimana dipahami dalam sebagian besar bahasa), Anda dapat menggunakan istilah-istilah ini sebagai yang paling dekat dengan bahasa Anda (misalnya JavaScript prompt
dan alert
). Ini adalah satu - satunya bentuk I / O yang dapat diterima, karena antarmuka lain sebagian besar akan mengubah sifat tugas dan membuat jawaban menjadi jauh lebih tidak sebanding.
Keluaran harus mengandung input dan tidak ada yang lain . Satu-satunya pengecualian untuk aturan ini adalah output konstan dari juru bahasa Anda yang tidak dapat ditekan, seperti salam, kode warna ANSI atau lekukan. Ini juga berlaku untuk mengikuti baris baru. Jika input tidak mengandung baris tambahan, output juga tidak boleh termasuk! (Satu-satunya pengecualian adalah jika bahasa Anda benar-benar selalu mencetak baris baru setelah eksekusi.)
Keluaran ke aliran kesalahan standar diabaikan, selama arus keluaran standar berisi keluaran yang diharapkan. Secara khusus, ini berarti program Anda dapat diakhiri dengan kesalahan setelah mencapai ujung aliran (EOF), asalkan tidak mencemari aliran keluaran standar. Jika Anda melakukan ini, saya sarankan Anda untuk menambahkan versi bebas kesalahan ke jawaban Anda juga (untuk referensi).
Karena ini dimaksudkan sebagai tantangan dalam setiap bahasa dan bukan antar bahasa, ada beberapa aturan khusus bahasa:
- Jika mungkin dalam bahasa Anda untuk membedakan byte nol dalam aliran input standar dari EOF, program Anda harus mendukung byte nol seperti byte lainnya (yaitu, mereka juga harus ditulis ke aliran output standar).
- Jika memungkinkan dalam bahasa Anda untuk mendukung aliran input tak terbatas sewenang - wenang (yaitu jika Anda dapat mulai mencetak byte ke output sebelum Anda menekan EOF dalam input), program Anda harus bekerja dengan benar dalam kasus ini. Sebagai contoh
yes | tr -d \\n | ./my_cat
harus mencetak aliran tak terbatasy
s. Terserah kepada Anda seberapa sering Anda mencetak dan menyiram aliran output standar, tetapi harus dijamin akan terjadi setelah waktu yang terbatas, terlepas dari aliran (ini berarti, khususnya, bahwa Anda tidak dapat menunggu karakter tertentu seperti linefeed sebelum mencetak).
Harap tambahkan catatan pada jawaban Anda tentang perilaku pasti berkenaan dengan null-byte, aliran tak terbatas, dan output asing.
Aturan tambahan
Ini bukan tentang menemukan bahasa dengan solusi terpendek untuk ini (ada beberapa di mana program kosong melakukan trik) - ini adalah tentang menemukan solusi terpendek dalam setiap bahasa. Karenanya, tidak ada jawaban yang akan ditandai sebagai diterima.
Kiriman dalam kebanyakan bahasa akan dinilai dalam byte dalam pengkodean yang sudah ada sebelumnya, biasanya (tetapi tidak harus) UTF-8.
Beberapa bahasa, seperti Folder , agak sulit untuk dinilai. Jika ragu, silakan tanyakan di Meta .
Jangan ragu untuk menggunakan bahasa (atau versi bahasa) meskipun itu lebih baru dari tantangan ini. Bahasa yang ditulis khusus untuk mengirimkan jawaban 0-byte untuk tantangan ini adalah permainan yang adil tetapi tidak terlalu menarik.
Perhatikan bahwa harus ada juru bahasa sehingga pengajuan dapat diuji. Diperbolehkan (dan bahkan dianjurkan) untuk menulis sendiri penerjemah ini untuk bahasa yang sebelumnya tidak diterapkan.
Juga mencatat bahwa bahasa yang harus memenuhi kriteria kami biasa untuk bahasa pemrograman .
Jika bahasa pilihan Anda adalah varian sepele dari bahasa lain (yang berpotensi lebih populer) yang sudah memiliki jawaban (pikirkan dialek BASIC atau SQL, cangkang Unix atau turunan Brainfuck sepele seperti Headecks atau Unary), pertimbangkan untuk menambahkan catatan ke jawaban yang ada bahwa solusi yang sama atau sangat mirip juga merupakan yang terpendek dalam bahasa lain.
Kecuali jika telah ditolak sebelumnya, semua aturan standar kode-golf berlaku, termasuk http://meta.codegolf.stackexchange.com/q/1061 .
Sebagai catatan tambahan, tolong jangan turunkan jawaban yang membosankan (tapi valid) dalam bahasa di mana tidak banyak bermain golf; ini masih berguna untuk pertanyaan ini karena mencoba mengkompilasi katalog selengkap mungkin. Namun, lakukan sebagian besar pilihan jawaban dalam bahasa di mana penulis benar-benar harus berusaha kode golf.
Katalog
Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
## Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Misalnya:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar penalti penterjemah secara terpisah), pastikan bahwa skor aktual adalah angka terakhir di tajuk:
## Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
cat
sh
jawaban yang menggunakancat
yang juga mengandung solusi yang lebih pendek menggunakandd
.)Jawaban:
sed, 0
Program kosong
sed
melakukan persis apa yang diperlukan di sini:sumber
yes | tr -d \\n | sed ''
?yes
es ke dalam satu buffer pola hingga kehabisan memori. Sebuah peringatan saya kira ...Ziim ,
222201196185182 byteIni mungkin tidak akan ditampilkan dengan benar di browser Anda, jadi di sini adalah diagram kode:
Saya tidak bisa memikirkan struktur yang lebih sederhana untuk menyelesaikan masalah dalam Ziim, tapi saya yakin kode yang sebenarnya masih cukup golf.
Ziim tidak mungkin menangani aliran yang tidak terbatas karena hanya mungkin untuk mencetak apa pun di akhir program.
Penjelasan
Karena Ziim memiliki model aliran kontrol deklaratif yang agak unik, algoritma pseudocode imperatif tidak akan memotongnya di sini. Sebagai gantinya, saya akan menjelaskan dasar-dasar Ziim dan menyajikan struktur rapi dari kode di atas (dengan cara grafis yang serupa) sebagai seni ASCII.
Aliran kendali dalam Ziim terjadi di semua tempat: setiap panah yang tidak diarahkan oleh panah lain akan menginisialisasi "utas" yang diproses secara terpisah dari yang lain (tidak benar-benar paralel, tetapi tidak ada jaminan untuk urutan mana mereka diproses dalam , kecuali Anda menyinkronkannya melalui gabungan). Setiap utas tersebut menyimpan daftar digit biner, mulai dari
{0}
. Sekarang setiap panah dalam kode adalah semacam perintah yang memiliki satu atau dua input dan satu atau dua output. Perintah yang tepat tergantung pada berapa banyak panah yang menunjuk padanya dari mana orientasi.Berikut adalah daftar perintah, di mana
m -> n
menunjukkan bahwa perintah tersebut mengambilm
input dan menghasilkann
output.1 -> 1
, no-op : cukup arahkan utas.1 -> 1
, invert : meniadakan setiap bit di utas (dan juga mengalihkannya).1 -> 1
, baca : mengganti nilai utas dengan bit berikutnya dari STDIN, atau dengan daftar kosong jika kami telah menekan EOF.2 -> 1
, concatenate : ini adalah satu-satunya cara untuk menyinkronkan utas. Ketika utas menyentuh satu sisi panah, itu akan ditangguhkan hingga utas lainnya menyentuh sisi lain. Pada saat itu mereka akan disatukan menjadi satu utas dan melanjutkan eksekusi.2 -> 1
, label : ini adalah satu-satunya cara untuk bergabung dengan jalur eksekusi yang berbeda. Ini hanyalah no-op yang memiliki dua input yang memungkinkan. Jadi utas yang memasukkan "label" melalui salah satu rute hanya akan diarahkan ke arah yang sama.1 -> 2
, bagi : mengambil utas tunggal, dan mengirim dua salinan ke arah yang berbeda.1 -> 1
, Isero? : mengkonsumsi bit pertama dari utas, dan mengirimkan utas di salah satu dari dua arah tergantung pada apakah bit itu 0 atau 1.1 -> 1
, isEmpty? : mengkonsumsi seluruh daftar (yaitu menggantinya dengan daftar kosong), dan mengirimkan utas dalam salah satu dari dua arah tergantung pada apakah daftar itu sudah kosong atau tidak.Maka dengan itu dalam pikiran, kita dapat mengetahui strategi umum. Menggunakan concatenate, kami ingin berulang kali menambahkan bit baru ke string yang mewakili seluruh input. Kita cukup melakukan ini dengan mengulangi keluaran concatenate kembali ke salah satu inputnya (dan kita inisialisasi ini ke daftar kosong, dengan menghapus a
{0}
dengan isEmpty? ). Pertanyaannya adalah bagaimana kita dapat menghentikan proses ini.Selain menambahkan bit saat ini kami juga akan menambahkan 0 atau 1 yang menunjukkan apakah kami telah mencapai EOF. Jika kami mengirim string kami melalui isZero? , itu akan menghilangkan bit itu lagi, tetapi mari kita bedakan akhir dari stream, dalam hal ini kita cukup membiarkan thread meninggalkan tepi grid (yang menyebabkan Ziim mencetak konten thread ke STDOUT dan menghentikan program) .
Apakah kita sudah mencapai EOF atau tidak dapat ditentukan dengan menggunakan isEmpty? pada salinan input.
Inilah diagram yang saya janjikan:
Beberapa catatan tentang di mana mulai membaca:
{0}
sudut kiri atas adalah pemicu awal yang memulai loop input.{0}
ke arah sudut kanan atas segera dibersihkan untuk daftar kosong sebuah mewakili string awal yang akan kita secara bertahap mengisi dengan input.{0}
s lainnya dimasukkan ke dalam loop "produser" (satu terbalik, satu tidak), untuk memberi kita pasokan tak terbatas0
s dan1
s yang perlu kita tambahkan ke string.sumber
Hexagony , 6 byte
Dulu 3 byte (lihat di bawah), tetapi versi itu tidak berfungsi sejak pembaruan bahasa terbaru. Karena saya tidak pernah secara sengaja memperkenalkan kesalahan yang digunakan versi, saya memutuskan untuk tidak menghitungnya.
Solusi bebas kesalahan (yaitu yang bekerja dengan juru tetap) ternyata jauh lebih rumit. Saya mengalami kesulitan untuk meremasnya menjadi kotak 2x2, tapi saya menemukan satu solusi sekarang, walaupun saya membutuhkan 7 byte penuh :
Setelah dibuka, kami mendapatkan:
Karena tepi memori awal adalah 0,
<
tanpa syarat membelokkan pointer instruksi ke diagonal Timur-Timur, di mana ia membungkus ke jalur abu-abu. Ini.
adalah no-op. Sekarang,
membaca satu byte,)
menambahkannya sedemikian sehingga byte yang valid (termasuk null byte) adalah positif dan EOF adalah 0.Jadi pada EOF, IP membungkus ke jalur merah, di mana
@
mengakhiri program. Tetapi jika kita masih membaca byte, maka IP yang membungkus ke jalur hijau sebaliknya(
mengurangi tepi ke nilai asli, sebelum;
mencetaknya ke STDOUT. IP sekarang membungkus tanpa syarat kembali ke jalur abu-abu, mengulangi prosesnya.Setelah menulis skrip brute force untuk jawaban Truth Machine saya, saya mengaturnya untuk mencari solusi 6-byte bebas kesalahan untuk program cat juga. Yang mengherankan, ia memang menemukan satu - ya, tepat satu solusi dalam semua program Hexagony 6-byte yang mungkin. Setelah 50 solusi dari mesin kebenaran, itu cukup mengejutkan. Ini kodenya:
Berlangsung:
Penggunaan
~
(negasi unary) bukannya()
menarik, karena a) itu adalah no-op pada nol, b) ia menukar sisi cabang, c) dalam beberapa kode satu~
dapat digunakan dua kali untuk membatalkan operasi dengan dirinya sendiri . Jadi inilah yang terjadi:Pertama kali (jalur ungu) kami melewati
~
itu adalah no-op. The/
mencerminkan IP ke North-West diagonal. Jalur abu-abu sekarang membaca karakter dan mengalikan kode karakternya dengan-1
. Ini mengubah EOF (-1
) menjadi nilai kebenaran (positif) dan semua karakter yang valid menjadi nilai palsu (tidak positif). Dalam kasus EOF, IP mengambil jalur merah dan kode berakhir. Dalam kasus karakter yang valid, IP mengambil jalur hijau, tempat~
membatalkan negasi dan;
mencetak karakter. Ulangi.Akhirnya, di sini adalah versi 3-byte yang digunakan untuk bekerja dalam interpreter Hexagony versi asli.
Seperti jawaban Labirin, ini berakhir dengan kesalahan jika aliran input terbatas.
Setelah membuka kode, kode tersebut terkait dengan kisi heks berikut:
Tidak
.
ada op. Eksekusi dimulai di jalur ungu.,
membaca satu byte,;
menulis satu byte. Kemudian eksekusi berlanjut di jalur salmon (ish?). Kita perlu&
mengatur ulang tepi memori saat ini ke nol, sehingga IP melompat kembali ke baris ungu ketika menekan sudut di akhir baris kedua. Sekali,
klik EOF itu akan kembali-1
, yang menyebabkan kesalahan ketika;
mencoba untuk mencetaknya.Diagram yang dihasilkan dengan Timwi menakjubkan 's HexagonyColorer .
sumber
TeaScript , 0 byte
TeaScript adalah bahasa golf ringkas yang disusun untuk JavaScript
Dalam pembaruan terbaru input secara implisit ditambahkan sebagai properti pertama.
Cobalah online
Atau, 1 byte
x
berisi input dalam TeaScript. Output tersiratsumber
Brian & Chuck , 44 byte
Saya awalnya membuat bahasa ini untuk Membuat bahasa pemrograman yang hanya tampaknya tidak dapat digunakan . Ternyata menjadi latihan yang sangat bagus untuk golf masalah sederhana di dalamnya.
Dasar-Dasar: Masing-masing dari dua baris mendefinisikan program seperti Brainfuck yang beroperasi pada kode sumber program lain - program pertama disebut Brian dan yang kedua disebut Chuck. Hanya Brian yang bisa membaca dan hanya Chuck yang bisa menulis. Alih-alih loop Brainfuck Anda memiliki
?
yang melewati kontrol ke program lain (dan peran pointer instruksi dan perubahan head tape juga). Tambahan untuk Brainfuck adalah{
dan}
yang memindai rekaman itu untuk sel non-nol pertama (atau ujung kiri). Juga,_
diganti dengan byte nol.Meskipun saya pikir ini belum optimal, saya cukup senang dengan solusi ini. Upaya pertama saya adalah 84 byte, dan setelah beberapa sesi bermain golf dengan Sp3000 (dan mengambil beberapa inspirasi dari usahanya), saya berhasil membuatnya perlahan menjadi 44, beberapa byte pada suatu waktu. Terutama
+}+
trik cemerlang adalah idenya (lihat di bawah).Penjelasan
Input dibaca ke dalam sel pertama pada pita Chuck, lalu dengan susah payah disalin ke ujung pita Brian, di mana ia dicetak. Dengan menyalinnya ke akhir, kita dapat menyimpan byte pada pengaturan karakter sebelumnya ke nol.
Ini
#
hanyalah pengganti, karena kontrol beralih tidak mengeksekusi sel yang kita aktifkan.{<{
memastikan bahwa kepala kaset ada di sel pertama Chuck.,
membaca byte dari STDIN atau-1
jika kita menekan EOF. Jadi kami menambahkan bahwa dengan+
membuatnya nol untuk EOF dan bukan nol sebaliknya.Mari kita asumsikan untuk saat ini kita belum di EOF. Jadi selnya positif dan
?
akan beralih kontrol ke Chuck.}>
bergerak pita kepala (atas Brian) ke+
dalam_
dan?
melewati kontrol kembali ke Brian.{-
sekarang mengurangi sel pertama pada Chuck. Jika belum nol, kami memberikan kontrol kepada Chuck lagi?
. Kali ini}>
memindahkan kepala kaset pada Brian dua sel di kanan sel non-nol terakhir. Awalnya ada di sini:Tapi nanti, kita sudah memiliki beberapa karakter di sana. Misalnya, jika kita sudah membaca dan mencetak
abc
, maka akan terlihat seperti ini:Di mana
1
s sebenarnya 1-byte (kita akan lihat apa itu nanti).Sel ini akan selalu nol, jadi kali
?
ini tidak akan mengubah kontrol.>
bergerak sel lain ke kanan dan+
menambah sel itu. Inilah sebabnya mengapa karakter pertama dalam input berakhir tiga sel di sebelah kanan?
(dan masing-masing berikutnya tiga sel lebih jauh ke kanan).<<<
bergerak kembali ke karakter terakhir dalam daftar itu (atau?
jika itu adalah karakter pertama), dan{>
kembali ke+
pada rekaman Brian untuk mengulangi pengulangan, yang secara perlahan mentransfer sel input ke akhir rekaman Brian.Setelah sel input kosong,
?
after{-
tidak akan beralih kontrol lagi. Kemudian>}<
gerakkan kepala kaset pada Chuck ke_
dan aktifkan kontrol sedemikian rupa sehingga babak kedua Chuck dieksekusi sebagai gantinya.}>>
pindah ke sel yang sekarang telah kita tulis melewati akhir rekaman Brian, yang merupakan byte yang telah kita baca dari STDIN, jadi kita mencetaknya kembali dengan.
. Agar}
dapat melewati karakter baru ini pada pita, kita perlu menutup celah dua byte nol, jadi kita menambahkannya1
dengan<+<+
(jadi itu sebabnya ada 1-byte antara karakter aktual pada rekaman akhir). Akhirnya{<{
bergerak kembali ke awal rekaman Brian dan?
memulai semuanya dari awal.Anda mungkin bertanya-tanya apa yang terjadi jika karakter yang kita baca adalah null-byte. Dalam hal itu sel yang baru ditulis itu sendiri akan menjadi nol, tetapi karena itu pada akhir rekaman Brian dan kami tidak peduli di mana akhir itu, kita bisa mengabaikannya. Itu berarti jika inputnya adalah
ab\0de
, maka rekaman Brian akan benar-benar tampak seperti:Akhirnya, begitu kita menekan EOF yang pertama
?
pada rekaman Brian akan menjadi no-op. Pada titik ini kami mengakhiri program. Solusi naif akan pindah ke akhir rekaman dan beralih kontrol Chuck, seperti bahwa termiantes Program:>}>}<?
. Di sinilah ide pintar Sp3000 menghemat tiga byte:+
mengubah sel pertama Chuck menjadi1
. Itu berarti}
memiliki titik awal dan menemukan_
di tengah pita Chuck. Alih-alih melewatinya, kita cukup menutup celah dengan mengubahnya menjadi1
dengan+
juga. Sekarang mari kita lihat apa yang terjadi dengan sisa kode Brian dengan Chuck yang dimodifikasi ini ...{
kembali ke sel pertama Chuck seperti biasa, dan-
mengubahnya kembali menjadi nol-byte. Itu berarti itu?
adalah no-op. Tapi sekarang>}<
, yang biasanya memindahkan kepala kaset ke tengah kaset Chuck, bergerak melewatinya ke akhir kaset Chuck dan?
kemudian memberikan kontrol ke Chuck, mengakhiri kode. Sangat menyenangkan ketika semuanya berhasil ... :)sumber
Haskell, 16 byte
interact
membaca input, meneruskannya ke fungsi yang diberikan sebagai argumennya dan mencetak hasil yang diterimanya.id
adalah fungsi identitas, yaitu mengembalikan inputnya tidak berubah. Berkat kemalasan Haskellinteract
dapat bekerja dengan input yang tak terbatas.sumber
sh + binutils,
32 byteYah, tidak begitu jelas. Dari @ Random832
Asli:
Yang sangat menyakitkan ...: D
sumber
dd
.cat
???Funciton , 16 byte
(Dikodekan sebagai UTF-16 dengan BOM)
Penjelasan
Kotak mengembalikan konten STDIN. Ujung longgar output itu.
sumber
Kode Mesin Motorola MC14500B , 1,5 byte
Ditulis dalam heksadesimal:
Ditulis dalam biner:
Penjelasan
Opcode masing-masing 4 bit.
sumber
Mornington Crescent , 41 byte
Saya tidak tahu apakah Mornington Crescent dapat menangani byte nol, dan semua input dibaca sebelum program dimulai, karena itu adalah sifat dari bahasa tersebut.
sumber
Brainfuck, 5 byte
Setara dengan kodesemu:
Ini menangani aliran tanpa batas, tetapi memperlakukan byte nol sebagai EOF. Apakah BF dapat menangani byte nol dengan benar bervariasi dari implementasi ke implementasi, tetapi ini mengasumsikan pendekatan yang paling umum.
sumber
+[,.]
benar?Labirin , 2 byte
Jika aliran terbatas, ini akan diakhiri dengan kesalahan, tetapi semua output yang dihasilkan oleh kesalahan tersebut masuk ke STDERR, sehingga aliran keluaran standar sudah benar.
Seperti dalam Brainfuck
,
membaca byte (mendorongnya ke tumpukan utama Labyrinth) dan.
menulis byte (muncul dari tumpukan utama Labyrinth).Alasan loop ini adalah karena keduanya
,
dan.
"buntu" di labirin (sangat sepele) yang diwakili oleh kode sumber, sehingga penunjuk instruksi hanya berbalik di tempat dan bergerak kembali ke perintah lain.Saat kami menekan EOF, alih-alih
,
mendorong-1
dan.
melempar kesalahan karena-1
bukan kode karakter yang valid. Ini mungkin benar-benar berubah di masa depan, tetapi saya belum memutuskan ini.Sebagai referensi, kita dapat menyelesaikan ini tanpa kesalahan dalam 6 byte sebagai berikut
Di sini,
)
kenaikan byte yang kita baca, yang memberi0
pada EOF dan sesuatu yang positif sebaliknya. Jika nilainya0
, IP bergerak lurus, menekan@
yang menghentikan program. Jika nilainya positif, IP akan mengambil belokan kanan ke arah(
mana yang menurunkan bagian atas tumpukan kembali ke nilai aslinya. IP sekarang di sudut dan hanya akan terus berbelok ke kanan, mencetak dengan.
, membaca byte baru dengan.
, sebelum menyentuh garpu)
sekali lagi.sumber
C, 40 byte
sumber
getchar
mengembalikan -1 , sehingga kode Anda akan mencetak aliran tak terhingga dari 0xFF byte setelah input (terbatas).> <> , 7 byte
Coba di sini . Penjelasan:
Jika Anda ingin terus berjalan sampai Anda memberikan lebih banyak input, ganti
;
dengan!
.sumber
io
(2 byte) melakukan hal yang sama, tetapi crash dan menulissomething smells fishy...
ke STDERR pada akhir eksekusi, yang diizinkan.Perakitan X86, 70 byte
Disassembly dengan
objdump
:Sumber:
sumber
objdump
bongkar sebagai kode 32-bit, sementara Anda tampaknya telah dikompilasi sebagai 16-bit. Apa yang harus dipercaya? Karena Anda menggunakanint 0x80
, saya kira itu dimaksudkan untuk Linux, tetapi mengapa mengkompilasi sebagai 16-bit?Universal Lambda , 1 byte
Program Universal Lambda adalah pengkodean istilah lambda dalam biner, dipotong-potong menjadi 8 bit, melapisi potongan yang tidak lengkap dengan bit apa pun , dikonversi ke aliran byte.
Bit diterjemahkan ke dalam istilah lambda sebagai berikut:
00
memperkenalkan abstraksi lambda.01
mewakili aplikasi dari dua istilah berikutnya.111..10
, dengan n pengulangan bit1
, merujuk ke variabel lambda induk ke- n ; yaitu indeks De Bruijn di unary.Dengan konversi ini,
0010
adalah fungsi identitasλa.a
, yang berarti program byte tunggal dari formulir0010xxxx
adalahcat
program.sumber
!
ini0x21
, tidak0x4_
?PowerShell,
884130 BytesEDIT - lupa bahwa saya dapat menggunakan
$input
variabel otomatis untuk input pipa ... EDIT2 - tidak perlu menguji keberadaannya$input
Ya, jadi ... STDIN di PowerShell adalah ... aneh, bisa kita katakan. Dengan asumsi bahwa kami perlu menerima masukan dari semua jenis STDIN, ini adalah salah satu jawaban yang mungkin untuk katalog ini, dan saya yakin ada yang lain. 1
Input pipeline di PowerShell tidak berfungsi seperti yang Anda pikirkan. Karena pemipaan di PowerShell adalah fungsi dari bahasa, dan bukan fungsi dari lingkungan / shell (dan PowerShell sebenarnya bukan semata - mata bahasa), ada beberapa kebiasaan untuk perilaku.
Sebagai permulaan, dan yang paling relevan dengan entri ini, pipa tidak dievaluasi secara instan (sebagian besar waktu). Artinya, jika kita miliki
command1 | command2 | command3
di shell kita,command2
tidak akan mengambil input atau mulai memproses sampaicommand1
selesai ... kecuali jika Anda merangkum Andacommand1
denganForEach-Object
... yang berbeda dariForEach
. (MeskipunForEach
alias untukForEach-Object
, tapi itu masalah terpisah, karena saya berbicaraForEach
sebagai pernyataan, bukan alias)Ini berarti bahwa sesuatu seperti
yes | .\simple-cat-program.ps1
(meskipunyes
tidak benar-benar ada, tetapi apa pun) tidak akan berhasil karenayes
tidak akan pernah lengkap. Jika kita bisa melakukanForEach-Object -InputObject(yes) | .\simple-cat-program.ps1
itu seharusnya (secara teori) bekerja.Mengenal ForEach dan ForEach-Object di Microsoft "Hei, Scripting Guy!" blog.
Jadi, semua paragraf itu menjelaskan mengapa
if($input){$input}
ada. Kami mengambil parameter input yang khusus dibuat secara otomatis jika input pipa hadir, uji apakah ada, dan jika demikian, outputkan.Kemudian, kami mengambil input dari pengguna
(read-host)
melalui apa yang pada dasarnya merupakan aliran STDIN yang terpisah, danwrite-host
kembali, dengan-n
bendera (kependekan dari-NoNewLine
). Perhatikan bahwa ini tidak mendukung input panjang sewenang-wenang, karenaread-host
hanya akan selesai ketika umpan baris dimasukkan (secara teknis ketika pengguna menekan "Enter", tetapi setara secara fungsional).Fiuh.
1 Tetapi ada opsi lain:
Sebagai contoh, jika kita prihatin dengan hanya masukan pipa, dan kita tidak memerlukan program penuh, Anda bisa melakukan sesuatu seperti
| $_
yang akan hanya output apa pun masukan. (Secara umum, itu agak berlebihan, karena PowerShell memiliki keluaran implisit dari hal-hal "tertinggal" setelah perhitungan, tapi itu samping.)Jika kita hanya peduli dengan input pengguna interaktif, kita bisa menggunakan adil
write-host(read-host)-n
.Selain itu, fungsi ini memiliki fiturunikuntuk menerima input baris perintah, misalnya.\simple-cat-program.ps1 "test"
akan mengisi (dan kemudian mengeluarkan)$a
variabel.sumber
Cubix ,
65 byteSekarang menangani byte nol!
Cubix adalah esolang 2 dimensi, berbasis tumpukan. Cubix berbeda dari langs 2D lain dalam hal kode sumber dililitkan di luar kubus.
Uji secara online! Catatan: ada penundaan 50 ms antara iterasi.
Penjelasan
Hal pertama yang dilakukan penerjemah adalah menemukan kubus terkecil yang sesuai dengan kode tersebut. Dalam hal ini, panjang tepi adalah 1. Kemudian kode diisi dengan no-ops
.
hingga keenam sisi terisi. Spasi dihapus sebelum diproses, jadi kode ini identik dengan yang di atas:Sekarang kodenya dijalankan. IP (penunjuk instruksi) dimulai pada wajah paling kiri, menunjuk ke timur.
Karakter pertama yang ditemui IP adalah
_
, yang merupakan cermin yang mengubah IP sekitar jika menghadap ke utara atau selatan; saat ini menghadap ke timur, jadi ini tidak melakukan apa-apa. Selanjutnya adalahi
, yang memasukkan byte dari STDIN.?
belokkan IP ke kiri jika item teratas negatif, atau kanan jika positif. Ada tiga kemungkinan jalur di sini:@
, yang mengakhiri program.o
._
. Ini memutarnya, mengirimkannya kembali ke?
, yang mengubahnya lagi dan menghasilkan byte.Saya pikir program ini optimal. Sebelum Cubix dapat menangani byte nol (EOF adalah 0, bukan -1), program ini bekerja untuk semuanya kecuali byte nol:
Saya telah menulis brute-forcer untuk menemukan semua program kucing 5-byte. Meskipun dibutuhkan ~ 5 menit untuk menyelesaikannya, versi terbaru telah menemukan 5 program:
sumber
Vitsy, 2 byte
z
mendapatkan semua tumpukan input dan mendorongnya ke tumpukan program yang aktif.Z
mencetak semua tumpukan aktif ke STDOUT.Metode alternatif:
sumber
MarioLANG , 11 byte
Saya tidak sepenuhnya yakin ini optimal, tetapi ini adalah yang terpendek yang saya temukan.
Ini mendukung aliran yang tak terbatas dan akan diakhiri dengan kesalahan saat mencapai EOF (setidaknya implementasi referensi Ruby tidak).
Ada versi lain dari ini yang mengubah Mario menjadi ninja yang dapat melipatgandakan melompat:
Dalam kedua kasus tersebut, Mario mulai jatuh ke kolom kiri, di mana
,
membaca byte dan.
menulis byte (yang melempar kesalahan pada EOF karena,
tidak mengembalikan karakter yang valid).>
memastikan bahwa Mario berjalan ke kanan (=
hanya tanah baginya untuk berjalan). Kemudian dia bergerak ke atas, baik melalui lompatan ganda dengan^
atau melalui lift ("
dan#
pasangan) sebelum<
memberitahu dia untuk pindah kembali ke kolom kiri.sumber
rs , 0 byte
Serius. rs hanya mencetak apa saja jika skrip yang diberikan benar-benar kosong.
sumber
GolfScript, 3 byte
Program kosong menggemakan input standar. Bahasa tidak mungkin menangani aliran yang tak terbatas. Namun, itu menambahkan baris baru, seperti yang disebutkan @Dennis. Itu melakukannya dengan membungkus seluruh tumpukan dalam array dan panggilan
puts
, yang didefinisikan sebagaiprint n print
, di manan
baris baru. Namun, kita dapat mendefinisikan kembalin
menjadi STDIN, dan kemudian mengosongkan tumpukan, dan memang itulah yang:n;
dilakukan.sumber
Mobil Setengah Rusak dalam Lalu Lintas Berat , 9 + 3 = 12 byte
Mobil Setengah Rusak di Lalu Lintas Berat (HBCHT) mengambil input sebagai argumen baris perintah, jadi jalankan seperti
Perhatikan bahwa +3 untuk
-s
bendera, yang ditampilkan sebagai karakter. Juga, HBCHT tampaknya tidak menangani NUL, karena semua nol dijatuhkan dari output (misalnya97 0 98
adalah output sebagai dua karakterab
).Penjelasan
Di HBCHT, mobil Anda mulai di
o
dan tujuan Anda adalah pintu keluar#
.^>v<
mengarahkan gerakan mobil, sementara secara bersamaan memodifikasi pita seperti BF (^>v<
diterjemahkan ke+>-<
). Namun, seperti yang disarankan oleh nama bahasa, mobil Anda hanya dapat berbelok ke kanan - segala upaya untuk belok kiri diabaikan sepenuhnya (termasuk efek ingatannya). Perhatikan bahwa ini hanya untuk belok - mobil Anda benar-benar mampu melaju ke depan / membalikkan arah.Bagian menarik lainnya tentang HBCHT adalah bahwa arah awal mobil Anda diacak, dan kisi-kisi adalah toroidal. Jadi kita hanya perlu mobil untuk sampai ke pintu keluar tanpa mengubah rekaman untuk keempat arah awal:
Atas dan ke bawah sangat mudah, langsung menuju ke pintu keluar.
Untuk kiri, kami bungkus dan jalankan
<
dan tambahkan^
. Kami tidak dapat belok kiri di berikutnya<
sehingga kami membungkus dan mengurangi denganv
, meniadakan kenaikan sebelumnya. Karena kita menuju ke bawah sekarang, kita dapat belok kanan di<
dan keluar, setelah memindahkan pointer dua kali dan tidak mengubah nilai sel.Untuk kanan, kami melakukan hal yang sama seperti kiri tetapi lewati dulu
^
karena kami tidak bisa belok kiri.Sunting : Ternyata penerjemah HBCHT membiarkan Anda mengeksekusi hanya satu jalur tunggal melalui flag baris perintah, misalnya
Namun, tidak hanya flag yang terlalu mahal untuk pertanyaan khusus ini (setidaknya 5 byte untuk
" -d u"
), tampaknya semua jalur masih harus dapat membuatnya ke pintu keluar untuk mengeksekusi kode.sumber
Minkolang , 5 byte
Coba di sini.
Penjelasan
o
membaca karakter dari input dan mendorong kode ASCII ke stack (0
jika input kosong).d
kemudian menggandakan bagian atas tumpukan (karakter yang baru saja dibaca).?
adalah trampolin bersyarat, yang melompat instruksi berikutnya dari puncak tumpukan tidak0
. Jika input kosong, maka.
tidak melompat dan program berhenti. Jika tidak,O
output atas tumpukan sebagai karakter. Sifat toroidal Minkolang berarti bahwa ini berputar ke awal.sumber
INTERCALL , 133 byte
wat
sumber
500
(tidak yakin), itu akan menjadiPRINT D
, bukan? (tidak termasuk header)PUSH XX<newline>PRINT
atauPUSH XX AND PRINT
. Oh dan saya pencipta INTERCALLV , 0 byte
Cobalah online!
Gagasan V tentang "memori" hanyalah deretan karakter 2D raksasa. Sebelum program dijalankan, semua input dimasukkan ke dalam array ini (dikenal sebagai "Penyangga"). Kemudian, di akhir program apa pun, semua teks dalam buffer dicetak.
Dengan kata lain, program kosong adalah program kucing.
sumber
Snowman 1.0.2 , 15 karakter
Diambil langsung dari
examples
direktori Snowman . Membaca garis, mencetak garis, membaca garis, mencetak garis ...Perhatikan bahwa karena detail implementasi, ketika STDIN kosong,
vg
akan mengembalikan hal yang sama seperti untuk baris kosong. Oleh karena itu, ini akan berulang kali mencetak baris baru dalam loop tak terbatas setelah STDIN ditutup. Ini mungkin diperbaiki di versi mendatang.Penjelasan kode:
sumber
FireType , 7 byte
Membutuhkan beberapa perubahan yang baru saja saya dorong . Aturan mengatakan:
jadi saya jelas!
sumber
Fisi , 4 byte
Bukankah itu menyenangkan ketika Anda mengalahkan sampel program dalam repositori bahasa sendiri? :) Untuk referensi, ia memiliki solusi 7-byte
Penjelasan
Jadi, mulailah
R
aliran kontrol dengan atom yang berjalan benar.?
membaca karakter dari STDIN ke dalam massa atom. Selama kita membaca karakter, energinya tetap nol, jadiJ
ump adalah no-op dan!
mencetak karakter. Atom loop kembali ke awal (R
sekarang adalah no-op) dan mengulangi seluruh proses.Ketika kita menekan EOF,
?
akan mengatur energi atom1
, jadiJ
ump sekarang akan melewatkan perintah cetak. Tetapi ketika sebuah atom mengenai?
setelah EOF telah dikembalikan, itu akan menghancurkan atom sebagai gantinya, yang mengakhiri program.(Solusi dari penulis bahasa menggunakan eksplisit
;
untuk mengakhiri program, yang dilewati dengan dua-0
portal sebaliknya.)sumber
Shtriped , 20 byte
Ini menunjukkan bahwa hampir semua string ASCII yang dapat dicetak adalah pengidentifikasi yang valid di Shtriped.
Bagaimana itu bekerja:
Tidak ada cara nyata untuk mendeteksi EOF, jadi loop ini selamanya seperti jawaban Python .
Anda dapat dengan mudah membuatnya berhenti ketika baris kosong diberikan (30 byte):
Perhatikan bahwa Shtriped I / O hanya mendukung ASCII yang dapat dicetak , tab, feed garis, carriage return, tab vertikal, dan form feed (total 100 karakter). Ini karena secara internal, string direpresentasikan sebagai integer presisi arbitrer non-negatif, dan harus ada alfabet karakter yang terbatas untuk dapat menyandikan semua string.
sumber