Ters stdin ve stdout'taki yer


58

Gereksinimler:

  • Sınırsız uzunlukta yeni satırlar / satır başı iadeleri içeren stdin'e bir giriş yapın (yalnızca sistem belleği tarafından sınırlandırılmış; yani programda içsel bir sınır yoktur).
  • Stdout'ta girişin tersini verin.

Örnek:

Giriş:

Quick brown fox
He jumped over the lazy dog

Çıktı:

god yzal eht revo depmuj eH
xof nworb kciuQ

En kısa kazançlar.

Liderler Sıralaması:

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>


5
PHP gibi standart kütüphane işlevlerine izin veriyor musunuzstrrev
Ming-Tang

Çıktının, girişin son satırını son yerine başlangıç ​​noktasına koymasına izin veriliyor mu?
Joey Adams

@Joey Adams, evet, girişi tam olarak kopyalamalıdır.
Thomas O

53
Örneğin biraz yanlış. Senin girişinin ters olacaktır: ƃop ʎzɐʃ ǝɥʇ ɹǝʌo pǝdɯnɾ ǝH xoɟ uʍoɹq ʞɔınΌ;-P
ninjalj

Sadece kodu çalıştıran sisteme girebilecek karakterleri desteklemem gerekiyor mu?
Altın Oran

Yanıtlar:


25

Golfscript - 3 karakter

-1%

şaşkın versiyonu da 3 karakter

0(%

İşte % nasıl çalıştığını bir açıklama


9
Golfscript ile nasıl rekabet edebiliriz?
Thomas O

12
@Thomas: FlogScript kullanarak sanırım. Her durumda, önemsiz bir görev gönderirseniz, çözümlerin eşit derecede önemsiz olmasını beklersiniz. Ve eğer Python'da üç yöntem çağırırsa, Golfscript'te üç karakter de olabilir.
Joey

1
@Tomas: Üzgünüm, açık değildi. Bazı üyelerin bu dille ilgili mizahsız görünen sessizce tartışmalar yaptıkları göz önüne alındığında, burada benzer olduğunu varsaymak mantıksızdı.
Joey

3
@Joey GolfScript, eğitimsiz bir göze ses gibi göründüğü için daha komik bir umutsuzluktu.
Thomas O

36
Öyleyse ikincisi şaşkına döndü ama ilki değil. Anladım.
C0deH4cker

44

Bash - 7

tac|rev

tacrevkarakter sırasını tersine çevirirken satır sırasını tersine çevirir.


Sadece bir sonraki adıma geçelim ve bunu bir harfli bash komutuna verelim! alias z='tac|rev'
Daniel Standage,

18
@Diniel Makroları tanımlamak için derleyici bayraklarını kullanmakla aynı şeydir, yani kod golf ruhuna aykırı.
marcog

rev|tacAynı puan için aldım - bunun sadece Bash için değil, herhangi bir POSIX kabuğu için işe yaradığını söyleyen bir not ekleyerek.
Toby Speight

35

BrainFuck, 10 karakter

,[>,]<[.<]

Böyle basit bir dil için iyi cevaplar alır.


2
DNA her zaman sırasını tersine çevirir, bu nedenle gözlemlediğiniz şeydeki bilgilerin ve hesaplamanın doğası hakkında temel bir şey vardır. Rosalind.info'daki problemleri bir kat kabuk ile çözerken bu çözüme rastladım.
ixtmixilix

9
@ixtmixilix Aslında sadece yığınlar ve ters şeyler hakkında temel bir şey söylüyor.
Cruncher



16

Python, 41 40 bayt

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

41 -> 40 - program sonunda noktalı virgül kaldırıldı.

Muhtemelen optimize edilmiş olabilir!


Keşke PowerShell'de bir şeyi ters çevirmenin kolay bir yolunu olsaydı ;-)
Joey

6
Marslı insanlar, her zaman faydalıdır. [:: - 1]
Wok

1
Peki print raw_input()[::~0]]? Hala Python 2 yüzündenprint
CalculatorFeline

