Membalikkan stdin dan letakkan di stdout

58

Persyaratan:

  • Ambil input pada stdin termasuk jalur baru / carriage return dengan panjang tidak terbatas (hanya dibatasi oleh memori sistem; yaitu, tidak ada batasan yang melekat dalam program.)
  • Keluarkan kebalikan dari input pada stdout.

Contoh:

Memasukkan:

Quick brown fox
He jumped over the lazy dog

Keluaran:

god yzal eht revo depmuj eH
xof nworb kciuQ

Kemenangan terpendek.

Papan peringkat:

var QUESTION_ID=242,OVERRIDE_USER=61563;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>

Thomas O
sumber
5
Apakah Anda mengizinkan fungsi perpustakaan standar seperti PHPstrrev
Ming-Tang
Apakah output diperbolehkan menempatkan baris baru terakhir input di awal, bukan di akhir?
Joey Adams
@ Joey Adams, ya, harus mereplikasi input dengan tepat.
Thomas O
53
Contoh Anda agak salah. Kebalikan dari input Anda adalah: ƃop ʎzɐʃ ǝɥʇ ɹǝʌo pǝdɯnɾ ǝH xoɟ uʍoɹq ʞɔınΌ;-P
ninjalj
Perlu saya hanya mendukung karakter yang dapat dimasukkan ke dalam sistem yang mengeksekusi kode?
Rasio Emas

Jawaban:

25

Golfscript - 3 karakter

-1%

versi dikaburkan juga 3 karakter

0(%

berikut ini penjelasan tentang cara kerja %

gnibbler
sumber
9
Bagaimana kita bisa bersaing dengan Golfscript ??
Thomas O
12
@ Thomas: Dengan menggunakan FlogScript, saya kira. Bagaimanapun, jika Anda memposting tugas sepele, maka harapkan solusi menjadi sama sepele. Dan jika dibutuhkan tiga pemanggilan metode dengan Python, bisa juga tiga karakter dalam Golfscript.
Joey
1
@ Thomas: Maaf, itu tidak jelas. Mengingat bahwa beberapa anggota sudah melakukan diskusi panas yang tenang tentang bahasa yang tampaknya bukan humor, itu tidak terlalu masuk akal untuk menganggap serupa di sini.
Joey
3
@ Joey Itu lebih dari keputusasaan yang lucu karena GolfScript sepertinya berisik bagi mata yang tidak terlatih.
Thomas O
36
Jadi yang kedua dikaburkan tetapi yang pertama tidak. Gotcha.
C0deH4cker
45

Bash - 7

tac|rev

tacmembalik urutan baris, sementara revmembalik urutan karakter.

marcog
sumber
Mari kita lanjutkan langkah berikutnya dan alias itu ke perintah bash satu huruf! alias z='tac|rev'
Daniel Standage
18
@ Diniel Itu agak sama dengan menggunakan flag compiler untuk mendefinisikan macro, yaitu melawan semangat kode golf.
marcog
Saya memiliki rev|tacskor yang sama - hanya menambahkan catatan untuk mengatakan bahwa ini bekerja untuk semua shell POSIX, bukan hanya Bash.
Toby Speight
35

BrainFuck, 10 karakter

,[>,]<[.<]

Mengalahkan sejumlah jawaban yang bagus untuk bahasa yang begitu sederhana.

Kevin Brown
sumber
2
DNA membalik urutannya setiap saat, jadi mungkin ada sesuatu yang mendasar tentang sifat informasi dan perhitungan dalam apa yang telah Anda amati. Saya menemukan solusi ini sambil menyelesaikan masalah pada rosalind.info dengan shell one-liners.
ixtmixilix
9
@ixtmixilix Ini sebenarnya hanya mengatakan sesuatu yang mendasar tentang tumpukan dan membalikkan sesuatu.
Cruncher
23

C, 37 byte

main(_){write(read(0,&_,1)&&main());}
Pemurah
sumber
Keren, tapi itu tidak berhasil untukku.
Joey Adams
@ Joey Adams: Cobalah di sini .
Quixotic
Ah, saya harus mengkompilasi tanpa optimasi.
Joey Adams
21

Haskell - 21

main=interact reverse
Konstantin
sumber
3
Tidak hanya pendek, tetapi juga sepenuhnya idiomatis :)
hammar
16

