ย้อนกลับ stdin และวางบน stdout


58

ที่ต้องการ:

  • รับอินพุตบน stdin รวมถึงบรรทัดใหม่ / การขึ้นบรรทัดใหม่ที่มีความยาวไม่ จำกัด (จำกัด โดยหน่วยความจำระบบเท่านั้นนั่นคือไม่มีข้อ จำกัด โดยธรรมชาติในโปรแกรม)
  • เอาต์พุตกลับด้านของอินพุตบน stdout

ตัวอย่าง:

การป้อนข้อมูล:

Quick brown fox
He jumped over the lazy dog

เอาท์พุท:

god yzal eht revo depmuj eH
xof nworb kciuQ

ชนะสั้นที่สุด

ลีดเดอร์บอร์ด:

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
คุณอนุญาตฟังก์ชั่นห้องสมุดมาตรฐานเช่น PHPstrrev
Ming-Tang

เอาต์พุตอนุญาตให้วางบรรทัดใหม่ล่าสุดของอินพุตที่จุดเริ่มต้นแทนที่จะสิ้นสุดหรือไม่?
Joey Adams

@ โจอดัมส์อ๋อมันควรทำซ้ำอินพุตอย่างแน่นอน
โทมัส O

53
ตัวอย่างของคุณค่อนข้างผิด การย้อนกลับของข้อมูลที่คุณป้อนจะเป็น: ƃop ʎzɐʃ ǝɥʇ ɹǝʌo pǝdɯnɾ ǝH xoɟ uʍoɹq ʞɔınΌ;-P
ninjalj

ฉันต้องการเฉพาะตัวอักษรที่สามารถป้อนเข้าสู่ระบบในการใช้งานรหัสได้หรือไม่
อัตราส่วนทองคำ

คำตอบ:


25

Golfscript - 3 ตัวอักษร

-1%

รุ่นที่สับสนก็คือ 3 ตัวอักษร

0(%

นี่คือคำอธิบายว่า%ทำงานอย่างไร


9
เราจะแข่งขันกับ Golfscript ได้อย่างไร?
โทมัสโอ

12
@ โทมัส: โดยใช้ FlogScript ฉันเดา ไม่ว่าในกรณีใดถ้าคุณโพสต์งานเล็กน้อยแล้วคาดหวังว่าโซลูชันจะไม่สำคัญเท่ากัน และถ้ามันใช้การเรียกเมธอดสามครั้งใน Python ถ้าเช่นนั้นก็สามารถเป็นอักขระสามตัวใน Golfscript
Joey

1
@ โทมัส: ขออภัยมันไม่ชัดเจน เนื่องจากสมาชิกบางคนมีการพูดคุยกันอย่างเงียบ ๆ เกี่ยวกับภาษานี้ซึ่งดูเหมือนจะไม่มีอารมณ์ขัน
Joey

3
@ โจอี้มันเป็นความสิ้นหวังที่มีอารมณ์ขันมากขึ้นเนื่องจาก GolfScript ดูเหมือนจะเป็นเสียงรบกวนต่อสายตาที่ไม่ได้รับการฝึกฝน
โทมัสโอ

36
ดังนั้นอันที่สองนั้นทำให้งงงวย แต่ตัวแรกไม่ได้ Gotcha
C0deH4cker

44

Bash - 7

tac|rev

tacฝืนคำสั่งซื้อบรรทัดในขณะที่revฝืนคำสั่งตัวละคร


ลองทำขั้นตอนต่อไปและตั้งชื่อแทนไปที่คำสั่ง bash ตัวอักษรเดียว! alias z='tac|rev'
Daniel Standage

18
@Diniel มันเหมือนกับการใช้ธงคอมไพเลอร์เพื่อกำหนดมาโครนั่นคือต่อต้านวิญญาณของโค้ดกอล์ฟ
marcog

ฉันมีrev|tacคะแนนเท่ากัน - แค่เพิ่มโน้ตเพื่อบอกว่ามันใช้งานได้กับ POSIX เชลล์ไม่ใช่แค่ Bash
Toby Speight

35

BrainFuck 10 ตัว

,[>,]<[.<]

เอาชนะคำตอบที่ดีสำหรับภาษาง่าย ๆ เช่นนี้


2
DNA กลับคำสั่งของมันตลอดเวลาดังนั้นอาจมีบางสิ่งพื้นฐานเกี่ยวกับธรรมชาติของข้อมูลและการคำนวณในสิ่งที่คุณสังเกต ฉันเจอวิธีนี้ในขณะที่แก้ปัญหาบน rosalind.info ด้วย shell one-liners
ixtmixilix

9
@ixtmixilix ที่จริงแล้วมันแค่พูดอะไรบางอย่างพื้นฐานเกี่ยวกับสแต็คและสิ่งที่ตรงกันข้าม
Cruncher



16

Python 41 41ไบต์

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

41 -> 40 - ลบเครื่องหมายอัฒภาคเมื่อสิ้นสุดโปรแกรม

อาจจะปรับให้เหมาะสม!


ฉันหวังว่าฉันมีวิธีที่ง่ายในการย้อนกลับบางสิ่งบางอย่างใน PowerShell ;-)
Joey