İşte bir kod golf girişi biçimlendirme ipucu. Her zaman programı yazdığınız dili şu formatta yazın:# Language Name, Character/Byte Count
dorukayhan

15

Krep Yığını , 342 316 bayt

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!

Girişin boş bir karakterle ( ^@komut satırında) sonlandırıldığını varsayar . Yorumlayıcıyı kullanarak örnek çalıştırma :

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

12

APL, 2

⊖⍞

Veya eğer karakterlerin gelmemesi durumunda CircleBar QuoteQuad, basitçe anlamı: klavye karakter girişi.


Bayt sayını yarıya indir! İhtiyacın bile yok . atanır ve kullanılabilecek tam bir anonim fonksiyonudur: f←⌽ f 'The quick brown fox'.
Ad'm

^^^^ Kazanan ^^^^
Hesap MakinesiFeline

@ Nᴮᶻ: spec, girdiyi bir dize değişmezinden değil, stdin'den almamı söyledi :)
jpjacobs 17:16

jpjacobs Yaygın PPGC uygulaması, stdin'i desteklemeyen (veya kullanması normal değil) diller için stdin yerine satır içi argümana izin vermektir.
Adám

11

Perl - 23

print scalar reverse <>

6
Üçüncü boşluğu kaldırabilirsiniz.
Timwi

6
Aslında, print"".reverse<>sadece 17 karakter. Perl 5.10+ ile, sayyerine iki karakter daha kaydedebilirsiniz print.
Ilmari Karonen

4
Bunun çok eski olduğunu biliyorum , ama şunu da yapabilirsiniz: print~~reverse<>16 karakter için
Dom Hastings

5
@DomHastings Ve Perl 5.10+ ile, say~~reverse<>işe yarar mı? 14 karakter.
Timtech


10

C - 47 karakter

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

Bunun O (n) yığın alanı kullandığını unutmayın. Çevrimiçi deneyin!


Tek kelimeyle harika!
st0le

1
Sadece senin fikrin ama bu 2-3 anahtar vuruş kaydeder:main(c){(c=getchar())>0&&main(),putchar(c);}
Quixotic

2
C sayıları boolean olarak değerlendirir mi? Öyleyse, c>=0olabilir~c
Cyoce

9

Windows PowerShell, 53 54

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

2011-01-30 (54) - İlk deneme

2011-01-30 (53) - Satır içi satır sonları eğlenceli.

2011-01-3- (52) - Satır içi değişken atamaları da.


-join($a="$args")[$a.Length..0]crlfSunulan örnek için kendi başlarına çalışıyor gibi görünüyor, Windows ile çalışan çizgi çubuklarıyla ilgili herhangi bir sorunum yok - psv2 veya bu yazıldığında ne kullandığınızdan emin değil.
17'de

@ConnorLSW: Bu stdin'den bile okumuyor. Ve $inputbir numaralandırıcı satır üreten, bu yüzden onu bu şekilde dize edemezsiniz.
Joey


8

Befunge-93 - 11x2 (22 karakter)

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

Bu tercüman kullanılarak test edilmiştir .


19
Klavyenizdeki rastgele tuşlara basmadığınızdan emin misiniz?
Thomas O,

@Tomas - Bağlantılı tercümanı kullanmaya çalışmadığınızdan emin misiniz? Bir şey indirmekten endişe duyuyorsanız web tabanlı.
MiffTheFox

4
Sadece şaka yapıyorum. İşe yarayacağından eminim, ama sadece bazı tuşlara rastgele basmış gibisin. Bu çok kompakt bir dili gösterir.
Thomas O



6

Fisyon , 16 14 12 bayt

