ya panjangnya 91 baris

50

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 stdoutaliran tak terbatas "y \ n"
  • harus ada opsi untuk menghentikannya selain mematikan proses dengan SIGKILL: tetapi SIGINTdan SIGPIPEbaik-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 stdindan mencetaknya alih-alih "y" (tetapi masih termasuk baris-break).
Ramon Snir
sumber
13
" Anda tidak diizinkan menggunakan" y "atau" \ n " " - haruskah saya membaca ini sebagai "Anda tidak boleh menggunakan yatau \ndi dalam string literal"?
apsillers
12
Pada catatan terkait, GNU true.cpanjangnya 80 baris.
Dennis Williamson
6
@DennisWilliamson Pada catatan yang sama terkait, false.c adalah 2 baris panjang ....; _;
LordAro
6
coreutils yesmengambil argumen opsional pada baris perintah, bukan stdin.
Brian Minton
7
@ MrLore: untuk menyalurkan ke program lain yang mungkin terus-menerus meminta konfirmasi dari berbagai hal yang mereka lakukan, jadi Anda tidak perlu duduk di sana mengetik ysendiri.
marcus erronius

Jawaban:

37

CJam, 13 byte - 10 = 3

l_'x)?{_oNo}h

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 yjika inputnya kosong.

Penjelasan

l             "Read line from STDIN.";
 _            "Duplicate.";
  'x          "Push character x.";
    )         "Increment to get y.";
     ?        "Ternary operator. Replaces line with y if it was empty.";
      {    }h "Repeat while true. Leaves condition on the stack, which is the output string.";
       _o     "Duplicate line and print.";
         No   "Push string with newline and print.";

Setelah klarifikasi OP, berikut ini sepertinya lebih spesifik:

l{_o9c)o1}g

Saya akan menunggu dengan memperbarui kiriman sampai OP membalas komentar saya.

Martin Ender
sumber
16
Saya suka bahwa program Anda kebetulan cocok /no/i, mengingat apa tantangannya.
Kevin - Reinstate Monica
20

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 ^Cpada mesin saya.

Brainfuck - (63-10) = 53

++++++++++[>,]<<[[<]>>[[.>]<[<]>]]>[>++++++++++++>+<<-]>+[.>.<]
monmon bawah tanah
sumber
@fry aku tidak bisa mendapatkannya di bawah 39 dengan cara itu. Saya butuh 10, jadi saya menambahkan 1 hingga 120 atau mengurangi 1 dari 11, dan lebih pendek untuk melakukan yang pertama.
undergroundmonorail
Ya, saya perhatikan setelah itu Anda menggunakan kembali 10, maaf: P
FryAmTheEggman
Alih-alih 10 * 12 + 1, mengapa tidak 11 * 11? Saya pikir itu bisa menyelamatkan Anda char.
ProgramFOX
@pro saya tidak bisa mendapatkannya di bawah 39 dengan cara itu. Saya butuh 10, jadi saya menambahkan 1 hingga 120 atau mengurangi 1 dari 11, dan lebih pendek untuk melakukan yang pertama.
undergroundmonorail
@undergroundmonorail Ah, begitu.
ProgramFOX
18

Python 3, 27 byte

Bekerja dengan setidaknya CPython dan Jython.

while 1:print(str(help)[1])

SIGINT menghentikannya.

pgy
sumber
18
Buatlah python2 dan Anda dapat mempersingkatnya menjadi while 1:print`help`[1].
undergroundmonorail
4
Haha bagus. Saya benar-benar lupa bahwa ada "dulu" menjadi operator backtick dengan python :)
pgy
Anda dapat menggunakan chr(11**2)untuk menyimpan beberapa karakter juga
user1354557
2
@RamchandraApte Anda tidak diizinkan menggunakannya 121.
Jonathon Reinhart
17

Marbelous 14 byte

0978
]]/\++
!!

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.

overactor
sumber
17

Pyth, 10 9 6 byte - 10 = 0 -1 -4

#|zePG

