yes
, dari coreutils, panjangnya 91 baris . Banyak dari mereka adalah komentar, tapi yang masih WAY terlalu lama.
Sunting mulai September 2019: file sumber bertambah selama lima tahun terakhir dan sekarang mencapai 126 baris.
Tulis program yang meniru yes
:
- keluaran ke
stdout
aliran tak terbatas "y \ n" - harus ada opsi untuk menghentikannya selain mematikan proses dengan
SIGKILL
: tetapiSIGINT
danSIGPIPE
baik-baik saja - Anda tidak diperbolehkan menggunakan "y" atau "\ n" atau nilai ASCII mereka (121, 0x79, 0171, 10, 0xA atau 012)
Jawaban terpendek menang.
Bonus:
- kurangi 10 dari panjang kode Anda, jika Anda dapat menerima frasa masuk
stdin
dan mencetaknya alih-alih "y" (tetapi masih termasuk baris-break).
code-golf
restricted-source
Ramon Snir
sumber
sumber
y
atau\n
di dalam string literal"?true.c
panjangnya 80 baris.yes
mengambil argumen opsional pada baris perintah, bukanstdin
.y
sendiri.Jawaban:
CJam, 13 byte - 10 = 3
Anda harus menggunakan penerjemah Java untuk ini, karena penerjemah online hanya mengembalikan setelah program berakhir.
Anda dapat membatalkan program dengan SIGINT (dengan menekan Ctrl-C). Ini akan membaca baris dari STDIN, dan mencetak baris itu, atau
y
jika inputnya kosong.Penjelasan
Setelah klarifikasi OP, berikut ini sepertinya lebih spesifik:
Saya akan menunggu dengan memperbarui kiriman sampai OP membalas komentar saya.
sumber
/no/i
, mengingat apa tantangannya.Brainfuck - 38 byte
Itu tidak menggunakan 10 atau 121, karena
+-<>.,[]
semua karakter yang berarti dalam bahasa tetap, tetapi menghitungnya cukup naif (0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 10, 10 * 12 + 1 = 121).Ini mungkin tergantung pada juru bahasa, tetapi ia mati
^C
pada mesin saya.Brainfuck - (63-10) = 53
sumber
Python 3, 27 byte
Bekerja dengan setidaknya CPython dan Jython.
SIGINT menghentikannya.
sumber
while 1:print`help`[1]
.chr(11**2)
untuk menyimpan beberapa karakter juga121
.Marbelous 14 byte
Ini cukup mudah, perangkat '/ \' menempatkan dua salinan di sisi kiri dan kanannya, yang kanan bertambah
++
kemudian jatuh dari papan dan dicetak. The]]
perangkat mendorong setiap marmer ke kanan jika STDIN kosong tetapi memungkinkan byte pertama pada STDIN jatuh jika tidak. Ini kemudian akan memicu!!
perangkat, yang keluar dari papan. Jadi ini akan mencetak y \ n sampai Anda memasukkan apa pun di stdin.Ini hanya berfungsi pada interpreter python.
sumber
Pyth,
1096 byte - 10 =0-1-4Saya sudah berusaha selama bertahun-tahun untuk mendapatkan yang saya puas. Pada dasarnya dikonversi ke:
sumber
#
memiliki fungsi yang setara denganW1
, danePG
merupakan cara yang jauh lebih pendek untuk mendapatkan karaktery
daripadaC^hT2
.C #,
817876 byteTidak dapat bersaing dengan bahasa lain, tetapi ini dia:
Dapat dibunuh dengan SIGINT dengan menekan Ctrl+ C.
Tidak ada bonus, karena akan membutuhkan lebih dari 10 byte untuk mendapatkannya.
sumber
while(1)
? Menghemat dua karakter.for(;;)
harus bekerja.y
di dalamnya. Tolong periksaSystem
.System
tidak bisa dihapus. itu adalah namespace teratas di .NET Framework, semua kelas / ruang nama lain ada di dalamnya, jadi refleksi tidak akan membantu di sini. Tetapi tidak yakin apakah itu tidak valid. Lihat komentar Ramon: "tidak ada yang mengevaluasi ke y atau \ n". Ini tidak dievaluasi untuky
. Saya meninggalkan komentar pada pertanyaan untuk bertanya kepada Ramon apakah ini valid.Jawa, 178
Pencetakan membutuhkan
System
, tetapiy
karakter tersebut dilarang. Karena itu, saya harus menggunakan refleksi.sumber
;
dengan memasukkanchar c='x'+1;
ke dalamfor
deklarasi loop, jadifor(char c='x'+1;;)
karena Anda memiliki titik koma kosong di sanaPerl: 18 byte - 10 = 8
String berasal dari STDIN.
sumber
y\n
berulang kali jika tidak menerima input dari STDIN? Jika tidak, maka itu tidak meniru dengan benaryes
.yes
tidak menerima input dariSTDIN
semuanya :)y\n
.Ruby,
302318 byteDapat dibunuh dengan SIGINT dengan menekan Ctrl+ C.
Berkat manatwork untuk berbagi peningkatan!
sumber
loop{puts [*?x..?z][1]}
- 23 chars,loop{puts ?x.succ}
- 18 charsPerl, 26 byte
Masukan khusus dari argumen (seperti
yes
benar - benar berfungsi), 22 byte-10 = 12Masukan khusus dari stdin, 22 byte-10 = 12
sumber
C,
6455534540 - 10 = 30main(int c,int**a){for(;;)puts(a[c>1]);}
Saya tidak terlalu senang dengan ini, karena membutuhkan program untuk dinamai "y", dan dipanggil dengan `y` saja, jadi itu harus dalam $ PATH, tapi hei, codegolf pertama :)
Alternatif:
C, 30 (+ 1 nama file)
main(){for(;;)puts(__FILE__);}
Menggunakan teknik yang sama dengan rekan saya yang terhormat @Matt Windsor
sumber
Linux Bash, 33-10 = 23
Dapat dibunuh dengan SIGINT dengan menekan Ctrl+ C.
sumber
yes
tapicat
program.read a;for((;;));{ echo $a;}
Rust, 52 karakter
Sepertinya tidak ada cara komputasi yang bagus
y
tanpa nakal di Rust - mereka telah membuat pekerjaan chars dengan aman menjadi terlalu baik. SAYA:println!
, jadi tidak ada trik yang diizinkan di sana;'x'
, karena di Rust chars bukan angka;Juga tidak akan mendapatkan bonus kode yang sepadan, karena membaca dari
stdin
akan membutuhkan penanganan kesalahan = 3Banyak dari pengurangan kode yang saya temukan terlibat dalam melakukan hal-hal yang melanggar aturan dengan lingkungan kompiler:
Rust, 44 karakter (+ setidaknya 1 karakter untuk nama file)
Usang oleh di bawah ini. Yang ini mungkin tidak masuk hitungan, karena nama file sumber perlu dimulai
y
.Sunting: Rust, 36 karakter (35 sumber, 1 nama file)
Seperti di atas, tetapi file tersebut harus dipanggil
y
(bukany.rs
,y
). Dengan lucu, Rust akan menimpa sumber dengan biner! Setidaknya di komputer saya, biner tidak berfungsi setelah itu.Rust, 37 karakter (+ setara dengan
env K='y'
di platform Anda)Yang satu ini bahkan lebih buruk: Anda perlu mengatur variabel lingkungan
K
untuky
di waktu kompilasi .Mengedit : jika Anda mengatur
K
untuky\n
, Anda bisa dropln
diprintln!
, untuk grand total35 karakter danbeberapa facepalms:sumber
x
cara, tetapi itu masih tidak singkat:(b'x' + 1) as char
Linux Bash - 19 byte
Ini mungkin curang dan dapat gagal jika Anda tidak memiliki / usr / bin / yes atau memiliki / usr / bin / xes atau / usr / bin / zes:
Saya pikir itu memenuhi persyaratan, meskipun mungkin itu melanggar aturan "tidak ada yang mengevaluasi y". Dan mungkin meniru
yes
dengan berlari sebenarnyayes
melanggar aturan.Ini dapat dioptimalkan sedikit (meskipun lebih kecil kemungkinannya bekerja) untuk menurunkannya menjadi 11 byte:
Saya tidak tahu bagaimana cara mendapatkan bonus 10 poin dengan membaca string dari stdin tanpa menambahkan lebih dari 10 byte ke kode
sumber
/*/*/?es `line`
, atau/*/*/?es `head -n1`
jika Anda tidak punya/usr/bin/line
.sed q
untukline
.dc, 12
Hanya keluaran
y\n
. Tidak membaca dari stdin, jadi tidak ada bonus.30986 adalah 0x790A (yaitu "y \ n"). The
P
perintah hanya mengkonversi jumlah ke basis 256, dan mencetak sesuai karakter untuk setiap basis 256 digit.sumber
y\n
?P
tetapi tidak tahu itu bisa melakukan lebih dari satu karakter sekaligus.Gangguan Umum: (30-10) = 20
(read)
dari aliran input(format t ... )
format
argumen (hanya satu di sini):~@{ ... ~}
di dalam loop, untuk setiap argumen:
~A
diikuti oleh baris baru~%
~:*
(infinite loop)Anda dapat memutus perulangan dengan Ctrl+C, yang menandakan kesalahan dengan opsi mulai ulang (lanjutkan / batalkan).
sumber
Haskell, 29 byte
Saya percaya ini dihentikan oleh keduanya
SIGINT
danSIGPIPE
.sumber
'\89'
sebagai gantisucc 'x'
Ruby, 27 byte - 10 = 17
Ini hanya solusi @ ProgramFOX dengan bonus (butuh 9 byte saya untuk menyelesaikan pertanyaan bonus).
sumber
dc, 21 byte - 10 = 11
Perhatikan bahwa input perlu dimasukkan
[]
, misalnya[no]
, karena?
merupakan satu-satunya cara untuk mengambil input, yang mengeksekusinya sebagaidc
kode.sumber
C2
bukan122
. Bahkan saya berpendapat bahwa122 1-
bisa diganti denganC1
yangC1
tidak secara eksplisit dilarang dalam pertanyaanCommodore 64 Basic:
1413 byteSeperti biasa, saya telah membuat pergantian karakter di PETSCII yang tidak ada di Unicode.
|
digunakan untuk mewakiliSHIFT+H
, sementara╭
mewakiliSHIFT+U
. Perhatikan bahwa ini menghasilkan ASCII 'y' (nilai byte 121) daripada karakter yang ditampilkan oleh karakter Commodore default sebagai 'y'.BASIC seharusnya merupakan bahasa pemrograman yang mudah dipelajari, seperti bahasa Inggris. Lemparkan dalam pintasan pengetikan yang hadir dalam banyak dialek awal, dan Anda mendapatkan sesuatu yang lebih pendek dan kurang terbaca dari Perl.
EDIT : Dalam "mode bergeser", ini mendapatkan dua byte lebih pendek, berkat huruf kecil "y" yang dikodekan pada nilai desimal 89. Menggunakan karakter non-ASCII yang diatur untuk menyiasati aturan "tidak diizinkan untuk menggunakan nilai ASCII mereka" mungkin selingkuh.
sumber
SHIFT+H
, tetapi karakter pipa lebih mudah untuk diketik. Tidak ada yang sesuai dengan "garis di tepi atas dan kiri" yang diproduksi oleh `SHIFT + O"AWK, 38 byte
Varian yang akan membaca string pada stdin: 14 bytes-10 = 4
Tetapi karena tidak bisa melakukan keduanya (kembali ke "y" jika tidak ada stdin yang disediakan), saya tidak yakin itu penting ...: o)
Keduanya dapat keluar dengan Ctrl + C.
sumber
Fission , 5 byte
Ini cukup kompetitif untuk Fission. :)
Aliran kendali dimulai dengan
(1,0)
atom yang tepat diR
.x
mengatur massa untuk120
, dan+
menambahkannya untuk diberikan(121,0)
. Kemudian!
cetak karakter yang sesuai (y
) danN
mencetak baris baru. Kode sumber membungkus di tepi, sehingga atom lewatR
lagi (yang tidak melakukan apa-apa sekarang),x
mengatur massa untuk120
lagi,+
menambahnya dan seterusnya dan seterusnya ...sumber
C, 32 byte
Membutuhkan sedikit mesin endian dan kompilasi dengan -O2 (untuk menghindari stack overflow).
sumber
PowerShell, 27 - 10 = 17
Mungkin tidak berfungsi di Pash. Alternatif yang lebih kuat seharusnya
sumber
Lua, 42 byte - 10 = 32
Lua, 49 byte - 10 = 39
Keduanya diuji dengan Lua 5.1.4 dan dapat dibunuh dengan SIGINT ( Ctrl+ C).
sumber
Perl, 31
Berikut adalah versi Perl yang benar-benar berperilaku seperti GNU
yes
, sejauh yang saya tahu:Ini berfungsi jika tidak apa-apa untuk menggunakan switch baris perintah perl (
-l
untuk baris baru), jika tidak maka akan menjadi 3 karakter lebih lama:sumber
-l
(bukan-e
) saklar untuk baris baru.CAPL 1.5+; 6 tanpa input; 10 - 10 = 0 dengan input
Sidenote
Saya telah membaca di suatu tempat [tautan?] Bahwa bahasa khusus tidak diperbolehkan dalam pertanyaan golf, karena mereka dapat membuat fungsi bawaan yang melakukan persis apa yang ditanyakan, namun saya membuat CAPL untuk membuat golf lebih mudah secara umum . Jika Anda pikir ini tidak diperbolehkan di sini, beri tahu saya!
Saya mendapat beberapa ide dari > <> dan Befunge (Anda dapat berpindah di antara baris dan menggunakan karakter heksadesimal untuk menekan angka), beberapa dari Ruby dan beberapa dari saya sendiri untuk membuat bermain golf lebih mudah.
CAPL membaca dari kiri ke kanan, dan turun satu baris di akhir baris. Jika ini sebagai baris terakhir, program akan berhenti.
Karena belum ada yang tahu bahasa ini, saya akan mencoba menjelaskan sebanyak mungkin.
Keluaran y. 6 byte
bb*.n<
bb*
b
adalah heksadesimal untuk11
, demikianbb*
juga11*11
=121
, yang merupakan setara dengan UTF-8 dariy
. Nilai ini didorong ke tumpukan..
Pops nilai teratas dari tumpukan, dan output sebagai UTF-8. Seperti121
di atas tumpukan, indeks diabaikan di sini.n
Outputs a newline<
Mengirim pointer kembali ke awal baris, sehingga mengulangi baris itu. Karena kami tidak mengharapkan input, kami dapat melakukan ini dengan aman tanpa meminta kembali input tersebut.Mengeluarkan dari input. 10 byte, 0 setelah bonus
i~a&{X:.)}
i
Mengambil input dari pengguna, mendorong sebagai UTF-8 di bagian atas tumpukan, dan mendorong panjang setelah itu. Yaitu[72,101,108,108,111,5]
~
Memunculkan nomor dari tumpukan, lalu membalikkan jumlah byte itu. Yaitu[111,108,108,101,72]
a
Heksadesimal untuk10
, karakter baris baru&{...}
Membuat loop tak terbatas. Kami memiliki input, jadi kami tidak dapat mengirim pointer kembali ke baris. Saya dapat menempatkan fungsi pada baris di bawah ini, yang akan menyelamatkan saya satu byte, tetapi baris baru tidak diizinkan dalam tantangan ini.X
Menghapus nilai teratas dari tumpukan (Indeks dari loop):.
Menduplikat nilai atas, lalu mengeluarkannya sebagai UTF-8.)
Memutar tumpukan ke kanan. ([1,2,3,4,5]
->[5,1,2,3,4]
)Bagaimanapun, ini berarti kita mulai dengan baris baru, kemudian mulai mengeluarkan input, lalu baris baru, kemudian input, dll. Jika kita tidak diizinkan untuk memulai dengan baris baru, gunakan kode berikut dengan 12 byte, atau 2 setelah mengurangi bonus.
iXa#~&{X:.)}
Satu-satunya perintah baru di sini adalah
#
, yang mendorong jumlah item pada stack ke stack.Saya menghapus panjang dari
i
, karena menambahkan 1, kemudian bertukar dengan baris baru lebih lama daripada menghapus dan mendapatkan panjang lagi.Hanya untuk bersenang-senang, ini adalah program "Hello World"
The
?!
operasi adalah sama> <> 'ssumber
APL (Dyalog APL) , 5 - 10 = -5 byte
Peringatan: bergantung pada fitur / bug yang tidak terdokumentasi dan tidak didukung.
STDIN kosong mencetak garis kosong (bukan "y"), yang diizinkan dan telah disarankan .
Cobalah online!
⎕
STDOUT dengan mengikuti baris baru,←
mendapat⍣
berulang kali sampai≢
berbeda dari⍞
STDINyaitu tidak pernah, tetapi tidak pernah terputus dengan menjeda utas.
sumber
⍣
pada penugasan←
, meskipun←
bukan fungsi yang sebenarnya layak, dan dengan demikian tidak benar-benar memenuhi syarat untuk menjadi operan. Masih bekerja melalui ...> <>, 6 byte
Dengan tidak menyertakan a
;
di akhir, <> akan terus berenang sampai dia dibebaskan oleh SIGINT.Penjelasan
> <>, 17 - 10 = 7 byte
Sebelumnya adalah solusi yang cukup membosankan, jadi inilah yang mengambil input dari stdin. Ini menyalahgunakan fakta bahwa cara default untuk memasok input ke program > <> adalah
echo 'input' | fish.py yes.fish
, di manaecho
menyediakan\n
karakter.Penjelasan
Pada
0r
akhirnya memungkinkan untuk loop terjadi dengan membungkus, di mana kita masih menganggap tumpukan dibalik dengan-1
di atas.sumber
Tampaknya ini tidak sepenuhnya portabel. Saya
sys.version
adalah2.7.9 (default, Dec 11 2014, 04:42:00) \n[GCC 4.9.2]
, jadi jika Anda berbeda ini mungkin tidak bekerja saya kira.Python 2 - (76-10) = 66
Cukup lama, tapi saya ingin mendapatkan bonus (meskipun harganya lebih dari 10 byte). Memeriksa apakah stdin kosong atau tidak tanpa diminta input lama, rupanya.
Pada awalnya, saya salah membaca bonus sebagai mengambil argumen bukannya stdin. Saya bangga dengan solusi saya untuk itu, jadi saya tetap mempostingnya;)
Python 2 - (52-10 + ∞) = ∞ (tidak valid!)
sys.argv
adalah daftar di mana elemen nol adalah nama file dan setiap elemen kata penutup adalah argumen yang diberikan kepada program. Saya menambahkan nilai falsey ke akhir daftar; jika tidak ada argumen, elemen pertama adalah nilai falsey, jika tidak maka argumen pertama.a or b
di Python mengembalikan nilai pertama yang mengkonfirmasikan apa hasilnya nanti: Jikaa
benar, kita sudah tahu bahwa semuanya akan benar, jadi itu hanya akan dikembalikan. Jika salah,b
dikembalikan (sejakFalse or b
==b
).sumber
y\n
segera jika stdin kosong.r=raw_input();p=r if r else`help`[1]\nwhile 1:print p
52 karaktery
di dalamnya, yang kedua juga.