Pancake Stack , 342 316 byte

Put this nice pancake on top!
[]
Put this  pancake on top!
How about a hotcake?
If the pancake is tasty, go over to "".
Put this delightful pancake on top!
[#]
Eat the pancake on top!
Eat the pancake on top!
Show me a pancake!
Eat the pancake on top!
If the pancake is tasty, go over to "#".
Eat all of the pancakes!

Diasumsikan bahwa input diakhiri oleh karakter nol ( ^@pada commandline). Contoh lari, menggunakan interpreter :

Put this nice pancake on top!
[]
Put this  pancake on top!
How about a hotcake?
If the pancake is tasty, go over to "".
Put this delightful pancake on top!
[#]
Eat the pancake on top!
Eat the pancake on top!
Show me a pancake!
Eat the pancake on top!
If the pancake is tasty, go over to "#".
Eat all of the pancakes!
~~~~~~~~~~~~~~~~~~~~~~~~
Hello, World!^@
!dlroW ,olleH
Justin
sumber
16

Python, 41 40 byte

import sys;print sys.stdin.read()[::-1]

41 -> 40 - menghapus titik koma di akhir program.

Mungkin bisa dioptimalkan!

Thomas O
sumber
Saya berharap saya memiliki cara mudah untuk membalikkan sesuatu di PowerShell ;-)
Joey
6
Orang Mars, selalu bermanfaat. [:: - 1]
Wok
1
Jadi print raw_input()[::~0]]? Ini masih Python 2 karenaprint
CalculatorFeline
Berikut tip pemformatan entri golf kode. Selalu tulis bahasa yang Anda # Language Name, Character/Byte Count
gunakan
13

APL, 2

⊖⍞

Atau CircleBar QuoteQuad jika karakter tidak muncul, artinya: input karakter keyboard terbalik.

jpjacobs
sumber
Membagi dua byte-count Anda! Anda bahkan tidak membutuhkannya . adalah fungsi anonim lengkap yang dapat diberikan dan digunakan: f←⌽ f 'The quick brown fox'.
Adám
^^^^ Pemenang ^^^^
CalculatorFeline
@ Nᴮᶻ: baiklah, spec mengatakan untuk mendapatkan input dari stdin, bukan dari string literal :)
jpjacobs
@jpjacobs Praktik PPGC yang umum adalah mengizinkan argumen inline alih-alih stdin untuk bahasa yang tidak mendukung (atau yang tidak wajar untuk digunakan) stdin.
Adám
11

Perl - 23

print scalar reverse <>
Andrew
sumber
6
Anda dapat menghapus ruang ketiga.
Timwi
6
Padahal, print"".reverse<>hanya 17 karakter. Dan dengan Perl 5.10+ Anda dapat menyimpan dua karakter lagi menggunakan saybukan print.
Ilmari Karonen
4
Saya tahu ini sudah sangat tua, tetapi Anda juga bisa melakukannya: print~~reverse<>untuk 16 karakter
Dom Hastings
5
@HomHastings Dan dengan Perl 5.10+, say~~reverse<>apakah akan berhasil? 14 karakter.
Timtech
10

Ruby - 19 karakter

puts$<.read.reverse
Nemo157
sumber
10

C - 47 karakter

main(c){if(c=getchar(),c>=0)main(),putchar(c);}

Perhatikan bahwa ini menggunakan ruang stack O (n). Cobalah online!

Joey Adams
sumber
Sungguh mengagumkan!
st0le
1
Hanya ide Anda tetapi ini menghemat 2-3 pukulan kunci:main(c){(c=getchar())>0&&main(),putchar(c);}
Quixotic
2
Apakah C mengevaluasi angka sebagai boolean? Jika demikian, c>=0dapat menjadi~c
Cyoce
9

Windows PowerShell, 53 54