Saya sudah berusaha selama bertahun-tahun untuk mendapatkan yang saya puas. Pada dasarnya dikonversi ke:

#      = while True
(implied print)
|      = or
z      = (automatically initialized from stdin)
ePG    = second-to-last lowercase letter = 'y'
swstephe
sumber
Variabel "z" diinisialisasi dari stdin, kemudian nilainya hanya digunakan setelah itu. Menemukan cara singkat untuk mendapatkan nilai ascii tanpa menulisnya secara eksplisit.
swstephe
Beralih dari "^ 11 2" ke "^ hT2" untuk menyimpan karakter.
swstephe
Halo, saya senang melihat pengguna bahasa lain! Beberapa golf: #memiliki fungsi yang setara dengan W1, dan ePGmerupakan cara yang jauh lebih pendek untuk mendapatkan karakter ydaripada C^hT2.
isaacg
Terima kasih, saya akan menerapkan perubahan itu. Masih baru dalam hal golf ini. Saya suka Pyth, tetapi keinginan memiliki beberapa fungsi kontekstual dan manipulasi bit.
swstephe
13

C #, 81 78 76 byte

Tidak dapat bersaing dengan bahasa lain, tetapi ini dia:

class A{static void Main(){for(;;)System.Console.WriteLine((char)('x'+1));}}

Dapat dibunuh dengan SIGINT dengan menekan Ctrl+ C.

Tidak ada bonus, karena akan membutuhkan lebih dari 10 byte untuk mendapatkannya.

ProgramFOX
sumber
Tidak dapat Anda gunakan while(1)? Menghemat dua karakter.
Sikat gigi
@toothbrush Saya sudah mencobanya, tapi itu tidak berhasil di C #.
ProgramFOX
1
for(;;) harus bekerja.
core1024
2
Untuk beberapa alasan, kode ini masih memiliki ydi dalamnya. Tolong periksa System.
TheNumberOne
4
@TheBestOne Itu Systemtidak 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 untuk y. Saya meninggalkan komentar pada pertanyaan untuk bertanya kepada Ramon apakah ini valid.
ProgramFOX
10

Jawa, 178

class C{public static void main(String[]a)throws Exception{for(char c='x'+1;;)((java.io.PrintStream)Class.forName("java.lang.S"+c+"stem").getField("out").get(null)).println(c);}}

Pencetakan membutuhkan System, tetapi ykarakter tersebut dilarang. Karena itu, saya harus menggunakan refleksi.

Ypnypn
sumber
FileDescriptor.out adalah yang saya maksud.
TheNumberOne
Anda dapat menyimpan ;dengan memasukkan char c='x'+1;ke dalam fordeklarasi loop, jadi for(char c='x'+1;;)karena Anda memiliki titik koma kosong di sana
corsiKa
@corsiKa Poin bagus.
Ypnypn
10

Perl: 18 byte - 10 = 8

String berasal dari STDIN.

$_=<>;{print;redo}
core1024
sumber
3
Apakah itu mencetak y\nberulang kali jika tidak menerima input dari STDIN? Jika tidak, maka itu tidak meniru dengan benar yes.
vurp0
@ vurp0 yestidak menerima input dari STDINsemuanya :)
core1024
1
Tidak, tetapi kode golf pertanyaan di sini menentukan bahwa jika tidak menerima input, itu harus berulang kali dicetak y\n.
vurp0
2
@ vurp0 Di mana? Program apa pun yang membaca dari aliran akan hang tanpa input.
core1024
@ vurp0 Lihat komentar OP pada pertanyaan.
nyuszika7h
9

Ruby, 30 23 18 byte

loop{puts ?x.succ}

Dapat dibunuh dengan SIGINT dengan menekan Ctrl+ C.

Berkat manatwork untuk berbagi peningkatan!

ProgramFOX
sumber
1
loop{puts [*?x..?z][1]}- 23 chars, loop{puts ?x.succ}- 18 chars
manatwork
@manatwork Terima kasih! Diperbarui.
ProgramFOX
8