6
คนอังคารมีประโยชน์เสมอ [:: - 1]
กระทะ

1
งั้นprint raw_input()[::~0]]เหรอ? ยังคงเป็น Python 2 เพราะprint
CalculatorFeline

นี่คือเคล็ดลับการจัดรูปแบบรายการรหัสกอล์ฟ เขียนภาษาที่คุณเขียนโปรแกรมด้วยในรูปแบบนี้เสมอ:# Language Name, Character/Byte Count
dorukayhan

15

Pancake Stack , 342 316 ไบต์

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!

สันนิษฐานว่าอินพุตถูกยกเลิกด้วยอักขระ null ( ^@บน commandline) ตัวอย่างการรันโดยใช้ล่าม :

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

⊖⍞

หรือ CircleBar QuoteQuad ถ้าตัวละครไม่ผ่านก็หมายถึง: ใส่ตัวอักษรแป้นพิมพ์ย้อนกลับ


ลดจำนวนไบต์ของคุณลงครึ่งหนึ่ง! คุณไม่จำเป็นต้อง เป็นฟังก์ชั่นที่ไม่ระบุชื่อที่สมบูรณ์ที่สามารถกำหนดและใช้: f←⌽ f 'The quick brown fox'
Adám

^^^^ ผู้ชนะ ^^^^
เครื่องคิดเลข

@ Nᴮᶻ: ดีสเปคดังกล่าวจะได้รับการป้อนข้อมูลจาก stdin ไม่ได้มาจากสตริงตัวอักษร :)
jpjacobs

@ jpjacobs การฝึกแบบ PPGC ทั่วไปคืออนุญาตให้มีการโต้แย้งแบบอินไลน์แทน stdin สำหรับภาษาที่ไม่สนับสนุน
Adám

11

Perl - 23

print scalar reverse <>

6
คุณสามารถลบช่องว่างที่สาม
Timwi

6
ที่จริงแล้วprint"".reverse<>มีเพียง 17 ตัวอักษร และด้วย Perl 5.10+ คุณสามารถบันทึกสองตัวอักษรมากขึ้นโดยใช้แทนsay print
Ilmari Karonen

4
ฉันรู้ว่ามันเก่ามากแต่คุณก็สามารถทำได้เช่นกันprint~~reverse<>สำหรับ 16 ตัวอักษร
Dom Hastings

5
@ DomHastings และด้วย Perl 5.10+ say~~reverse<>จะใช้ได้ไหม 14 ตัวอักษร
Timtech


10

C - 47 ตัวอักษร

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

โปรดทราบว่าสิ่งนี้ใช้พื้นที่สแต็ก O (n) ลองออนไลน์!


ยอดเยี่ยมเพียง!
st0le

1
เพียงแค่ความคิดของคุณ แต่สิ่งนี้จะช่วยลดความยุ่งยากสำคัญ 2-3 ครั้ง:main(c){(c=getchar())>0&&main(),putchar(c);}
Quixotic

2
C ประเมินตัวเลขว่าเป็นบูลีนหรือไม่ ถ้าเป็นเช่นนั้นc>=0จะกลายเป็น~c
Cyoce

9

Windows PowerShell, 53 54

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

2011/01/30 (54) - ความพยายามครั้งแรก

2011-01-30 (53) - ตัวแบ่งบรรทัดแบบอินไลน์สนุก

2011-01-3- (52) - การกำหนดตัวแปรแบบอินไลน์เช่นกัน


-join($a="$args")[$a.Length..0]ดูเหมือนว่ามันจะใช้งานได้ตามตัวอย่างที่ให้มาฉันไม่มีปัญหากับ linebreaks ที่ทำงานกับ windows crlf- ไม่แน่ใจเกี่ยวกับ psv2 หรือสิ่งที่คุณใช้เมื่อสิ่งนี้ถูกเขียนขึ้น
colsw

@ConnorLSW: นั่นไม่ได้อ่านจาก stdin และ$inputเป็นตัวแจงนับบรรทัดดังนั้นคุณจึงไม่สามารถทำให้เป็นเช่นนั้นได้
Joey


8

Befunge-93 - 11x2 (22 ตัวอักษร)

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

ทดสอบโดยใช้ล่ามนี้


19
แน่ใจหรือไม่ว่าคุณไม่เพียงแค่กดปุ่มสุ่มบนคีย์บอร์ดของคุณ?
โทมัส O

@Thomas - คุณแน่ใจหรือว่าคุณไม่ได้ลองใช้ล่ามที่เชื่อมโยงอยู่ เป็นเว็บเบสต์ในกรณีที่คุณกังวลเกี่ยวกับการดาวน์โหลดอะไร
MiffTheFox