DY$\
?
[Z~K!

açıklama

Kontrol akışı, Daşağıya doğru giden bir (1,0)atomla başlar. Her ?seferinde bir karakter olan STDIN'den okur, kütleyi okuma karakter koduna ve enerjiye ayarlar 0. Bir kez EOF'a bastığımızda, ?bunun yerine enerjiyi ayarlar 1. [Bir üzerine atomunu yönlendirir Zanahtarı. Karakterleri okuduğumuz sürece, enerji olacak 0, böylece atom yukarı tarafından saptırılır Z. Atomun klonlanması, bir kopyasını tekrar ?okuma girişine geri döndürmek için geri döndürüyoruz . Biz diğer kopyanın enerjisini artırmak 1ile $ve yığının üzerine bastırın K. Yani giriş döngüsü bu:

DY$\
?
[Z K

Enerji 1EOF'ye bağlı olduğunda, Zbunun yerine atomun doğrudan geçmesine izin verecek ve enerjiyi 0tekrar azaltacaktır . ~enerjiyi daha da azaltır -1. Negatif enerji ile Atomlar pop yığınından, bu yüzden ters sırayla karakterleri almak ve bunları yazdırabilirsiniz !. Şimdi kılavuzun toroid olduğunu, dolayısıyla atomun aynı sıranın sol kenarında tekrar göründüğünü not edin. İtilmiş atomların enerjisini daha önce arttırdığımızı hatırlayın $, bu yüzden atomlar artık 1en son çıkış gibi enerjiye sahipler ?ve tekrar doğrudan içinden geçecekler Z. EOF’dan sonraki yol

?
[Z~K!

Alt satırdaki bu döngü, yığın boşalana kadar devam eder. Bu olduğu zaman, atom geri yansır Kve enerjisi pozitif olur ( +1). ~Eksilme şimdi vurmak böylece bir kez daha, (sola hareket) Zpozitif olmayan enerji ile. Bu, atomu aşağıya doğru saptırır, öyle ki Ydepolandığı yerin kenarına kadar uzanır ve daha fazla hareketli atom olmadığından, program sona erer.


lol neden bu bana minecraft hatırlatıyor?
don

Vay canına ve dil örneklemindeki uygulamamın en az 16 karakterde olduğunu düşündüm. Etkileyici!
C0deH4cker

6

> <>, 16 14 bayt

@JoKing tarafından -2 bayt

iki yıl (!) sonra, durma için mantığın etrafında kaydırarak fazlalık -1 okuma girişinden kaldırır.

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

Çevrimiçi deneyin!

Diğer> <> cevabına benzer şekilde, girişin ilk satırda okunması nedeniyle yığını tersine çevirmek gerekmez. Aslında bunun, diğer> <> cevabı için bir öneri olması gerekip gerekmediğinden emin değilim, çünkü görünüş olarak oldukça farklı fakat konsept açısından benzer.

Asıl fark, cevabımın girişi 0 ile karşılaştırması ve eğer daha az olması durumunda (yani giriş yok - giriş iyoksa -1 döndürür), (1,7) 'e atlar, (0, 7). Bir öncekine atlarsa, en üstteki değeri (-1) çıkar ve bir yazdırma döngüsü başlatır. İkincisine atlarsa, giriş döngüsüne devam eder.

11 bayt, bir hata ile çıkar

@JoKing'in İzniyle

i:0(7$.
~o!

Çevrimiçi deneyin!

Bunun şimdi meta konsensüs ile geçerli olduğuna inanıyorum.

Önceki cevap (14 bayt)

i:0(7$.
~ol0=?;!

2
-5 bir bayt ile biten bayt . Aksi takdirde -2 bayt (boş girişte hatalar). Ayrıca hareket ettirerek düzeltilebilir boş girişinde orijinal hataları, osonra;
Jo Kral

1
@JoKing Parçayı iyi yakala o; o zaman farketmedim. Ve tasarruf için teşekkürler. Son -1'den kurtulmak için karşılaştırmanın zekice kullanımı.
Cole

1
Hmm, aslında bu (ı kolayca takas cevapsız inanamıyorum 13 bayt için de sadece çalışır 0=?için ?!)
Jo Kral

@JoKing -1 Byte ? karakter 0 ise yığının tepesini kontrol eder, sonra uzunluk ile karşılaştırmaya gerek kalmaz, sadece l.
Teal pelikan

Evet @TealPelican, benim ikinci açıklamada dile
Jo Kral


5

Yığın Kediler , 7 bayt

<!]T[!>

Çevrimiçi deneyin!

Aynı bayt sayısı için birçoğu, birçoğunun çalışma şekliyle eşdeğer olan alternatifleri vardır:

açıklama

Kısa bir Stack Cats astarı:

  • Her program ayna simetrisine sahip olmalı ve herhangi bir kod parçasını yansıtarak ters fonksiyonunu hesaplayan yeni bir kod elde ediyoruz. Bu nedenle, programın son üç karakteri, merkezdeki komut için değilse, ilk üçü geri alır.
  • Hafıza modeli, altta, sonsuz miktarda sıfır bulunan bir yığın yığın kasetidir. İlk yığında -1bu sıfırların tepesinde ve daha sonra giriş baytı bunun üstünde (en üstte ilk bayt ve yukarıdaki son bayt ile -1) bulunur.
  • Çıktı için son yığını alırız, -1varsa altta a atarız ve sonra tüm değerleri bayt olarak STDOUT'a yazdırırız.

Şimdi asıl program için:

<    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 diğer 7-byte çözümlerini bulmak için kaba kuvvet arayışını başlattı, işte bazı alternatifler:

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

Bu üç değişken temelde aynıdır, ancak bitsel NOT hesaplanırken farklılık göstermemeleri ve boş yığını sağda mı yoksa sağda mı kullanmamız gerektiğinden farklıdır.

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

Yukarıdaki açıklamada söylediğim gibi, Tyığının üstü sıfır olduğunda hiçbir şey yapmaz. Bu aslında !onun yerine ortayı koyabileceğimiz anlamına geliyor . Bu ilk anlamına gelir To zaman içine üstünde sıfır edecek, no-op -1ve daha sonra daha sonra ikinci Tters gerçekleştirir. Tabii ki, bu, son bellek durumunun, -1orijinal olanın yanında bir yığında olduğu anlamına gelir , ancak bunun sadece mevcut bant kafası pozisyonundaki yığının çıktıyı etkilemesi önemli değildir.

<*ITI*>

Bu değişken , sıfıra dönüşmesi için *yerine (XOR 1) kullanır ve pozitif değerleri ve sağ, negatif değerleri sola iten ve her iki durumda da bunları negatifleyen bir koşullu itmedir. Karşılaştığımız zaman orjinal yığının üstüne ), bu nedenle sonuçta orjinal çözüm ile aynı şekilde çalışır .!+1I-1T<!]T[!>


4

PHP, 82 29 24 29 28 karakter

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

82 -> 29: Yeni satır karakteri ile ters çevrildiğinde korunur strrev.
29 -> 24: Kısayol sözdizimini şimdi kullanıyor
24 -> 29: Şimdi tek satır yerine tüm satırları okuyor


Bir problem: fgets(STDIN)sadece ilk satırı okur.
Lütfen

Tüm satırları okumak için kod güncellendi.
Kevin Brown,

1000 karakter yapay limitiniz dışında
isimsiz korkak

Aşağıdaki Python ile eşleşme sınırı güncellendi, bu kadarını kullanan birini hayal bile edemiyorum.
Kevin Brown,

4

Befunge-98 - 11 10

#v~
:<,_@#

(Cfunge ile test edilmiştir)

Aşağıdaki değişken gereksinimi hafifçe kırar: görevi yerine getirir ancak daha sonra sonsuz bir boş bayt akışı üretir (ve sonlandırmaz).

~#,

Çalışma şekli, art arda yığına ( ~) her seferinde bir karakter girerek #, virgülün üzerine atlayarak ( ) üst üste okur olmasıdır . EOF'ye ulaşıldığında, ~bir yansıtıcı olarak hareket eder ve PC ters çevrilir, arka arkaya bir karakter ( ,) eklenirken ( #) tilde atlayarak ( ) atlar.


Hat 1: Aşağıda daha kısa bir versiyonu (10 karakter) olan #v~hat 2: :<,_@#. Komik kullanarak jburada geliştirmek değil.
Justin

IP yönünü bir çeşit olumsuzlama olarak kullanan @Quincunx.
FireFly

4

Pyth - 3 5 4 bayt

Yani, orijinal 3-char sürüm, satır sırasını, sadece satırları ters etmedi. Daha sonra bu 5-char sürümü ile geldi:

_jb.z

Bunun için @FryAmTheEggman sayesinde 1 byte tasarruf ettim:

_j.z

Canlı demo.

Açıklama:

  .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

Orijinal (yanlış) çözüm:

Bu teknik olarak sayılmaz çünkü Pyth 2014'te yaratıldı, ancak GolfScript ile bağlantılı olması çok düzenli.

#_w

Açıklama:

#    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

2
Spesifikasyona uymuyor, ne yazık ki - satırların sırasının da tersine çevrilmesi gerekiyor.
DLosc

Fk_.z_kBirinin bundan daha kısa bir şey alabileceğine eminim, ama elimde bu var.
gcq

@gcq Daha kısa bir sürümüne sahibim (5 karakter), ancak düzenleme şansım olmadı.
kirbyfan64sos

@DLosc Sabit! Tüm girişi okudum, yeni hatlara girdim ve bunu tersine çevirdim.
kirbyfan64sos

@FryAmTheEggman Ah, evet! Bunu birkaç ay önce gönderdiğimde bunu bilmiyordum.
kirbyfan64sos 23:15

4

Cubix , 9 8 bayt

Martin Ender'e bu golf için çok teşekkürler:

w;o@i.?\

Çevrimiçi çalıştığını görün!

Bu, şu küp olur ( >başlangıç ​​talimat göstergesini gösterir):

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

Programın ilk adımı tüm girişi yapmaktır. iyığına 1 baytlık girdi koyar. Giriş tamamlanmadıkça, ?IP'yi sağa döndürür, ulaşana kadar küpün etrafına sararak wgeri gönderir i.

Giriş tamamlandığında, ?IP kafasını kuzeye çevirir ve çıkış döngüsüne girer:

  • o: karakteri yığının üstüne bas
  • w: işaretçiyi 'sağa kaldır'
  • ;: az önce basılan karakteri patlat
  • \: IP’yi yansıtmak, Doğu’ya göndermek
  • ?: Yazdırılacak kalan karakterler varsa, sağa çevirin, tekrar döngüye alın.

Son kez ?vurulur, yığında hiçbir şey kalmazsa IP bunun yerine devam eder:

  • i: girişin bir baytını alır. Bu -1girdi bitmiş gibi olacak .
  • \: IP’yi, Kuzey’e göndererek:
  • @: programı sonlandırmak.

9 byte çözüm

..o;i?@!/

Çevrimiçi çalıştığını görün!

Küp şeklinde:

      . .
      Ö ;
> ben? @! /. . .
  . . . . . . . .
      . .
      . .

iKodlanan ilk karakter , girişin bir kodunu alan karakterdir . Giriş kalmadıysa, bu -1.

Bir sonraki karakter ?- bir karar. Yığının üstü pozitifse, sağa döner, küpün etrafına dolanana kadar /geri sarılarak ibir giriş döngüsü oluşturur. Bununla birlikte, eğer TOS negatifse, giriş tamamlanmıştır ve bu nedenle çıkış döngüsüne sola döner.

Çıkış döngüsü basittir. o;TOS'u çıkarır ve çıkar. Bu ilk çalıştırıldığında, -1yığının tepesidir, ancak bir karakterle eşleşmez ve bu nedenle göz ardı edilir. /IP'yi karşılaştığı yerde sola doğru hareket ettirir !@- yığın boşsa programı sonlandırır. Aksi takdirde, IP isabet devam ?yığın boş değil çünkü, TOS pozitif hepsi bir charCode olmalı - yine 1 , bu nedenle bu IP sağa dönün ve çıkış döngü devam yapar.


1 Her iki çözüm de girişin boş bayt içermeyeceğini varsayar.


4

05AB1E, 1 bayt

R

R girişi tersine çevirir.


1
05AB1E :) kullandığınız için teşekkür ederiz. ,Sonuna ihtiyacınız yok , çünkü yığının üstü hiçbir şey yazdırılmadığında otomatik olarak yazdırılıyor.
Adnan

@Adnan Tahmininiz için teşekkürler.
penalosa

4

Wumpus , 12 bayt

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

Çevrimiçi deneyin!


Martin'in cevabı Wumpus'un üçgen ızgara kontrol akışının iyi akışını gösteriyor, ancak bu zorluğa bir astarla deneyeceğimi düşündüm.

Sürümü daha kolay anlamak (bir bayt daha uzun):

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

hangi gibi çalışır:

[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

Şimdi ortada farklılık gösteren golf versiyonuna bir göz atalım:

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

Golf edilmiş sürüm ;, harici -1 komutunu açmak için açık bir komuta gerek duymadan byte tasarrufu sağlar . EOF'da, bu program tekrar yürütüldüğü (4, 0)yerine atlar - bu zaman dışında yabancı -1 en üsttedir! Bu, atlanmamıza neden olur ; bu, sarma nedeniyle, bu ızgara için olduğu gibidir; yabancı değeri aynı anda tüketirken istediğimiz yere ulaştırır.(8, 0)4*0.(-4, 0)(8, 0)


4

Wumpus , 13 11 bayt

)?\;l&o@
=i

Çevrimiçi deneyin!

açıklama

Wumpus yığın tabanlı bir dil olduğundan, temel fikir tüm STDIN'i yığına okumak ve ardından tüm yığını yukarıdan aşağıya yazdırmaktır. Buradaki ilginç kısım, şebekeden kontrol akışıdır.

Kontrol akışını anlamak için gerçek üçgen ızgara düzenine bakmamız gerekir:

görüntü tanımını buraya girin

IP, sol üst köşeden doğuya doğru ilerleyerek başlar. Soldaki altı hücreli gruptan geçen bir döngü olduğunu ve daldan ayrıldığını görebiliriz.\ . Beklediğiniz gibi, döngü tüm girişi okur ve sonunda lineer bölüm sonucu tekrar STDOUT'a yazar.

İlk önce döngüye bakalım. )?\Asıl döngüden başlayarak ilkiğin bir parçası olarak düşünmemek daha mantıklıdır i. İşte ilk başlangıç:

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

Sonra döngü başlar:

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.

Bu sonunda doğrusal bölüm bırakır:

;   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.

3

PHP - 44 karakter

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


3

Fisyon , 20 15 bayt

KX$ \
!
SR?J%
~

Algoritma, Martin'e çok benzer, ancak uygulama önemli ölçüde farklılık gösterir.

Nasıl çalışır

Her şey R, kütle 1 ve enerji 0 olan bir doğuya doğru atomu serbest bırakır.

Vurulduktan sonra ?, bir giriş karakteri atomun kütlesi olarak kaydedilir ve stdin EOF'yi döndürmediği sürece enerji 0'da kalır, bu durumda enerji 1 olur.

JFission'ın atlama komutu, bir atomu, mevcut enerjisine eşdeğer sayıda hücreyi ileri atlayarak atomu 0 enerjiyle bırakır. Şimdilik, atomumuz 0 enerjiye sahip ve bu komutu yok sayar.

Daha sonra grev yaptık %, bu bir anahtar. 0'dan daha büyük enerjiyle atomumuz aşağı doğru yönlendirilir ( \aynada yansıtılmış gibi ), ancak tam olarak 0 enerjimiz olduğundan, karşıt ayna tarafından yukarı gönderiliriz /.

Atomumuz ikinci bir ayna çarpıncaya kadar devam eder, \bu sefer onu sola yönlendirir.

Atomun enerjisini 1 ile arttırır ve atomu kopyalamak için $kullanırız X. Bir kopya tekrar $komuta yansıtacaktır (bu kopyayı 2 enerjiyle bırakarak) ve diğer kopya yığına itilecektir K.

Yansıtılan kopya, %anahtara tekrar basana kadar geldiği yerden geriye doğru hareket eder . Şimdi pozitif bir enerjimiz var, sanki bir \aynaya çarptığımızı , tahtayı bir sonrakine Ssardığımızı ve enerjimizi 1'e düşürdüğümüzü yansıtıyoruz .

SKomut yönümüzü korumaya 1 enerji tüketecektir. Enerjimiz olmasaydı, atom \aşağı doğru bir ayna çarpmış gibi sapardı. Bunun yerine, tekrar sağa doğru hareket ediyoruz ve ile daha fazla girdi alıyoruz ?ve döngü tekrarlıyor.

Atomumuz EOF'a ulaştığında, ?komut atomda 1 enerji depolar. Böylece, Jbu sefer komuta girdiğimizde, %anahtarı tamamen atlıyoruz ve Sanahtara 0 enerji ile iniyoruz.

Enerji atlama tüketildiği beri Şimdi, bizim yönü olduğunu değil korunmuş Sanahtarı, ama biz daha ziyade aşağı doğru yönlendirilir. Daha sonra ~komutumuzla enerjimizi -1'e düşürüp tahtanın etrafına sardık. Negatif enerji ile çarptığında, Kkomut çıkar yerine birini iterek bir atom. Yeni attığımız atomumuzu çıkardık !ve bu Sdüğmeyi atlamak için o atomun 1 enerjisini kullanırız ve döngü tamamlanır.

Yığın Kboşsa, atomumuzun enerjisi yok sayılır (+1 enerjiyle sonuçlanır) ve tekrar ~enerjiye 0 bırakarak komuta geri yansıtılır . EOF'ye ulaşıldığından beri , atomu yok eder ve programı sonlandırır.S??


3

Labirent , 10 bayt

,)";@
:".(

Normalde, Labyrinth programlarının labirentlere benzemesi gerekiyordu, ama buradaki ilmekleri o kadar sıkıştırabilirdim ki, bu kod tek bir blok (oda?) Olarak bitti. Kontrol akışını takip etmeyi kolaylaştıran biraz genişletilmiş bir sürüm:

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

,STDIN'den her defasında bir bayt'ı EOF'ye ulaşana ve geri döndürene kadar okur -1. )Artışlarla bu değer o yüzden EOF her okuma bayt ve sıfır için olumlu bir şey olsun. :Çiftleri her bayt okuyun.

EOF'a bastığımızda, komut göstericisi ikinci döngüye ilerler, burada bir değeri tekrar tekrar atar ;(başlangıçta EOF, daha sonra her bir baytın ikinci kopyası), ardından bir sonraki değeri azaltır ve ile (yazdırır .. Bu ikinci kopyadan dolayı (her zaman pozitif olan) IP’nin en üstte sağa döneceğini ve bu döngüde devam edeceğini biliyoruz.

Tüm baytlar yazdırıldıktan sonra yığının üst kısmı tekrar sıfır olur ve IP dümdüz devam eder @ve program sona erer.

Her bir baytın görünüşte gereksiz bir şekilde kopyalanması, (golf sürümünün sıkı döngülerinde bile) IP'nin her zaman doğru dönüşü aldığını ve asla bir döngüden diğerine geçmediğinden emin olmamı sağladı.

Şapkalı bir ipucu olan TheNumberOne ve Sp3000, kendi girişimleri bu oldukça sıkıştırılmış çözümü bulmakta çok yardımcı oldu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.