Perl, 26 byte

{print chr$=*2+1,$/;redo}

Masukan khusus dari argumen (seperti yesbenar - benar berfungsi), 22 byte-10 = 12

{print @ARGV,$/;redo}

Masukan khusus dari stdin, 22 byte-10 = 12

while(<>){print;redo}
Nitz
sumber
Program @mar Nitz hanya sepanjang 14 byte dan ada komentar yang sangat tinggi pada tautan Anda yang mengatakan bahwa dinginkan nama file menjadi masalah jika Anda memasukkannya dalam bytecount. Ini sepertinya sah bagi saya.
undergroundmonorail
oh tunggu, saya tidak melihat bagian "Anda tidak dapat menggunakan \" y \ "" dari pertanyaan. tidak masalah ini buruk
undergroundmonorail
Kamu benar. Memperbaikinya
Nitz
6

C, 64 55 53 45 40 - 10 = 30

main(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

  • EDIT: ternyata semakin bulat karakter no \ n membuatnya lebih pendek
  • EDIT2: "int" lebih pendek dari "char"
  • EDIT3: tidak perlu variabel itu sama sekali
  • EDIT4: sedikit perilaku yang tidak terdefinisi tidak pernah menyakiti siapa pun
  • EDIT5: tambahkan versi alternatif
LordAro
sumber
5

Linux Bash, 33-10 = 23

read a; while :; do echo $a; done

Dapat dibunuh dengan SIGINT dengan menekan Ctrl+ C.

Orace
sumber
Anda harus membaca hanya satu baris dan mencetak baris yang sama berulang kali. Program Anda tidak yestapi catprogram.
jimmy23013
Sayang saya, saya seharusnya tidak mencobanya setelah à hari kerja.
Orace
Bagaimana denganread a;for((;;));{ echo $a;}
core1024
5

Rust, 52 karakter

fn main(){loop{println!("{}",'Y'.to_lowercase())}}

Sepertinya tidak ada cara komputasi yang bagus ytanpa nakal di Rust - mereka telah membuat pekerjaan chars dengan aman menjadi terlalu baik. SAYA:

  • Tidak dapat memasok string non-literal ke println!, jadi tidak ada trik yang diizinkan di sana;
  • Tidak dapat menambahkan 1 ke 'x', karena di Rust chars bukan angka;
  • Tidak bisakah ROT13 (mengapa Rust tidak memiliki ROT13 di perpustakaan standarnya !?);
  • Tidak dapat dengan mudah melakukan sesuatu yang tidak aman seperti menjatuhkan ke string C, mengkonversi dari angka ke karakter, dll tanpa menjadi sangat verbose dan melampaui 52c.

Juga tidak akan mendapatkan bonus kode yang sepadan, karena membaca dari stdinakan membutuhkan penanganan kesalahan = 3

Banyak 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)