4
ฉันแค่ล้อเล่น ฉันแน่ใจว่ามันใช้งานได้ แต่ดูเหมือนว่าคุณจะกดปุ่มบางปุ่มแบบสุ่ม นั่นหมายถึงภาษาที่กะทัดรัดมาก
โทมัสโอ


7

แลมบ์ดาไบนารีแคลคูลัส - 9 ไบต์

16 46 80 17 3E F0 B7 B0 40

ที่มา: http://ioccc.org/2012/tromp/hint.html


รู้จักที่ดีในการเรียนรู้ BLC บ้าง? ดูเหมือนว่าภาษาที่สนุก!
ช่วง

1
@ เฟสนี้มีประโยชน์หากคุณสามารถจัดการกับจำนวนของทฤษฎีตรรกะที่นั่น: tromp.github.io/cl/LC.pdf
C0deH4cker

6

ฟิชชัน , 16 14 12 ไบต์

DY$\
?
[Z~K!

คำอธิบาย

การควบคุมการไหลเริ่มต้นที่Dมีลงไป(1,0)อะตอม ?อ่านจาก STDIN, 0ตัวละครตัวหนึ่งในช่วงเวลาที่การตั้งค่ามวลรหัสตัวอักษรอ่านและพลังงานในการ เมื่อเราตี EOF, แทนจะตั้งค่าพลังงานในการ? 1การ[เปลี่ยนเส้นทางอะตอมไปยังZสวิทช์ ตราบใดที่เรากำลังอ่านตัวอักษรพลังงานจะเป็นดังนั้นอะตอมจะถูกเบี่ยงเบนไปขึ้นโดย0 Zเราโคลนอะตอมโดยวนหนึ่งสำเนากลับเข้าไปในช่อง?เก็บข้อมูลการอ่าน เราเพิ่มพลังงานของสำเนาอื่น ๆ1ด้วย$และกดลงบนสแต็Kก ดังนั้นวงอินพุทคือ:

DY$\
?
[Z K

เมื่อพลังงาน1เกิดจาก EOF ความZตั้งใจจะปล่อยให้อะตอมผ่านไปและลดพลังงานลง0อีกครั้ง ~decrements -1พลังงานต่อไป อะตอมที่มีพลังงานเชิงลบpop!จากสแต็คเพื่อให้เราสามารถดึงตัวอักษรในการสั่งซื้อตรงข้ามและพิมพ์พวกเขาด้วย ตอนนี้ให้สังเกตว่าตารางนั้นเป็น toroidal ดังนั้นอะตอมจะปรากฏขึ้นที่ขอบด้านซ้ายของแถวเดียวกัน จำไว้ว่าเราเพิ่มขึ้นพลังงานของอะตอมผลักดันก่อนหน้านี้ด้วย$ดังนั้นอะตอมในขณะนี้มีการใช้พลังงาน1เช่นเดียวกับการส่งออกล่าสุดจากครั้งและอีกครั้งจะผ่านตรงผ่าน? Zเส้นทางหลังจาก EOF จึงเป็น

?
[Z~K!

วนซ้ำที่แถวล่างนี้จะดำเนินต่อไปจนกว่าสแต็กจะว่างเปล่า เมื่อสิ่งนั้นเกิดขึ้นอะตอมจะถูกสะท้อนกลับจากKและพลังงานจะกลายเป็นบวก ( +1) การ~ลดลงอีกครั้ง (เลื่อนไปทางซ้าย) ดังนั้นตอนนี้เราจึงตีZด้วยพลังงานที่ไม่เป็นบวก สิ่งนี้จะเบี่ยงเบนอะตอมลงไปซึ่งจะกลายเป็นลิ่มYที่เก็บไว้และเนื่องจากไม่มีอะตอมเคลื่อนที่อีกต่อไปโปรแกรมจึงยุติการทำงาน


ทำไมมันทำให้ฉันนึกถึง minecraft?
ดอนสดใส

ว้าวและฉันคิดว่าการนำไปใช้ในตัวอย่างภาษานั้นสั้นที่สุดที่ 16 ตัวอักษร ที่น่าประทับใจ!
C0deH4cker

6

> <>, 16 14 ไบต์

-2 ไบต์โดย @JoKing

สองปี (!) ในภายหลังลบ -1 พิเศษจากอินพุตการอ่านโดยเลื่อนโลจิกเพื่อหยุด

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

ลองออนไลน์!

เช่นเดียวกับคำตอบอื่น ๆ > <> นี่ไม่จำเป็นต้องย้อนกลับสแต็กเนื่องจากวิธีอ่านอินพุตในบรรทัดแรก จริง ๆ แล้วฉันก็ไม่แน่ใจเหมือนกันว่าสิ่งนี้ควรเป็นคำแนะนำสำหรับคนอื่น ๆ หรือไม่> <> คำตอบเพราะมันมีความแตกต่างในเรื่องของรูปลักษณ์ แต่มีความคล้ายคลึงกันในแนวคิด

ข้อแตกต่างที่สำคัญคือคำตอบของฉันเปรียบเทียบอินพุตกับ 0 และถ้ามันน้อยกว่า (เช่นไม่มีอินพุต - iส่งคืน -1 ถ้าไม่มีอินพุต) มันข้ามไปที่ (1,7) ถ้าไม่ใช่ (0, 7) หากข้ามไปที่ค่าเดิมจะปรากฏค่าสูงสุด (-1) และเริ่มการวนซ้ำการพิมพ์ หากข้ามไปยังส่วนหลังจะเป็นการวนเข้าต่อไป

11 ไบต์ออกโดยมีข้อผิดพลาด

ได้รับความอนุเคราะห์จาก @JoKing

i:0(7$.
~o!

ลองออนไลน์!

ฉันเชื่อว่านี่ถูกต้องแล้วในขณะนี้ผ่านทางฉันทามติ meta

คำตอบก่อนหน้า (14 ไบต์)

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

2
-5 ไบต์โดยลงท้ายด้วยข้อผิดพลาด มิฉะนั้น-2 ไบต์ (ข้อผิดพลาดในอินพุตว่าง) นอกจากนี้ข้อผิดพลาดดั้งเดิมของอินพุตที่ว่างเปล่าซึ่งสามารถแก้ไขได้ด้วยการเลื่อนoหลัง;
โจคิง

1
@ โจกิ้งจับoส่วนที่ดี; ไม่ได้สังเกตว่าในเวลา และขอขอบคุณสำหรับการบันทึก การใช้การเปรียบเทียบกับศูนย์อย่างชาญฉลาดเพื่อกำจัด -1 สุดท้าย
โคล

1
อืมจริงๆแล้วมันใช้งานได้ดีเช่นกันสำหรับ 13 ไบต์ (ไม่อยากจะเชื่อเลยว่าฉันพลาดการสลับ0=?ไปยัง?!)
Jo King

@JoKing -1 Byteหรือไม่ ตัวอักษรตรวจสอบด้านบนสแต็คถ้า 0 ดังนั้นการเปรียบเทียบกับความยาวไม่จำเป็นเพียงแค่ l
นกกระทุงนกเป็ดน้ำ

@TealPelican ใช่ฉันพูดถึงในความคิดเห็นที่สองของฉัน
Jo King


5

Stack Catsขนาด 7 ไบต์

<!]T[!>

ลองออนไลน์!

มีทางเลือกมากมายสำหรับการนับไบต์เดียวกันซึ่งส่วนใหญ่เทียบเท่ากับวิธีการทำงาน:

คำอธิบาย

ไพรเมอร์ Stack Cats สั้น ๆ :

  • ทุกโปรแกรมจะต้องมีความสมมาตรของมิเรอร์และโดยการทำมิเรอร์ส่วนใด ๆ ของรหัสเราได้รับรหัสใหม่ซึ่งคำนวณฟังก์ชันอินเวอร์ส ดังนั้นอักขระสามตัวสุดท้ายของโปรแกรมด้านบนจะยกเลิกการสามตัวแรกถ้าไม่ใช่คำสั่งที่อยู่ตรงกลาง
  • โมเดลหน่วยความจำคือเทปที่ไม่มีที่สิ้นสุดของสแต็กซึ่งเก็บค่าศูนย์จำนวนไม่ จำกัด ที่ด้านล่าง สแต็กเริ่มต้นมี-1ด้านบนของศูนย์เหล่านั้นแล้วไบต์อินพุตที่ด้านบนของที่ (มีไบต์แรกที่ด้านบนมากและไบต์สุดท้ายด้านบน-1)
  • สำหรับผลลัพธ์เราเพียงนำสแต็กสุดท้ายทิ้ง a -1ที่ด้านล่างหากมีหนึ่งแล้วพิมพ์ค่าทั้งหมดเป็นไบต์ไปยัง STDOUT

ตอนนี้สำหรับโปรแกรมจริง:

<    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 ตั้งค่าการค้นหาที่ดุร้ายของเขาเพื่อค้นหาโซลูชัน 7 ไบต์อื่น ๆ ทั้งหมดดังนั้นนี่เป็นทางเลือก:

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

ทั้งสามสายพันธุ์นั้นมีความเหมือนกันยกเว้นว่าจะแตกต่างกันเมื่อไม่มีการคำนวณ bitwise และไม่ว่าเราจะใช้สแต็กเปล่าทางซ้ายหรือทางขวา

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

อย่างที่ฉันพูดในคำอธิบายข้างต้นTไม่ได้ทำอะไรเลยเมื่อส่วนบนสุดของสแต็คเป็นศูนย์ นั่นหมายความว่าเราสามารถวาง!ตรงกลางแทน นั่นหมายความว่าคนแรกTคือไม่มี-op แล้วเราเปิดศูนย์ด้านบนเป็น-1และแล้วจากนั้นสองTดำเนินการกลับรายการ ซึ่งหมายความว่าสถานะหน่วยความจำสุดท้ายมี-1บนสแต็คถัดจากสถานะดั้งเดิม แต่ไม่สำคัญเนื่องจากสแต็คที่ตำแหน่งหัวเทปปัจจุบันเท่านั้นที่มีผลต่อเอาต์พุต

<*ITI*>

ตัวแปรนี้ใช้*(XOR 1) แทน!เพื่อให้มันกลายเป็นศูนย์+1และIมันคือการผลักดันแบบมีเงื่อนไขซึ่งจะผลักดันค่าบวกและขวา, ค่าลบที่เหลือและปฏิเสธพวกมันในกรณีใดกรณีหนึ่ง (เช่นที่เรายังคงจบลงด้วย-1ที่ด้านบนของสแต็กดั้งเดิมเมื่อเราพบT) ดังนั้นวิธีนี้จึงใช้งานได้เหมือนกับ<!]T[!>โซลูชันต้นฉบับ


4

PHP, 82 29 24 29 28 ตัวอักษร

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

82 -> 29: strrevตัวละครบรรทัดใหม่จะถูกรักษาไว้เมื่อตรงกันข้ามกับ
29 -> 24: ใช้ไวยากรณ์ทางลัดทันที
24 -> 29: ตอนนี้อ่านทุกบรรทัดแทนที่จะเป็นบรรทัดเดียว


ปัญหาหนึ่ง: fgets(STDIN)อ่านบรรทัดแรกเท่านั้น
PleaseStand

อัปเดตรหัสเพื่ออ่านบรรทัดทั้งหมดทันที
เควินบราวน์

ยกเว้นว่าคุณมีขีด จำกัด ของการประดิษฐ์ 1,000 ตัวอักษร
คนขี้ขลาดนิรนาม

อัปเดตขีด จำกัด เพื่อให้ตรงกับ Python ด้านล่างฉันไม่สามารถจินตนาการได้ว่ามีใครใช้มากขนาดนั้น
Kevin Brown

4

Befunge-98 - 11 10

#v~
:<,_@#

(ทดสอบด้วย cfunge)

ตัวแปรด้านล่างนี้แบ่งข้อกำหนดออกไปเล็กน้อย: ดำเนินการงาน แต่ส่งออกกระแสข้อมูลที่ไม่มีที่สิ้นสุดของไบต์เป็นโมฆะหลังจากนั้น (และไม่สิ้นสุด)

~#,

วิธีการทำงานคือมันซ้ำ ๆ อ่านอินพุตไปยังสแต็ก ( ~) หนึ่งตัวอักษรในแต่ละครั้งที่กระโดดข้าม ( #) เครื่องหมายจุลภาค เมื่อถึง EOF จะ~ทำหน้าที่เป็นตัวสะท้อนแสงและพีซีจะพลิกตัวซ้ำ ๆ โผล่ขึ้นมาและส่งออกอักขระ ( ,) ในขณะที่กระโดดข้าม ( #) ตัวหนอน


นี่คือรุ่นสั้น (10 ตัวอักษร): 1 สาย: #v~สาย :<,_@#2: ตลกที่ใช้jไม่ปรับปรุงที่นี่
Justin

@Quincunx มันฉลาดกว่าโดยใช้ทิศทาง IP เป็นชนิดของการปฏิเสธโดยนัย
FireFly

4

Pyth - 3 5 4 ไบต์

ดังนั้นเวอร์ชัน 3 char ดั้งเดิมไม่ได้ย้อนกลับคำสั่งซื้อบรรทัดเพียงแค่บรรทัด ฉันมากับรุ่น 5 char นี้:

_jb.z

ฉันบันทึก 1 ไบต์ด้วย @FryAmTheEggman เพื่อให้ได้ผลลัพธ์:

_j.z

การสาธิตสด

คำอธิบาย:

  .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

โซลูชันดั้งเดิม (ไม่ถูกต้อง):

เทคนิคนี้ไม่นับเพราะ Pyth ถูกสร้างขึ้นในปี 2014 แต่ก็ยังเรียบร้อยซึ่งมันเชื่อมโยงกับ GolfScript

#_w

คำอธิบาย:

#    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
ไม่ตรงกับข้อมูลจำเพาะโชคไม่ดี - ลำดับของเส้นต้องย้อนกลับเช่นกัน
DLosc

Fk_.z_kฉันแน่ใจว่าบางคนสามารถทำให้สั้นกว่านี้ได้ แต่นั่นคือสิ่งที่ฉันได้รับ
gcq

@gcq ฉันมีรุ่นที่สั้นกว่า (5 ตัวอักษร) แต่ฉันไม่ได้มีโอกาสแก้ไข
kirbyfan64sos

@DLosc แก้ไข! ฉันเพิ่งอ่านอินพุตทั้งหมดเข้าร่วมผ่านการขึ้นบรรทัดใหม่และย้อนกลับ
kirbyfan64sos

@FryAmTheEggman อ่าใช่! ไม่ทราบว่าเมื่อฉันโพสต์เมื่อไม่กี่เดือนก่อน
kirbyfan64sos

4

Cubix , 9 8 ไบต์

ขอบคุณ Martin Ender สำหรับกอล์ฟนี้:

w;o@i.?\

เห็นมันทำงานออนไลน์!

นี่จะกลายเป็นลูกบาศก์ต่อไปนี้ (>ระบุตัวชี้คำสั่งเริ่มต้น):

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

ขั้นตอนแรกของโปรแกรมคือการรับอินพุตทั้งหมด iใส่ 1 ไบต์ของการป้อนข้อมูลลงในสแต็ก นอกจากอินพุตจะเสร็จสิ้น?ให้เลี้ยวขวา IP แล้วล้อมรอบลูกบาศก์จนกว่าจะถึงwซึ่งจะส่งกลับไปที่iซึ่งจะส่งมันกลับไป

เมื่ออินพุตเสร็จสิ้น ?จะทำให้หัว IP ทิศเหนือเข้าสู่ลูปเอาต์พุต:

  • o: พิมพ์อักขระที่ด้านบนสุดของสแต็ก
  • w: 'ก้าวเท้าเลี่ยง' ตัวชี้ไปทางขวา
  • ;: ป๊อปตัวละครที่เพิ่งพิมพ์
  • \: สะท้อน IP ส่งตะวันออก
  • ?: หากมีตัวอักษรเหลือให้พิมพ์ให้เลี้ยวขวากลับเข้าไปในลูป

เวลาสุดท้าย?ถูกโจมตีเมื่อไม่มีสิ่งใดเหลืออยู่บนสแต็ค IP จะดำเนินต่อไปข้างหน้าแทน:

  • i: ใช้ไบต์ของอินพุต นี่จะเป็น-1เมื่ออินพุตเสร็จสิ้นแล้ว
  • \: สะท้อน IP, ส่งทิศเหนือ, เป็น:
  • @: ยุติโปรแกรม

โซลูชั่น 9 ไบต์

..o;i?@!/

เห็นมันทำงานออนไลน์!

ในรูปแบบลูกบาศก์:

      . .
      o;
> ฉัน @! /. . .
  . . . . . . . .
      . .
      . .

อักขระตัวแรกที่เข้ารหัสคือiซึ่งใช้อักขระป้อนเข้า -1หากมีการป้อนข้อมูลที่ไม่เหลือนี้เป็น

ตัวละครต่อไปคือ?- การตัดสินใจ หากด้านบนของสแต็คเป็นบวกมันจะเลี้ยวขวาล้อมรอบคิวบ์จนกว่าจะกระทบ/ซึ่งจะส่งกลับไปที่iสร้างการวนซ้ำอินพุต อย่างไรก็ตามหาก TOS เป็นค่าลบอินพุตจะเสร็จสิ้นและดังนั้นจะเลี้ยวซ้ายเข้าสู่ลูปเอาท์พุท

เอาท์พุตง่าย o;ส่งออกและปรากฏ TOS ในครั้งแรกที่เรียกใช้งาน-1นี้จะอยู่ด้านบนสุดของสแต็ก แต่ไม่แม็พกับอักขระและจะถูกละเว้น /แสดง IP ที่จะย้ายไปทางซ้ายซึ่งจะพบ!@- ซึ่งจะยุติโปรแกรมหากสแต็กว่างเปล่า มิฉะนั้น IP จะดำเนินต่อไปโดยการกดปุ่ม?อีกครั้ง - เนื่องจากสแต็กไม่ว่างเปล่า TOS จะต้องเป็น charcode ซึ่งทั้งหมดนั้นเป็นค่าบวก1ดังนั้นสิ่งนี้จะทำให้ IP เลี้ยวขวาและดำเนินการวนรอบเอาต์พุตต่อไป


1วิธีแก้ปัญหาทั้งสองอนุมานว่าสัญญาณเข้าจะไม่มีไบต์ว่าง


4

05AB1E, 1 ไบต์

R

R ย้อนกลับอินพุต


1
ขอบคุณที่ใช้ 05AB1E :) คุณไม่ต้องการ,ที่ส่วนท้ายเนื่องจากด้านบนของสแต็กจะถูกพิมพ์โดยอัตโนมัติเมื่อไม่มีสิ่งใดพิมพ์
Adnan

@Adnan ขอบคุณสำหรับเคล็ดลับ
Penalosa

4

Wumpusขนาด 12 ไบต์

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

ลองออนไลน์!


คำตอบของ Martinแสดงให้เห็นถึงการควบคุมกริดสามเหลี่ยมของ Wumpus ได้ดี แต่ฉันคิดว่าฉันจะลองทำสิ่งท้าทายนี้ด้วยสายการบินเดียว

รุ่นที่เข้าใจง่ายกว่า (อีกหนึ่งไบต์) คือ:

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

ซึ่งใช้งานได้:

[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

ทีนี้ลองดูเวอร์ชั่น golfed ซึ่งต่างกันตรงกลาง:

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

รุ่น golfed บันทึกไบต์โดยไม่ต้องใช้คำสั่งที่ชัดเจน;เพื่อป๊อป extraneous -1 เมื่อวันที่ EOF โปรแกรมนี้กระโดดไป(4, 0)แทนการ(8, 0)ที่จะรัน4*0.อีกครั้ง - ยกเว้นเวลานี้ภายนอก -1 บน! สิ่งนี้ทำให้เราข้ามไป(-4, 0)ซึ่งเนื่องจากการตัดเป็นแบบเดียวกันกับ(8, 0)กริดนี้ทำให้เราไปถึงที่ที่เราต้องการในขณะที่ใช้ค่าที่ไม่เกี่ยวข้องในเวลาเดียวกัน


4

Wumpus , 13 11 ไบต์

)?\;l&o@
=i

ลองออนไลน์!

คำอธิบาย

เนื่องจาก Wumpus เป็นภาษาแบบสแต็คแนวคิดพื้นฐานคือการอ่าน STDIN ทั้งหมดไปยังสแต็กจากนั้นเพียงพิมพ์สแต็กทั้งหมดจากบนลงล่าง ส่วนที่น่าสนใจที่นี่คือการควบคุมการไหลผ่านตาราง

เพื่อให้เข้าใจถึงโฟลว์การควบคุมเราจำเป็นต้องดูเค้าโครงตารางสามเหลี่ยมจริง:

ป้อนคำอธิบายรูปภาพที่นี่

IP เริ่มต้นที่มุมซ้ายบนไปทางตะวันออก \เราจะเห็นว่ามีความเป็นห่วงผ่านกลุ่มของหกเซลล์บนซ้ายและสาขาออกจาก ตามที่คุณคาดไว้การวนซ้ำจะอ่านอินพุตทั้งหมดและส่วนลิเนียร์ที่ส่วนท้ายจะเขียนผลลัพธ์กลับไปที่ STDOUT

ลองดูที่ลูปก่อน มันเหมาะสมกว่าที่จะคิดว่าคนแรก)?\ที่ไม่ได้เป็นส่วนหนึ่งของวงด้วยการวนซ้ำจริงเริ่มต้นที่iที่จะไม่เป็นส่วนหนึ่งของวงกับวงที่เกิดขึ้นจริงเริ่มต้นที่ดังนั้นนี่คือบิตเริ่มต้น:

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

จากนั้นวงเริ่ม:

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.

ที่ออกจากส่วนเชิงเส้นในตอนท้าย:

;   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

ฟิชชัน , 20 15 ไบต์

KX$ \
!
SR?J%
~

อัลกอริทึมนั้นคล้ายกับของ Martin แต่การใช้งานนั้นแตกต่างกันอย่างมาก

มันทำงานอย่างไร

ทุกอย่างเริ่มต้นRซึ่งจะปล่อยอะตอมทางทิศตะวันออกที่มีมวล 1 และพลังงาน 0

เมื่อกดปุ่ม ?จะมีการบันทึกอักขระอินพุตเป็นมวลของอะตอมและพลังงานจะเหลือ 0 ที่ stdin ส่งคืน EOF ซึ่งพลังงานจะกลายเป็น 1

Jคือคำสั่งการกระโดดของฟิชชันและกระโดดอะตอมไปข้างหน้าเป็นจำนวนเซลล์เทียบเท่ากับพลังงานในปัจจุบันปล่อยอะตอมด้วยพลังงาน 0 สำหรับตอนนี้อะตอมของเรามี 0 พลังงานและไม่สนใจคำสั่งนี้

จากนั้นเราก็ตี%ซึ่งเป็นสวิตช์ ด้วยพลังงานที่มากกว่า 0 อะตอมของเราจะถูกชี้ลง (ราวกับว่าสะท้อนจาก\กระจก) แต่เนื่องจากเรามีพลังงาน 0 ตัวเราจึงถูกส่งขึ้นโดยกระจกตรงข้าม/พลังงานเราจะถูกส่งขึ้นไปโดยกระจกตรงข้าม

อะตอมของเราจะดำเนินต่อไปจนกระทั่งมันกระทบกับกระจกบานที่สอง \คราวนี้มันจะกำกับ

เราเพิ่มพลังงานของอะตอมเป็น 1 ด้วย$และใช้Xเพื่อทำซ้ำอะตอม หนึ่งสำเนาจะสะท้อนกลับไปที่$คำสั่ง (ปล่อยให้สำเนานั้นมีพลังงาน 2) และอีกสำเนาหนึ่งจะถูกผลักลงบนสแต็กKจะถูกผลักไปกอง

สำเนาที่สะท้อนกลับของเราเดินทางย้อนกลับจากที่ซึ่งมันมาจนกระทั่งมันกระทบกับ%สวิตช์อีกครั้ง ตอนนี้เรามีพลังงานที่เป็นบวกเราก็สะท้อนกลับราวกับว่าเราตี\กระจกล้อมรอบกระดานไว้บนหน้าถัดไปSและลดพลังงานของเราเป็น 1

Sคำสั่งจะใช้ 1 พลังงานเพื่อรักษาทิศทางของเรา ถ้าเราไม่มีพลังงานอะตอมก็จะเบี่ยงเบนไปราวกับ\กระจกส่องลงมา แต่เราย้ายไปทางขวาอีกครั้งและรับอินพุตมากขึ้นด้วย?และวัฏจักรซ้ำ

เมื่ออะตอมของเราไปถึง EOF ?คำสั่งจะเก็บ 1 พลังงานในอะตอม ดังนั้นเมื่อเรากดJคำสั่งในครั้งนี้เราก็ข้าม%สวิตช์และลงจอดบนSสวิตช์ด้วยพลังงาน 0

ตอนนี้เนื่องจากพลังงานของเราถูกใช้ไปในการกระโดดทิศทางของเราไม่ได้ถูกสงวนไว้โดยSสวิตช์ แต่เราค่อนข้างมุ่งลง จากนั้นเราลดพลังงานลงเหลือ -1 ด้วย~คำสั่งและพันรอบกระดาน เมื่อโดนพลังงานลบKคำสั่งจะดึงอะตอมแทนการกดหนึ่งครั้ง เราส่งออกอะตอมที่เพิ่งเกิดใหม่ของเราด้วย!และใช้พลังงาน 1 ของอะตอมนั้นเพื่อหลีกเลี่ยงSสวิตช์และวัฏจักรก็เสร็จสมบูรณ์

หากสแต็คKว่างเปล่าพลังงานของอะตอมของเราจะถูกทำให้เป็นลบ (ทำให้เกิดพลังงาน +1) และมันจะสะท้อนกลับไปยัง~คำสั่งและปล่อยให้มันมีพลังงาน 0 เมื่อกดSอีกครั้งเราจะเบี่ยงเบนไปทางขวาจนกว่า?จะถูกกระแทก เนื่องจาก EOF มาถึงแล้ว?จะทำลายอะตอมและยุติโปรแกรม


3

เขาวงกต 10 ไบต์

,)";@
:".(

โดยปกติแล้วโปรแกรมเขาวงกตควรมีลักษณะคล้ายกับเขาวงกต แต่ฉันสามารถบีบลูปในที่นี้ได้อย่างแน่นหนารหัสนั้นลงเอยด้วยบล็อกเดียว (ห้อง?) นี่คือเวอร์ชันที่ขยายเพิ่มขึ้นเล็กน้อยซึ่งทำให้ง่ายต่อการติดตามโฟลว์ควบคุม:

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

,อ่านครั้งละหนึ่งไบต์จาก STDIN จนฮิต EOF -1และผลตอบแทน )เพิ่มค่านี้เพื่อให้เราได้รับสิ่งที่ดีสำหรับการอ่านแต่ละไบต์และศูนย์ที่ EOF :ซ้ำกันในแต่ละอ่านไบต์

เมื่อเรากด EOF ตัวชี้คำสั่งจะไปที่วงที่สองซึ่งซ้ำ ๆ จะทิ้งหนึ่งค่าด้วย;(เริ่มต้น EOF ต่อมาคัดลอกที่สองของแต่ละไบต์) แล้วลดค่าถัดไปด้วย(และพิมพ์ด้วย.และพิมพ์ด้วยเนื่องจากสำเนาที่สอง (ซึ่งเป็นค่าบวกเสมอ) เรารู้ว่า IP จะเลี้ยวขวาที่ด้านบนและดำเนินการต่อในลูปนี้

หลังจากพิมพ์ไบต์ทั้งหมดแล้วด้านบนของสแต็กจะเป็นศูนย์อีกครั้งและ IP จะดำเนินต่อไปตรงหน้า @และโปรแกรมสิ้นสุดลง

ความซ้ำซ้อนที่ไม่จำเป็นของแต่ละไบต์คือสิ่งที่ทำให้ฉันมั่นใจได้ว่า (แม้จะอยู่ในลูปที่แน่นของเวอร์ชั่น golfed) IP ก็จะเลี้ยวที่ถูกต้องเสมอ

เคล็ดลับของหมวก TheNumberOne และ Sp3000 ซึ่งความพยายามของตัวเองช่วยได้มากในการค้นหาโซลูชันที่มีการบีบอัดสูง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.