-join($x=[char[]]($($input)-join'
'))[($x.count)..0]

2011-01-30 (54) - Upaya pertama

2011-01-30 (53) - Istirahat inline menyenangkan.

2011-01-3- (52) - Penugasan variabel inline juga.

Joey
sumber
-join($a="$args")[$a.Length..0]pada dirinya sendiri tampaknya bekerja untuk contoh yang diberikan, saya tidak memiliki masalah dengan linebreak yang berjalan dengan windows crlf- tidak yakin tentang psv2 atau apa pun yang Anda gunakan saat ini ditulis.
colsw
@ConnorLSW: Itu bahkan tidak dibaca dari stdin. Dan $inputadalah enumerator yang menghasilkan garis, sehingga Anda tidak dapat merangkai seperti itu.
Joey
8

Perl 5.1, 14

say~~reverse<>
Timtech
sumber
8

Befunge-93 - 11x2 (22 karakter)

>~:0`v >:v
^    _$^,_@

Diuji menggunakan juru bahasa ini .

MiffTheFox
sumber
19
Apakah Anda yakin tidak hanya menekan tombol acak di keyboard?
Thomas O
@ Thomas - Anda yakin tidak mencoba menggunakan penerjemah yang ditautkan? Ini berbasis web, jika Anda khawatir mengunduh apa pun.
MiffTheFox
4
Saya hanya bercanda. Saya yakin itu akan berhasil, tetapi sepertinya Anda menekan beberapa tombol secara acak. Itu menunjukkan bahasa yang sangat kompak.
Thomas O
1
tidak selalu : P
clap
6

Fission , 16 14 12 byte

DY$\
?
[Z~K!

Penjelasan

Aliran kontrol dimulai Ddengan (1,0)atom yang turun . The ?membaca dari STDIN, satu karakter pada satu waktu, pengaturan massa untuk kode karakter membaca dan energi untuk 0. Setelah kita menekan EOF, ?alih-alih akan mengatur energinya 1. The [pengalihan atom ke sebuah Zswitch. Selama kita membaca karakter, energinya akan 0, jadi atom dibelokkan ke atas oleh Z. Kami mengkloning atom, mengulang satu salinan kembali ke ?untuk terus membaca input. Kami menambah energi salinan lain 1dengan $dan mendorongnya ke tumpukan K. Jadi loop input adalah ini:

DY$\
?
[Z K

Ketika energi 1disebabkan oleh EOF, Zalih-alih akan membiarkan atom melewati dan mengurangi energi 0lagi. ~mengurangi energi lebih lanjut menjadi -1. Atom dengan energi negatif muncul dari tumpukan, sehingga kita dapat mengambil karakter dalam urutan yang berlawanan dan mencetaknya !. Sekarang perhatikan bahwa grid adalah toroidal, sehingga atom muncul kembali di tepi kiri dari baris yang sama. Ingatlah bahwa kita telah menambah energi dari atom yang didorong sebelumnya $, sehingga atom sekarang memiliki energi 1seperti keluaran terakhir dari ?dan akan kembali melewati atom Z. Karena itu, jalur setelah EOF

?
[Z~K!

Lingkaran di baris bawah ini berlanjut sampai tumpukan kosong. Ketika itu terjadi, atom dipantulkan kembali dari Kdan energinya menjadi positif ( +1). The ~decrements sekali lagi (bergerak ke kiri), sehingga kita sekarang memukul Zdengan energi non-positif. Ini mengalihkan atom ke bawah, sehingga berakhir di irisan Ytempat penyimpanannya, dan karena tidak ada lagi atom yang bergerak, program berakhir.

Martin Ender
sumber
lol mengapa ini mengingatkan saya pada minecraft?
don bright
Wow, dan saya pikir implementasi saya dalam sampel bahasa adalah yang terpendek di 16 karakter. Impresif!
C0deH4cker
6

> <>, 16 14 byte

-2 byte oleh @ JoKing

dua tahun (!) kemudian, menghapus -1 ekstra dari input input dengan menggeser logika untuk berhenti.

i:0(7$.
0=?;ol

Cobalah online!

Mirip dengan jawaban>>> lainnya, ini tidak perlu membalikkan tumpukan karena cara input dibaca di baris pertama. Saya sebenarnya tidak terlalu yakin apakah ini seharusnya menjadi saran untuk jawaban>> yang lain, karena sangat berbeda dalam penampilan tetapi serupa dalam konsep.

Perbedaan utama adalah bahwa jawaban saya membandingkan input ke 0, dan jika kurang (yaitu tidak ada input - imengembalikan -1 jika tidak ada input) melompat ke (1,7), jika tidak, (0, 7). Jika melompat ke yang pertama, itu muncul nilai teratas (-1) dan memulai putaran cetak. Jika melompat ke yang terakhir, itu melanjutkan loop input.

11 byte, keluar dengan kesalahan

Atas perkenan @ JoKing

i:0(7$.
~o!

Cobalah online!

Saya percaya ini valid sekarang melalui konsensus meta.

Jawaban sebelumnya (14 byte)

i:0(7$.
~ol0=?;!
cole
sumber
2
-5 byte dengan diakhiri dengan kesalahan. Sebaliknya -2 byte (kesalahan pada input kosong). Juga kesalahan asli pada input kosong, yang dapat diperbaiki dengan memindahkan osetelah;
Jo King
1
@JoKing Tangkapan yang bagus di pihak o; tidak menyadarinya saat itu. Dan terima kasih untuk save. Penggunaan pintar perbandingan ke nol untuk menyingkirkan -1 terakhir.
cole
1
Hmm, sebenarnya ini berfungsi dengan baik selama 13 byte (tidak percaya saya melewatkan pertukaran mudah 0=?untuk ?!)
Jo King
@ JoKing -1 Byte The? karakter memeriksa tumpukan atas jika 0 maka perbandingan dengan panjang tidak diperlukan, hanya l.
Teal pelican
@TealPelican Ya, saya menyebutkan itu di komentar kedua saya
Jo King
5

PHP - 38 17 karakter

<?=strrev(`cat`);
Arnaud Le Blanc
sumber
Apa cat??
Xanderhall
1
@Xanderhall mungkin membaca daristdin
Pavel
5

Stack Cats , 7 byte

<!]T[!>

Cobalah online!

Ada banyak alternatif untuk jumlah byte yang sama, yang sebagian besar pada dasarnya setara dalam cara kerjanya:

Penjelasan

A Stack Cats primer:

  • Setiap program harus memiliki simetri cermin, dan dengan mem-mirror setiap bagian dari kode kita mendapatkan kode baru yang menghitung fungsi terbalik. Oleh karena itu tiga karakter terakhir dari program di atas membatalkan tiga yang pertama, jika bukan karena perintah di tengah.
  • Model memori adalah rekaman tumpukan yang tak terbatas, yang menampung jumlah nol tak terbatas yang tersirat di bagian bawah. Tumpukan awal memiliki -1di atas nol itu dan kemudian byte input di atas itu (dengan byte pertama di bagian paling atas dan byte terakhir di atas -1).
  • Untuk output, kita cukup mengambil tumpukan terakhir, membuang a -1di bagian bawah jika ada, dan kemudian mencetak semua nilai sebagai byte ke STDOUT.

Sekarang untuk program yang sebenarnya:

<    Move the tape head one stack left (onto an empty stack).
!    Bitwise NOT of the implicit zero on top, giving -1.
]    Move back to the original stack, taking the -1 with the tape head.
     We're now back to the original situation, except that we have a -1
     on top.
T    Reverse the stack down to the -1 at the bottom. One of the reasons
     we needed to move a -1 on top is that T only works when the top of
     the stack is nonzero. Since the first byte of the input could have
     been a null-byte we need the -1 to make sure this does anything at
     all.
[    Push the -1 to the stack on the left.
!    Bitwise NOT, turning it back into 0 (this is irrelevant).
>    Move the tape head back onto the original stack.

Sp3000 mengatur pencarian brute force-nya untuk menemukan semua solusi 7-byte lainnya, jadi berikut adalah beberapa alternatif:

<]!T![>
>![T]!<
>[!T!]<

Ketiga varian ini pada dasarnya sama, kecuali bahwa mereka berbeda ketika bitwise NOT dihitung dan apakah kita menggunakan tumpukan kosong di sebelah kiri atau di sebelah kanan.

<]T!T[>
>[T!T]<

Seperti saya katakan dalam penjelasan di atas, Ttidak melakukan apa-apa ketika bagian atas tumpukan adalah nol. Itu berarti kita benar-benar dapat menempatkan !di tengah. Itu berarti yang pertama Tadalah no-op, maka kita putar nol di atas ke dalam -1dan kemudian kemudian kedua Tmelakukan pembalikan. Tentu saja, ini berarti bahwa keadaan memori akhir memiliki -1pada stack di sebelah yang asli, tetapi itu tidak masalah karena hanya tumpukan pada posisi head tape saat ini yang mempengaruhi output.

<*ITI*>

Varian ini menggunakan *(XOR 1) alih-alih !, sehingga mengubah nol menjadi +1, dan Imerupakan dorongan bersyarat yang mendorong nilai positif dan kanan, nilai negatif kiri, dan meniadakannya dalam kedua kasus (sehingga kita masih berakhir dengan -1di atas tumpukan asli ketika kita jumpai T), jadi ini akhirnya bekerja sama dengan <!]T[!>solusi asli .

Martin Ender
sumber
4

PHP, 82 29 24 29 28 karakter

<?=strrev(fread(STDIN,2e9));

82 -> 29: Karakter baris baru dipertahankan ketika dibalik dengan strrev.
29 -> 24: Gunakan sintaks pintas sekarang
24 -> 29: Sekarang bacalah semua baris, bukan satu baris

Kevin Brown
sumber
Satu masalah: fgets(STDIN)hanya membaca baris pertama.
PleaseStand
Diperbarui kode untuk sekarang membaca semua baris.
Kevin Brown
Kecuali Anda memiliki batas buatan 1000 karakter
pengecut anonim
Diperbarui batas untuk mencocokkan Python satu di bawah ini, saya tidak bisa membayangkan orang menggunakan sebanyak itu.
Kevin Brown
4

Befunge-98 - 11 10

#v~
:<,_@#

(Diuji dengan cfunge)

Varian di bawah ini sedikit mematahkan persyaratan: ia melakukan tugas tetapi menghasilkan aliran infinite nol byte setelahnya (dan tidak berakhir).

~#,

Cara kerjanya adalah berulang kali membaca input ke stack ( ~) satu karakter pada satu waktu, melompati ( #) koma. Ketika EOF tercapai, ~bertindak sebagai reflektor dan PC membalik, berulang kali muncul dan mengeluarkan karakter ( ,) sambil melompati ( #) tilde.

FireFly
sumber
Berikut ini adalah versi pendek (10 chars): baris 1: #v~baris 2: :<,_@#. Lucu bahwa menggunakan jtidak meningkatkannya di sini.
Justin
@ Quincunx itu pintar, menggunakan arah IP sebagai semacam negasi implisit.
FireFly
4

Pyth - 3 5 4 byte

Jadi, versi 3-char asli tidak membalik urutan baris, hanya garis. Saya kemudian datang dengan versi 5-char ini:

_jb.z

Saya menyimpan 1 byte berkat @FryAmTheEggman untuk menghasilkannya:

_j.z

Demo langsung.

Penjelasan:

  .w  read all the input into a list of strings
 j    join (j) by using a newline character
_     reverse the result
      Pyth implicitly prints the result on an expression

Solusi asli (salah):

Ini secara teknis tidak masuk hitungan karena Pyth dibuat pada tahun 2014, tetapi masih rapi bahwa itu dikaitkan dengan GolfScript.

#_w

Penjelasan:

#    loop while no errors
  w  read a line of input (throws an error on end-of-file or Control-C)
 _   reverse the input line
     Pyth implicitly prints the result on an expression
kirbyfan64sos
sumber
2
Sayangnya, tidak cocok dengan spek - urutan garis perlu dibalik juga.
DLosc
Fk_.z_kSaya yakin seseorang bisa mendapatkan sesuatu yang lebih pendek dari ini, tetapi itulah yang saya dapatkan.
gcq
@ gcq Saya memiliki versi yang lebih pendek (5 karakter), tetapi saya belum mendapatkan kesempatan untuk mengeditnya.
kirbyfan64sos
@Dosc Tetap! Saya baru saja membaca semua input, bergabung melalui baris baru, dan membalikkannya.
kirbyfan64sos
@FryAmTheEggman Ah, ya! Tidak tahu tentang itu ketika saya memposting ini beberapa bulan yang lalu.
kirbyfan64sos
4

Cubix , 9 8 byte

Banyak terima kasih kepada Martin Ender untuk golf ini:

w;o@i.?\

Lihat bekerja online!

Ini menjadi kubus berikut ( >menunjukkan penunjuk instruksi awal):

      w ;
      o @
> i . ? \ . . . .
  . . . . . . . .
      . .
      . .

Langkah pertama dari program ini adalah mengambil semua input. imenempatkan 1 byte input ke stack. Jika input tidak selesai, ?buat IP berbelok ke kanan, lilitkan di sekitar kubus hingga mencapai w, yang mengirimnya kembali i.

Ketika input selesai, ?membuat IP head utara, memasuki loop output:

  • o: cetak karakter di bagian atas tumpukan
  • w: 'sidestep' pointer ke kanan
  • ;: pop karakter yang baru saja dicetak
  • \: mencerminkan IP, mengirimkannya ke Timur
  • ?: jika ada karakter yang tersisa untuk dicetak, belok kanan, kembali ke loop.

Terakhir kali ?dipukul, ketika tidak ada yang tersisa di tumpukan, IP melanjutkan sebagai gantinya:

  • i: ambil satu byte input. Ini akan menjadi -1sebagai input telah selesai.
  • \: mencerminkan IP, mengirimkannya ke Utara, ke:
  • @: menghentikan program.

Solusi 9 byte

..o;i?@!/

Lihat bekerja online!

Dalam bentuk kubus:

      . .
      o;
> saya? @! /. . .
  . . . . . . . .
      . .
      . .

Karakter pertama yang dikodekan adalah i, yang mengambil kode sandi input. Jika tidak ada input yang tersisa, ini -1.

Karakter selanjutnya adalah ?- keputusan. Jika bagian atas tumpukan positif, itu berbelok ke kanan, membungkus kubus sampai menyentuh /yang mengirimnya kembali ke i, membuat loop input. Namun, jika TOS negatif, input telah selesai, dan karena itu belok kiri ke loop output.

Loop output sederhana. o;output dan muncul TOS. Pertama kali ini dijalankan, -1adalah bagian atas tumpukan, tetapi tidak memetakan ke karakter dan karenanya diabaikan. /mencerminkan IP untuk bergerak ke kiri, di mana ia bertemu !@- yang mengakhiri program jika tumpukan kosong. Jika tidak, IP berlanjut, tekan ?lagi - karena stack tidak kosong, TOS harus berupa kode sandi, semuanya positif 1 , jadi ini membuat IP berbelok ke kanan dan melanjutkan loop output.


1 Kedua solusi mengasumsikan bahwa input tidak akan berisi byte nol.

FlipTack
sumber
4

05AB1E, 1 byte

R

R membalikkan input.

Pidosa
sumber
1
Terima kasih telah menggunakan 05AB1E :). Anda tidak memerlukannya ,di bagian akhir, karena bagian atas tumpukan dicetak secara otomatis ketika tidak ada yang dicetak.
Adnan
@ Adnan Terima kasih atas tipnya.
Pidosa
4

Wumpus , 12 byte

i=)!4*0.l&o@

Cobalah online!


Jawaban Martin menunjukkan kontrol grid segitiga Wumpus mengalir dengan baik, tapi saya pikir saya akan mencoba tantangan ini dengan one-liner.

Versi yang lebih mudah dipahami (satu byte lebih lama) adalah:

i=)!8*0.;l&o@

yang berfungsi seperti ini:

[Input loop]
i        Read a byte of input (gives -1 on EOF)
=)!      Duplicate, increment then logical not (i.e. push 1 if EOF, else 0)
8*       Multiply by 8 (= x)
0        Push 0 (= y)
.        Jump to (x, y), i.e. (8, 0) if EOF else (0, 0) to continue input loop 

[Output]
;        Pop the extraneous -1 at the top from EOF
l&o      Output <length of stack> times
@        Terminate the program

Sekarang mari kita lihat versi golf, yang berbeda di tengah:

i=)!4*0.l&o@

Versi golf menyimpan byte dengan tidak memerlukan perintah eksplisit ;untuk memunculkan -1 yang asing. Pada EOF, program ini melompat ke (4, 0)alih-alih (8, 0)menjalankannya 4*0.lagi - kecuali kali ini -1 asing ada di atas! Ini menyebabkan kita melompat (-4, 0), yang karena pembungkusnya sama dengan (8, 0)grid ini, membawa kita ke tempat yang kita inginkan sambil mengonsumsi nilai asing pada saat yang sama.

Sp3000
sumber
4

Wumpus , 13 11 byte

)?\;l&o@
=i

Cobalah online!

Penjelasan

Karena Wumpus adalah bahasa berbasis tumpukan, ide dasarnya adalah membaca semua STDIN ke tumpukan dan kemudian hanya mencetak seluruh tumpukan dari atas ke bawah. Bagian yang menarik di sini adalah aliran kontrol melalui grid.

Untuk memahami aliran kontrol, kita perlu melihat tata letak kotak segitiga yang sebenarnya:

masukkan deskripsi gambar di sini

IP dimulai di sudut kiri atas ke timur. Kita dapat melihat bahwa ada loop melalui kelompok enam sel di sebelah kiri, dan cabang dari \. Seperti yang Anda harapkan, loop membaca semua input, dan bagian linier pada akhirnya menulis hasilnya kembali ke STDOUT.

Mari kita lihat loop pertama. Lebih masuk akal untuk menganggap yang pertama )?\sebagai bukan bagian dari loop, dengan loop yang sebenarnya dimulai pada i. Jadi, inilah bit awalnya:

)   Increment an implicit zero to get a 1.
?\  Pop the 1 (which is truthy) and execute the \, which reflects the IP
    to move southwest.

Kemudian loop dimulai:

i   Read one byte from STDIN and push it to the stack (or -1 at EOF).
    Note that Wumpus's grid doesn't wrap around, instead the IP reflects
    off the bottom edge.
=   Duplicate the byte we've read, so that we can use it for the condition
    later without losing it.
)   Increment. EOF becomes zero (falsy) and everything else positive (truthy).
?\  If the incremented value is non-zero, execute the \ again, which 
    continues the loop. Otherwise (at EOF), the \ is skipped and the
    IP keeps moving east.

Yang meninggalkan bagian linear di akhir:

;   Get rid of the -1 we read at EOF.
l   Push the stack depth, i.e. the number of bytes we've read.
&o  Print that many bytes.
Martin Ender
sumber
3

PHP - 44 karakter

<?=strrev(file_get_contents('php://stdin'));
ircmaxell
sumber
3

Perl

print scalar reverse for reverse(<STDIN>);
huntar
sumber
3

Fisi , 20 15 byte

KX$ \
!
SR?J%
~

Algoritma ini sangat mirip dengan Martin, tetapi implementasinya berbeda secara signifikan.

Bagaimana itu bekerja

Semuanya dimulai R, yang melepaskan atom ke timur dengan massa 1 dan energi 0.

Setelah memukul ?, karakter input disimpan sebagai massa atom, dan energi dibiarkan pada 0 kecuali stdin mengembalikan EOF, di mana energi kasus menjadi 1.

Jadalah perintah lompatan Fission, dan melompati atom ke depan sejumlah sel yang setara dengan energi saat ini, meninggalkan atom dengan energi 0. Untuk saat ini, atom kita memiliki 0 energi dan mengabaikan perintah ini.

Kami kemudian menyerang %, yang merupakan saklar. Dengan energi lebih besar dari 0, atom kita akan diarahkan ke bawah (seolah dipantulkan oleh \cermin), tetapi karena kita memiliki energi tepat 0, kita dikirim ke atas oleh cermin yang berlawanan /,.

Atom kita terus berlanjut sampai ia mencapai cermin kedua, \kali ini mengarahkannya ke kiri.

Kami menambah energi atom menjadi 1 dengan $, dan digunakan Xuntuk menduplikasi atom. Satu salinan akan mencerminkan kembali ke $perintah (meninggalkan salinan itu dengan 2 energi) dan salinan lainnya akan didorong ke tumpukan K,.

Salinan kami yang dipantulkan bergerak mundur dari mana itu datang sampai menyentuh %saklar lagi. Sekarang kita memiliki energi positif, kita merefleksikan seolah-olah kita telah menabrak \cermin, membungkus papan ke yang berikutnya Sdan mengurangi energi kita menjadi 1.

The Sperintah akan mengkonsumsi 1 energi untuk melestarikan arah kami. Seandainya kita tidak punya energi, atom akan dibelokkan seolah-olah terkena \cermin, ke bawah. Sebagai gantinya, kami bergerak ke kanan lagi dan mengambil lebih banyak input dengan ?dan siklus berulang.

Setelah atom kita mencapai EOF, ?perintah akan menyimpan 1 energi dalam atom. Jadi, ketika kita menekan Jperintah kali ini, kita sepenuhnya melompati %sakelar dan mendarat di Ssakelar dengan 0 energi.

Sekarang, karena energi kita dikonsumsi dalam lompatan, arah kita tidak dipertahankan oleh Ssaklar, tetapi kita agak diarahkan ke bawah. Kami kemudian mengurangi energi kami menjadi -1 dengan ~perintah dan membungkus papan. Ketika dipukul dengan energi negatif, Kperintah muncul atom bukannya mendorongnya. Kami mengeluarkan atom yang baru muncul dengan kami !, dan menggunakan energi 1 dari atom itu untuk mem-bypass Sswitch, dan siklus selesai.

Jika tumpukan Kitu kosong, energi atom kita dinegasi (menghasilkan energi +1) dan dipantulkan kembali ke ~perintah, meninggalkannya dengan energi 0. Setelah memukul Slagi, kita dibelokkan ke kanan, sampai ?dipukul. Karena EOF telah tercapai, ?menghancurkan atom dan mengakhiri program.

BrainSteel
sumber
3

Labirin , 10 byte

,)";@
:".(

Biasanya, program Labyrinth seharusnya menyerupai labirin, tetapi saya dapat menekan loop dalam satu ini dengan sangat ketat, sehingga kode tersebut berakhir sebagai satu blok (ruang?). Ini adalah versi yang sedikit diperluas yang membuatnya lebih mudah untuk mengikuti aliran kontrol:

,""")""""""";""@
"   "   "   "
:""""   ."""(

,membaca satu byte pada satu waktu dari STDIN hingga mencapai EOF dan kembali -1. The )bertahap nilai ini sehingga kita mendapatkan sesuatu yang positif untuk setiap byte membaca dan nol pada EOF. The :duplikat setiap membaca byte.

Setelah kita menekan EOF, penunjuk instruksi melanjutkan ke loop kedua, di mana itu berulang kali membuang satu nilai dengan ;(awalnya EOF, kemudian salinan kedua dari setiap byte), kemudian menurunkan nilai berikutnya dengan (dan mencetaknya dengan .. Karena salinan kedua (yang selalu positif) kita tahu bahwa IP akan berbelok ke kanan di atas dan melanjutkan di loop ini.

Setelah semua byte dicetak, bagian atas tumpukan adalah nol lagi dan IP terus lurus ke depan @dan program berakhir.

Duplikasi yang tampaknya tidak perlu dari setiap byte adalah apa yang memungkinkan saya untuk memastikan bahwa (bahkan dalam loop ketat dari versi golf) IP selalu mengambil belokan yang benar dan tidak pernah melintasi dari satu loop ke loop lainnya.

Tip untuk TheNumberOne dan Sp3000 yang upayanya sendiri banyak membantu dalam menemukan solusi yang sangat terkompresi ini.

Martin Ender
sumber