fn main(){loop{println!("{:.1}", 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)

fn main(){loop{println!(file!())}}

Seperti di atas, tetapi file tersebut harus dipanggil y(bukan y.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)

fn main(){loop{println!(env!("K"))}}

Yang satu ini bahkan lebih buruk: Anda perlu mengatur variabel lingkungan Kuntuk ydi waktu kompilasi .

Mengedit : jika Anda mengatur Kuntuk y\n, Anda bisa drop lndi println!, untuk grand total 35 karakter dan beberapa facepalms:

fn main(){loop{print!(env!("K"))}}
Matt Windsor
sumber
Kebijakan umum kami untuk mengharuskan nama file tertentu atau flag compiler adalah dengan memasukkannya dalam hitungan byte.
Martin Ender
@ MartinBüttner Cukup adil. Anehnya, tampaknya karat bukan bahasa terbaik untuk kode golf>: P
Matt Windsor
Anda dapat menambahkan satu dengan xcara, tetapi itu masih tidak singkat:(b'x' + 1) as char
Shepmaster
5

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:

/usr/bin/[x-z]es $*

Saya pikir itu memenuhi persyaratan, meskipun mungkin itu melanggar aturan "tidak ada yang mengevaluasi y". Dan mungkin meniru yesdengan berlari sebenarnya yesmelanggar aturan.

Ini dapat dioptimalkan sedikit (meskipun lebih kecil kemungkinannya bekerja) untuk menurunkannya menjadi 11 byte:

/*/*/?es $*

Saya tidak tahu bagaimana cara mendapatkan bonus 10 poin dengan membaca string dari stdin tanpa menambahkan lebih dari 10 byte ke kode

Johnny
sumber
2
/*/*/?es `line` , atau /*/*/?es `head -n1` jika Anda tidak punya /usr/bin/line.
jimmy23013
2
Atau sed quntuk line.
jimmy23013
5

dc, 12

[30986Pdx]dx

Hanya keluaran y\n. Tidak membaca dari stdin, jadi tidak ada bonus.

30986 adalah 0x790A (yaitu "y \ n"). The Pperintah hanya mengkonversi jumlah ke basis 256, dan mencetak sesuai karakter untuk setiap basis 256 digit.

Trauma Digital
sumber
Itu cukup pintar, bagaimana 30986 mengevaluasi y\n?
nyuszika7h
Saya tahu tentang Ptetapi tidak tahu itu bisa melakukan lebih dari satu karakter sekaligus.
nyuszika7h
5

Gangguan Umum: (30-10) = 20

(format t"~@{~a~%~:*~}"(read))
  • (read) dari aliran input
  • cetak ke aliran keluaran: (format t ... )
  • ulangi semua formatargumen (hanya satu di sini):~@{ ... ~}
  • di dalam loop, untuk setiap argumen:

    • argumen cetak ~Adiikuti oleh baris baru~%
    • mundur elemen saat ini ke yang sebelumnya ~:*(infinite loop)

Anda dapat memutus perulangan dengan Ctrl+C, yang menandakan kesalahan dengan opsi mulai ulang (lanjutkan / batalkan).

coredump
sumber
3

Haskell, 29 byte

main=putStrLn[succ 'x']>>main

Saya percaya ini dihentikan oleh keduanya SIGINTdan SIGPIPE.

Taneb
sumber
saran: gunakan '\89'sebagai gantisucc 'x'
haskeller bangga
3

Ruby, 27 byte - 10 = 17

Ini hanya solusi @ ProgramFOX dengan bonus (butuh 9 byte saya untuk menyelesaikan pertanyaan bonus).

loop{puts ARGV[0]||?x.succ}
alexanderbird
sumber
3

dc, 21 byte - 10 = 11

C1st?st[ltP[]ps0dx]dx

Perhatikan bahwa input perlu dimasukkan [], misalnya [no], karena ?merupakan satu-satunya cara untuk mengambil input, yang mengeksekusinya sebagai dckode.

nyuszika7h
sumber
Anda bisa menggunakan C2bukan 122. Bahkan saya berpendapat bahwa 122 1-bisa diganti dengan C1yang C1tidak secara eksplisit dilarang dalam pertanyaan
Digital Trauma
3

Commodore 64 Basic: 14 13 byte

1?C|(11↑2):R╭

Seperti biasa, saya telah membuat pergantian karakter di PETSCII yang tidak ada di Unicode. |digunakan untuk mewakili SHIFT+H, sementara mewakili SHIFT+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.

1?cH(89):rU
Menandai
sumber
Dengan semua 💩 yang ada di unicode, tampaknya mengejutkan bahwa set karakter penuh yang digunakan oleh C64 tidak akan ada di sana di suatu tempat.
kasperd
@kasperd, karakter menggambar kotak Unicode sebagian besar berasal dari set "DOS" IBM, dan melewati bagian tengah sel karakter. PETSCII memiliki set yang jauh lebih besar, banyak yang menggunakan tepi sel karakter. U + 2502 mungkin merupakan perkiraan yang layak dari bilah vertikal yang dihasilkan oleh 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"
Mark
Sangat bagus, tetapi Anda bisa menghemat satu byte dengan mengganti "Goto 1" dengan "Run": "1? CH (89): rU"
LeFauve
@LeFauve, Terima kasih. Saya juga menerapkannya pada versi pemancar ASCII.
Markus
3

AWK, 38 byte

BEGIN{for(;;)printf("%c%c",60+61,5+5)}

Varian yang akan membaca string pada stdin: 14 bytes-10 = 4

{for(;;)print}

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.

LeFauve
sumber
3

Fission , 5 byte

Rx+!N

Ini cukup kompetitif untuk Fission. :)

Aliran kendali dimulai dengan (1,0)atom yang tepat di R. xmengatur massa untuk 120, dan +menambahkannya untuk diberikan (121,0). Kemudian !cetak karakter yang sesuai ( y) dan Nmencetak baris baru. Kode sumber membungkus di tepi, sehingga atom lewat Rlagi (yang tidak melakukan apa-apa sekarang), xmengatur massa untuk 120lagi, +menambahnya dan seterusnya dan seterusnya ...

Martin Ender
sumber
3

C, 32 byte

Membutuhkan sedikit mesin endian dan kompilasi dengan -O2 (untuk menghindari stack overflow).

a=11*11;main(){main(puts(&a));}
nutki
sumber
2

PowerShell, 27 - 10 = 17

param($s=$Host[1])for(){$s}

Mungkin tidak berfungsi di Pash. Alternatif yang lebih kuat seharusnya

param($s="$(gal gh*)"[2])for(){$s}
Joey
sumber
2

Lua, 42 byte - 10 = 32

while 1 do print(...or('').char(90+31))end

Lua, 49 byte - 10 = 39

y=...or(string.char(60+61))while 1 do print(y)end

Keduanya diuji dengan Lua 5.1.4 dan dapat dibunuh dengan SIGINT ( Ctrl+ C).

Digpoe
sumber
Luar biasa! Ibuku menulis di Lua, aku belum pernah melihatnya di alam liar sebelumnya. ( Hai, ibu! Tebak apa yang saya lihat! )
Signal15
2

Perl, 31

Berikut adalah versi Perl yang benar-benar berperilaku seperti GNU yes, sejauh yang saya tahu:

{print "@ARGV"||chr 11**2;redo}

Ini berfungsi jika tidak apa-apa untuk menggunakan switch baris perintah perl ( -luntuk baris baru), jika tidak maka akan menjadi 3 karakter lebih lama:

{print "@ARGV"||chr 11**2,$/;redo}
xebtl
sumber
kesalahan ketik: adalah -l(bukan -e) saklar untuk baris baru.
chris-l
Juga, bonus hanya jika skrip Anda dapat membaca dari stdin . Ya, saya tahu bahwa ya sebenarnya tidak membaca dari stdin, tetapi dari argumen, tapi itu adalah aturan dari put OP; itu harus dari stdin untuk mendapatkan bonus.
chris-l
@ chris-l memperbaiki tipenya, terima kasih. Saya juga menghapus klaim tentang bonus, tetapi saya akan meninggalkan jawaban saya seperti :-P
xebtl
hehe yakin, jawaban saya sendiri seperti milik Anda; ia menggunakan argumen bukannya stdin. IMHO, op harus memberikan bonus kepada mereka yang benar - benar melakukan apa yang benar - benar dilakukan ya .
chris-l
2

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* badalah heksadesimal untuk 11, demikian bb*juga 11*11= 121, yang merupakan setara dengan UTF-8 dari y. Nilai ini didorong ke tumpukan.
.Pops nilai teratas dari tumpukan, dan output sebagai UTF-8. Seperti 121di atas tumpukan, indeks diabaikan di sini.
nOutputs 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:.)}

iMengambil 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]
aHeksadesimal untuk 10, 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.
XMenghapus 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"

"Hello World"#~
#?!;.<

The ?!operasi adalah sama> <> 's

Charlie
sumber
Sebenarnya batasan ini berlaku untuk bahasa khusus / perpustakaan / fitur yang diterbitkan setelah pertanyaan diposting.
manatwork
@manatwork Itu artinya jawaban saya tidak valid. Terimakasih atas klarifikasinya. Saya membuat bahasa ini, dan ingin melakukan beberapa tantangan golf untuk menguji apa yang dapat saya tingkatkan untuk versi-versi mendatang, jika itu membuat sesuatu menjadi lebih baik.
Charlie
Menurut pendapat saya ini tidak valid, hanya saja tidak memenuhi syarat untuk menang. Tujuan pembatasan adalah untuk mencegah kecurangan, tetapi karena Anda memasukkan pernyataan tentang kesegaran bahasa, ini hampir tidak bisa dianggap sebagai upaya curang.
manatwork
2

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

 STDIN

yaitu tidak pernah, tetapi tidak pernah terputus dengan menjeda utas.

Adm
sumber
Hmm. bug yang menyalahgunakan .. menarik.
Matthew Roh
@MatthewRoh Menggunakan, tidak menyalahgunakan. "Fitur" menggunakan operator pada penugasan , meskipun bukan fungsi yang sebenarnya layak, dan dengan demikian tidak benar-benar memenuhi syarat untuk menjadi operan. Masih bekerja melalui ...
Adám
2

> <>, 6 byte

b:*oao

Dengan tidak menyertakan a ;di akhir, <> akan terus berenang sampai dia dibebaskan oleh SIGINT.

Penjelasan

b:*oao
b         Push 11
 :        Duplicate
  *       Multiply top elements to get 121
   o      Print as character
    a     Push 10
     o    Print as character (yielding '\n')
          No program terminator, so our ><> will 
          keep on swimming this path forever.
^----' 


> <>, 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 mana echomenyediakan \nkarakter.

 i:0)?!v
0r}o:r~<

Penjelasan

 i:0)?!v     Load STDIN into the stack (reversed)

             NOP           <----------,
 i           Push a byte from STDIN   |
  :          Duplicate top element    |
   0         Push 0                   |
    )?       If (i > 0):              |
      !        Wrap around  ----------'
             Else:
       v       Move to the second part

0r}o:r~<     Print STDIN until halted

       <     Go right         <---------------,
      ~      Remove top element (duplicated   |
                -1 from EOF)                  |
     r       Reverse stack                    |
    :        Duplicate top element            |
   o         Output as character              |
  }          Rotate stack to right (go to     |
                next character)               |
 r           Reverse the stack                |
0            Push 0                           |
             Wrap around       ---------------'

Pada 0rakhirnya memungkinkan untuk loop terjadi dengan membungkus, di mana kita masih menganggap tumpukan dibalik dengan -1di atas.

PidgeyDigunakanGust
sumber
1

Tampaknya ini tidak sepenuhnya portabel. Saya sys.version adalah 2.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

import sys
s=sys.stdin;a=`help`[1]if s.isatty()else s.read()
while 1:print a

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!)

import sys
while 1:print(sys.argv+[0])[1]or`help`[1]

sys.argvadalah 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 bdi Python mengembalikan nilai pertama yang mengkonfirmasikan apa hasilnya nanti: Jika abenar, kita sudah tahu bahwa semuanya akan benar, jadi itu hanya akan dikembalikan. Jika salah, bdikembalikan (sejak False or b== b).

monmon bawah tanah
sumber
@fry aku bisa, tetapi akan meminta pengguna. Saya ingin mulai meludahkan y\nsegera jika stdin kosong.
undergroundmonorail
@ goreng Itu aneh, itu bekerja untuk saya. Mungkin tergantung pada cPython? Saya tidak punya ide lain.
undergroundmonorail
ide yang bagus, di atasnya
undergroundmonorail
r=raw_input();p=r if r else`help`[1]\nwhile 1:print p 52 karakter
globby
1
Hmm, sudah baris pertama sepertinya ada ydi dalamnya, yang kedua juga.
Paŭlo Ebermann