ปริศนา Chiral


45

รูปร่างเป็นchiralถ้าไม่มีจำนวนการหมุนสามารถทำให้ดูเหมือนภาพสะท้อนของกระจก ในปริศนานี้เราจะเขียนโปรแกรมคอมพิวเตอร์ chiral

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

The quickish fish
    lept deftly  
  rightwards     

เมื่อหมุนหนึ่งในสี่ทิศตามเข็มนาฬิกาจะดูเหมือน

  T
  h
r e
i  
glq
heu
tpi
wtc
a k
rdi
des
sfh
 t 
 lf
 yi
  s
  h

เรายังสามารถสะท้อนโปรแกรมเหล่านี้ นี่คือโปรแกรมเดียวกันที่สะท้อนเหนือแกนตั้ง:

hsif hsikciuq ehT
  yltfed tpel    
    sdrawthgir   

โปรแกรม chiral เป็นโปรแกรมที่เมื่อหมุนไปกี่ครั้งก็จะออก " left" อย่างไรก็ตามเมื่อการสะท้อนสร้างโปรแกรมที่ส่งออก "right " ไม่ว่าจะหมุนกี่ครั้งก็ตาม

งานของคุณคือการเขียนโปรแกรม chiral เป็นไบต์น้อยที่สุด

กฎเพิ่มเติม

  • เอาต์พุตไม่ได้เป็นแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก แต่ควรสอดคล้องกัน (เช่นคุณอาจส่งออก " LEFT" และ " rIgHt" แต่กล่องนี้จะต้องสอดคล้องกันภายใต้การหมุน)

  • เส้นจะถูกแยกในบรรทัดใหม่หรือขึ้นบรรทัดใหม่และตัวดึงข้อมูลบรรทัด

  • โปรแกรมของคุณต้องเป็นรูปสี่เหลี่ยมผืนผ้าคุณสามารถวางลงในช่องว่างหรือความคิดเห็นได้ แต่แต่ละบรรทัดจะต้องมีความยาวเท่ากัน

  • คุณอาจเลือกที่จะขึ้นบรรทัดใหม่ (หรือขึ้นบรรทัดใหม่และขึ้นบรรทัดใหม่) ในโปรแกรมทั้งหมดของคุณหากคุณต้องการ


ไม่มีใครมีโปรแกรมที่สามารถ autototate การป้อนข้อมูลของ 'สาเหตุที่อย่างน้อยจะทำให้กระบวนการในการสร้างทั้งหมดนี้ง่ายขึ้น
KrystosTheOverlord

@ KrystosTheOverlord ฉันใช้สิ่งนี้ร่วมกับคำสั่ง block และ:set virtualedit=allโหมดของ Vim Boolเอาต์พุตเริ่มต้นจะตรวจสอบว่าอินพุตเท่ากับการหมุนของตัวเองหรือไม่ซึ่งจะทำให้สิ่งต่าง ๆ ง่ายขึ้น การลบ{-ทำให้มันพิมพ์อินพุตที่สะท้อนออกมา
Ørjan Johansen

@ ØrjanJohansenขอบคุณที่ช่วยจนถึงตอนนี้ฉันได้เปลี่ยนหน้าจอแล็ปท็อปของฉันคิดว่าผลลัพธ์จะเป็นอย่างไรและพยายามหาวิธีหมุนมัน !!!
KrystosTheOverlord

คำตอบ:


18

Pascal (FPC) , 2161 755 349 ไบต์

///////bw(,,),(wb///////
///////er'''e''re///////
begin//girgtnflig//nigeb
write//itih'dteti//etirw
('le'//ne'' .''en//'ir'(
,'ft'//////////////'hg',
)end.////////////// 't',
,'t' //////////////.dne)
,'gh'//////////////'tf',
('ri'//ne''. ''en//'el'(
write//itetd'hiti//etirw
begin//gilfntgrig//nigeb
///////er''e'''re///////
///////bw(,),,(wb///////

ลองซ้าย

ลองถูก

@tsh กระตุ้นให้ฉันลองอีกครั้งเมื่อฉันเห็นรายการของเขา (ในความคิดเห็น) และนี่คือ!


ก่อนหน้านี้ที่มี 755 ไบต์:

 begin write('left')end.// 
/e .dne)'thgir'(etirw nigeb
/g                        e
.i                       .g
dn                       di
n                        nn
ew                       e 
)r                       )w
'i                       'r
tt                       ti
fe                       ht
e(                       ge
l'                       i(
'r                       r'
(i                       'l
eg                       (e
th                       ef
it                       tt
r'                       i'
w)                       r)
 e                       we
nn                        n
id                       nd
g.                       i.
e                        g/
begin write('right')end. e/
 //.dne)'tfel'(etirw nigeb 

ลองซ้าย

ลองถูก

หากคุณเห็นการส่งครั้งก่อนของฉันแค่ลืมมัน :)

การหมุนทั้งหมดสำหรับโปรแกรมซ้ายและขวาเหมือนกัน



1
ฉันรู้ว่าวงเล็บมิเรอร์นั้นถูกต้อง แต่พวกเขาก็ยังทำให้ฉันเสียใจ
Sellyme

1
ดูเหมือนกระจกที่มีกรอบ!
Frédéric Grosshans

@tsh ความคิดที่ยอดเยี่ยม! คุณกระตุ้นให้ฉันค้นหาเค้าโครงที่ดีขึ้น
AlexRacer


11

ไคลน์ (000) , 109 87 ไบต์

."left"@\.
\"right"..
@"thgir">.
..@"tfel"\
\"left"@..
.>"right"@
.."thgir"\
.\@"tfel".

ลองออนไลน์!

น่าจะเป็นไปได้ที่จะได้คำตอบที่สั้นกว่านี้ขอให้โชคดี!

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

ผลัดไตรมาส

...\.@\.
\.>"."""
@""l@trl
"tre"hie
thiftggf
fggtfiht
eih"ert"
lrt@l""@
""".">.\
.\@.\...

ลองออนไลน์!

มิร์เรอร์

.\@.\...
""".">.\
lrt@l""@
eih"ert"
fggtfiht
thiftggf
"tre"hie
@""l@trl
\.>"."""
...\.@\.

ลองออนไลน์!

มิร์เรอร์และรอบควอเตอร์

.\@"tfel".
.."thgir"\
.>"right"@
\"left"@..
..@"tfel"\
@"thgir">.
\"right"..
."left"@\.

ลองออนไลน์!


10

ไคลน์ (000) , 27 25 ไบต์

\(("right"@/
\(("left"@!\

ลองออนไลน์! หมุนครั้งเดียว! หมุนสองครั้ง! หมุนสามครั้ง!

และพลิกแล้ว: ลองออนไลน์! หมุนครั้งเดียว! หมุนสองครั้ง! หมุนสามครั้ง!

สิ่งเดียวที่ทำให้ฉันมีปัญหาเล็กน้อยคือการพลิกและหมุนครั้งเดียวซึ่งดูเหมือนว่า:

\/
!@
@"
"t
th
fg
ei
lr
""
((
((
\\

((นี่คือเหตุผลเดียวที่ทั้งสองชุด


9

ไคลน์ (211) , 37 ไบต์

!\"left"@"thgir"\!
!/............../!

โปรแกรมนี้มีโปรแกรมที่แตกต่างกันสำหรับการหมุนแต่ละครั้ง

คำอธิบาย

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

ไม่มีการเปลี่ยนแปลง

!\"left"@"thgir"\!
!/............../!

ลองออนไลน์!

!ทำให้การดำเนินการกระโดดข้าม\และ"left"@โหลดสตริง"left"ลงในสแต็กและยุติโปรแกรมที่พิมพ์สแต็ก

ผลัดไตรมาส

!!...IP->
\/
".
r.
i.
g.
h.
t.
".
@.
".
t.
f.
e.
l.
".
\/
!!
^
|
P
I

ลองออนไลน์!

การดำเนินการวิ่งออกไปที่มุมขวาบนของตารางยังคงอยู่ที่มุมด้านล่างซ้ายและอีกครั้งที่พิมพ์!\"left"@"left

ครึ่งทาง

                ^
                |
                P
                I
!/............../!
!\"right"@"tfel"\!
..................
..................
..................
..................
..................
..................
..................
..................
..................
..................
..................
..................
................^.
................|.
IP->............P.
................I.

ลองออนไลน์!

ที่นี่เส้นทางการประหารชีวิตออกจากทางด้านเหนือเข้าสู่ฝั่งตะวันตกอีกครั้งออกจากทางทิศตะวันออกอีกครั้งก่อนเข้าสู่ทางทิศใต้ \ตีกลับเส้นทาง"left"@ให้พิมพ์

สามไตรมาส

!!..IP->
/\
."
.l
.e
.f
.t
."
.@
."
.t
.h
.g
.i
.r
."
/\
!!
^
|
I
P

ลองออนไลน์

การดำเนินการออกจากมุมบนขวาจากนั้นเข้าสู่อีกครั้งที่มุมล่างซ้าย มิเรอร์จะ/\เปลี่ยนเส้นทางไปอีกครั้ง"left"@เพื่อพิมพ์

การสะท้อน

!\"right"@"tfel"\!
!/............../!

นี่เป็นสิ่งจำเป็นเช่นเดียวกับที่เหลือในการหมุนทั้งหมด


9

JavaScript (Node.js) , 1481 599 505 461 341 305 271 ไบต์

/g+///g/g"c.c"g/
g=//////=rolol=g
"left"///inone/+
console//gsgsf//
.log(g)//ho(ot//
console//tlgl"//
"right"//"e)e//g
g=//////////////
//////////////=g
g//e)e"//"thgir"
//"lglt//elosnoc
//to(oh//)g(gol.
//fsgsg//elosnoc
+/enoni///"tfel"
g=lolor=//////=g
/g"c.c"g/g///+g/

มิร์เรอร์

/g"c.c"g/g///+g/
g=lolor=//////=g
+/enoni///"tfel"
//fsgsg//elosnoc
//to(oh//)g(gol.
//"lglt//elosnoc
g//e)e"//"thgir"
//////////////=g
g=//////////////
"right"//"e)e//g
console//tlgl"//
.log(g)//ho(ot//
console//gsgsf//
"left"///inone/+
g=//////=rolol=g
/g+///g/g"c.c"g/

ลองออนไลน์!

(โปรดดูลิงก์ TIO สำหรับกรณีทดสอบทั้งหมดรวมถึงเวอร์ชันที่มิร์เรอร์)

แม้ว่าจะมีขนาดของกอล์ฟเพิ่มเติม 22x22 -> 21x21เครดิตของ @JoKing!

ขนาด38x38 24x24 22x22 21x21 18x18 17x17 16x16, 4 เท่าสมมาตร

คำถามต่อไปนี้เป็นไปได้หรือไม่ที่จะมีขนาด 15x15 หรือเล็กกว่าสำหรับ JS ดูเหมือนว่าสิ่งที่ฉันต้องการอย่างน้อยก็คือตัวคั่นความคิดเห็นระหว่างสองบล็อกย่อยและที่ขอบดังนั้นอย่างน้อย 7 + 2 + 2 + 5 = 16 บรรทัด?


@ โจกิ้งโอ้ที่ดูเหมือนว่าทำได้ ฉันจะลอง;)
Shieru Asakoto

@JoKing ลดขนาดลงเหลือ 21x21 ขอบคุณ;)
Shieru Asakoto

8

Canvas , 109 89 71 ไบต์

(tfel⁸((
(h(right
⁸g   q(f
li    re
er    il
f(    g⁸
thgir(h(
((⁸left(

ลองได้ที่นี่ | ลองย้อนกลับ!เหล่านี้เป็นโปรแกรมที่เป็นไปได้เพียงสองโปรแกรมเนื่องจากโปรแกรมนั้นมีความสมมาตรในการหมุน

Made in นี้


4
ช่างเป็นผืนผ้าใบที่ว่างเปล่านั่น ... : /
Erik the Outgolfer

8

Gol> <> , 23 ไบต์

\"thgir"H /
\"tfel"H.9\

ลองออนไลน์!

นี่เป็นรูปแบบเดียวกับคำตอบ Klein ของฉันแต่สั้นกว่า 2 ไบต์ อาจมีภาษา 2D อีกภาษาหนึ่งที่สามารถเล่นกอล์ฟ 2 ไบต์ล่าสุด ... แต่สำหรับตอนนี้นี่สั้นที่สุดเท่าที่จะเป็นไปได้


เพราะฉันเพิ่งใช้เวลาชั่วโมงที่ผ่านมาทำสิ่งนี้ใน gol> <> จากนั้นฉันเลื่อนลงเพื่อค้นหาสิ่งนี้ ทำได้ดีมาก!
KrystosTheOverlord

7

อลิซ 25 ไบต์

}/"regttoo {
{/"lifh""@@{

ซ้าย: ปกติ , 1/4 เลี้ยวตามเข็มนาฬิกา , 1/2 เทิร์น , 1/4 หมุนทวนเข็มนาฬิกา

ขวา: สะท้อนข้ามแกนนอน , แนวทแยงมุม , แกนแนวตั้ง ,แนวทแยงมุมขวา

คำอธิบาย

โปรแกรมนี้มีสามส่วน ส่วนแรกคือสาม{และหนึ่ง}ในมุม {เปิด IP ที่เหลือจนกว่าจะถึง}จุดที่มันเลี้ยวขวา ในเวอร์ชันที่สะท้อน IP จะไปตามแถวบนสุดในโปรแกรมต้นฉบับ ในเวอร์ชั่นดั้งเดิมการเลี้ยวขวาจะชนกับที่อยู่ติดกันทันที{โดยชี้ IP ไปตามแถวด้านล่างในโปรแกรมต้นฉบับ

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

ส่วนที่เหลือของโปรแกรมตรงไปตรงมา IP ในโหมดเลขลำดับตีกลับในแนวทแยงมุมดังนั้นจะเรียกใช้"left"o@หรือ"right"o@จะขึ้นอยู่กับว่าส่วนนี้ถูกป้อนเข้าไปอย่างไร


7

Hexagony , 98 ไบต์

\.@.t;./r.
.)@.;...;.
ll..)gt.;$
;.i<;;;i);
e;@.)@e;.l
.;e;d.g|.|
rt/;t.;)g\
@f.#l.;..r
\.;\.;i\.i

ลองออนไลน์! | หมุน 90 ° | หมุน 180 ° | หมุน
กลับด้าน270 ° | หมุน 90 ° & กลับด้าน | หมุน 180 °และกลับด้าน | หมุน 270 °และกลับด้าน

Hexagony เป็นความสนุกสำหรับความท้าทายนี้เนื่องจากการหมุนหรือการพลิกกลับสามารถเปลี่ยนโปรแกรมจริงได้อย่างมาก การหมุน / การพลิกกลับแต่ละครั้งเป็นโปรแกรมเฉพาะของตัวเอง เส้นทางการทำงานของโปรแกรมบางโปรแกรมน่าสนใจกว่าเส้นทางอื่น ๆ

ฉันจะยอมรับว่าการมาถึงด้วยสิ่งนี้ใช้เวลานานกว่าที่ควรจะเป็น ฉันค่อนข้างมั่นใจว่าคำตอบที่สั้นกว่าสามารถทำได้ใน Hexagony โชคดีมาก!



6

APL (dzaima / APL) , 181 ไบต์

โปรแกรมนี้มีสมมาตรแบบหมุนดังนั้นจะต้องตรวจสอบเพียงสองกรณีเท่านั้น


ซ้าย

⍝⍝⍝⍝⍝⍝⍝  tt
t'lef' ←←←⍝
⎕←t,     't'
t'righ'r,l
        i e
  '     g f⍝
⍝' h     h '⍝
⍝f g     t ⍝ 
⍝e i     ⍝   
⍝l,r⍝'hgir'←t
⍝'t'     ,t←⎕
⍝←←← ⍝'fel'←t
⍝t⎕t  ⍝⍝⍝⍝⍝⍝⍝

ลองออนไลน์!

ขวา

tt  ⍝⍝⍝⍝⍝⍝⍝
⍝←←← 'fel't
't'     ,t←⎕
l,r'hgir't
e i        
f g     t  
' h     h '
  '     g f⍝
   ⍝     i e⍝
t←'righ'⍝r,l⍝
⎕←t,     't'⍝
t←'lef'⍝ ←←←⍝
⍝⍝⍝⍝⍝⍝⍝  t⎕t⍝

ลองออนไลน์!

คำอธิบาย

นี่เป็นโปรแกรม APL แรกของฉันดังนั้นมันจึงค่อนข้างง่าย ใช้เพียงหนึ่งเคล็ดลับที่ฉันคิดว่าน่าสนใจ

หากเราเริ่มต้นด้วยการแยกความคิดเห็นทั้งหมดออกเราจะได้รับโปรแกรมต่อไปนี้

ซ้าย

t'lef'
⎕←t,     't'
t'righ'

ขวา

t'righ'
⎕←t,     't'
t'lef'

เริ่มจากโปรแกรมด้านซ้ายเราทำสามสิ่ง

  1. กำหนด'lef'ให้กับตัวแปรt

  2. พิมพ์ตัวแปรtและตัวอักษร't'

  3. กำหนด'righ'ให้กับตัวแปรt

ตอนนี้เพราะมันเป็นมิเรอร์โปรแกรมที่เหมาะสมทำสามขั้นตอนเหล่านี้ แต่ในลำดับที่ตรงกันข้าม ซึ่งหมายความว่าเราพิมพ์'left'โปรแกรมด้านซ้ายและโปรแกรม'right'ที่ถูกต้อง

เคล็ดลับหนึ่งที่นี่คือที่'t'จริงมาจากสำเนาหมุนของรหัส ถ้าคุณมองไปที่ colum 't'ที่สามของรหัสของเราคุณจะเห็นว่ามันเป็น เราใช้สิ่งนี้'t'ในเวอร์ชันที่หมุนแล้วเพื่อผนวกสิ่งtที่ต้องการ


5

Haskell , 461 379 ไบต์

82 ไบต์ถูกบันทึกโดยØrjan Johansen

--_----------mppr--
-- ----------a  l--
rl=p  p--   niam= _
p m="left"-- n==p--
p a="right"++ "" --
main  =putStr rl --
--n +r       =iep--
-- -+t       pgf---
-- -"S       uht---
-- "tt       tt" --
---thu       S"- --
---fgp       t+- --
--pei=       r+ n--
-- lr rtStup=  niam
-- "" ++"thgir"=a p
--p==n --"tfel"=m p
_ =main   --p  p=lr
--l  a---------- --
--rppm----------_--

ลองออนไลน์!

เนื่องจากสิ่งนี้มีสมมาตร 4 เท่าคุณจึงต้องทดสอบกระจก:

--rppm----------_--
--l  a---------- --
_ =main   --p  p=lr
--p==n --"tfel"=m p
-- "" ++"thgir"=a p
-- lr rtStup=  niam
--pei=       r+ n--
---fgp       t+- --
---thu       S"- --
-- "tt       tt" --
-- -"S       uht---
-- -+t       pgf---
--n +r       =iep--
main  =putStr rl --
p a="right"++ "" --
p m="left"-- n==p--
rl=p  p--   niam= _
-- ----------a  l--
--_----------mppr--

ลองออนไลน์!

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


1
ย่อขนาดนี้เป็น379 ไบต์ (19x19)
Ørjan Johansen

4

Prolog (SWI) , 649 188 ไบต์

Unflipped, Unrotated

:-%    l :%r     %-:
write(%e%-(i %(etirw
left).%f.weg%.)right
%      t)rth.      %
%      )tiit)      %
%      .htr)t      %
right).%gew.f%.)left
write(% i(-%e%(etirw
:-%     r%: l    %-:

ลองออนไลน์!

Unflipped หมุน

:wr%%%lw:
-ri   er-
%ig   fi%
 th   tt 
 et   )e 
 ()   .( 
 %.   %% 
  %.)tfel
right).% 
%(etirw-:
:-write(%
 %.)thgir
left).%  
 %%   .% 
 (.   )( 
 e)   re 
 tl   it 
%ie   gi%
-rf   hr-
:wt%%%tw:

ลองออนไลน์!

พลิกไม่ได้หมุน

:-%     r%: l    %-:
write(% i(-%e%(etirw
right).%gew.f%.)left
%      .htr)t      %
%      )tiit)      %
%      t)rth.      %
left).%f.weg%.)right
write(%e%-(i %(etirw
:-%    l :%r     %-:

ลองออนไลน์!

พลิกหมุน

:wl%%%rw:
-re   ir-
%if   gi%
 tt   ht 
 e)   te 
 (.   )( 
 %%   .% 
left).%  
 %.)thgir
:-write(%
%(etirw-:
right).% 
  %.)tfel
 %.   %% 
 ()   .( 
 er   )e 
 ti   lt 
%ig   ei%
-rh   fr-
:wt%%%tw:

ลองออนไลน์!


4

Prolog (SWI) , 239 223 209 181 ไบต์

%%%%%%%  l:r%
right).% e-i%
:-write(%fwg%
left).%  trh%
  %      )it%
 %(      .t)%
%.e%     %e.%
%)t.      (%
%ti)      %
%hrt  %.)tfel
%gwf%(etirw-:
%i-e %.)thgir
%r:l  %%%%%%%

ลองออนไลน์!

เนื่องจากโปรแกรมมีสมมาตร 4 เท่าคุณจะต้องตรวจสอบกระจกเท่านั้น:

%r:l  %%%%%%%
%i-e %.)thgir
%gwf%(etirw-:
%hrt  %.)tfel
%ti)      %  
%)t.      (% 
%.e%     %e.%
 %(      .t)%
  %      )it%
left).%  trh%
:-write(%fwg%
right).% e-i%
%%%%%%%  l:r%

ลองออนไลน์!


4

Python 2 , 209 ไบต์ (14 x 14)

ปกติ (ซ้าย):

##########sps#
s="left"##=r=#
print s###"i"#
s="right"#rnl#
####      ite#
###"      g f#
#"#t      hst#
#tsh      t#"#
#f g      "###
#eti      ####
#lnr#"thgir"=s
#"i"###s tnirp
#=r=##"tfel"=s
#sps##########

ลองออนไลน์!

สะท้อน (ขวา):

#sps##########
#=r=##"tfel"=s
#"i"###s tnirp
#lnr#"thgir"=s
#eti      ####
#f g      "###
#tsh      t#"#
#"#t      hst#
###"      g f#
####      ite#
s="right"#rnl#
print s###"i"#
s="left"##=r=#
##########sps#

ลองออนไลน์!


3

ทำความสะอาด , 1331 1055 ไบต์

-276 ไบต์ขอบคุณØrjan Johansen

// ////////////;/;/////////// //
// ////////////S/S/////////// //
  module m////mtmt////m eludom  
//o///////////=a=a///////////o//
//d///////////"r"r///////////d//
//u///////////tttt///////////u//
//l///////////f#h#///////////l//
//e///////////emgm///////////e//
// ///////////loio/////////// //
//m///////////"drd///////////m//
//////////////=u"u//////////////
//////////////ml=l//////////////
//////////////#eme//////////////
////////////// =#=//////////////
;Start#module= 0   #m="left"=m//
//m="thgir"=m#   0=eludom#tratS;
;Start#module=0   #m="right"=m//
//m="tfel"=m#   0 =eludom#tratS;
//////////////=#= //////////////
//////////////eme#//////////////
//////////////l=lm//////////////
//////////////u"u=//////////////
//m///////////drd"///////////m//
// ///////////oiol/////////// //
//e///////////mgme///////////e//
//l///////////#h#f///////////l//
//u///////////tttt///////////u//
//d///////////r"r"///////////d//
//o///////////a=a=///////////o//
  module m////tmtm////m eludom  
// ///////////S/S//////////// //
// ///////////;/;//////////// //

ลอง "ซ้าย" ออนไลน์!

ลอง "ถูกต้อง" ออนไลน์!

นี่เป็นเรื่องยากด้วยเหตุผลหลายประการ:

  • ล้างข้อมูลต้องมีส่วนหัวของไฟล์module <filename>ในตอนเริ่มต้นและจะเริ่มต้นเฉพาะไฟล์ น่าเสียดายที่นี่หมายความว่าการหมุนของโปรแกรมมิร์เรอร์จะใช้งานได้ก็ต้องปรากฏที่ด้านล่างของไฟล์ ที่จะทำให้แย่ลงmodule ..ไม่ถูกต้องสำหรับทั่วโลกlet .. in, where ..และwith ..คำจำกัดความ; และโทเค็นmoduleปรากฏขึ้นหากไม่ได้กำหนดไว้จะทำให้เกิดข้อผิดพลาด
  • ทั้งความคิดเห็นบล็อกและรังความคิดเห็นในบรรทัด: /* /* */เปิดความคิดเห็นหนึ่งระดับและทำเช่นนั้น/* // */ (รวมถึงการแสดงความคิดเห็นส่วนที่เหลือของบรรทัด)
  • ฟังก์ชั่นเดียวกันสามารถกำหนดได้หลายครั้ง แต่จะอยู่หลังตัวเองโดยตรงเท่านั้น

โชคดีที่เราสามารถนิยามmoduleเป็นบางสิ่งใน#..นิพจน์ (แจ้งล่วงหน้า) ซึ่งเป็นสิ่งที่เราต้องการ เนื่องจาก Clean ไม่ได้ตรวจสอบทางเลือกที่ไม่เคยใช้ (และสิ่งอื่น ๆ ที่ไม่ได้ใช้อย่างเท่าเทียมกัน) ความหมายที่สองที่จำเป็นของการStartเป็นขยะสมบูรณ์ สิ่งนี้ทำให้เราสามารถใช้ส่วนที่สองStartเพื่อใช้ส่วนหัวของโมดูลที่ด้านล่างของไฟล์ได้เนื่องจาก Clean จะถือว่าm module mเป็นการเรียกใช้ฟังก์ชันmบนmoduleและm(ซึ่งนับตั้งแต่ที่เราได้กำหนดไว้moduleและmไม่ก่อให้เกิดข้อผิดพลาด) มันไม่สำคัญว่าmเป็นสตริงและไม่ใช่ฟังก์ชั่นเพราะStartทางเลือกไม่เคยได้รับการตรวจสอบประเภท

วิธีนี้ง่ายกว่าที่จะดูว่าคุณมองผ่านสายตาของคอมไพเลอร์หรือไม่:

module m;
Start#module=0#m="left"=m;
Start#module=0#m="right"=m module m

1
1055การควบรวมและm s
Ørjan Johansen

@ ØrjanJohansen Oooh จับได้ดีมาก!
Οurous

3

Brachylogขนาด 341 ไบต์

Ẹw"thgir"∧"left"wẸ
w"              "w
"                "
t                t
f                h
e                g
l                i
"                r
∧                "
"                ∧
r                "
i                l
g                e
h                f
t                t
"                "
w"              "w
Ẹw"tfel"∧"right"wẸ

ลองออนไลน์!

! enilno ti yrT

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


2

ทับทิมขนาด 181 ไบต์

#########tpt#
t=:left##=u=#
puts t###:t:#
t=:right#rsl#
####     i e#
###t     gtf#
#t#h     h#t#
#ftg     t###
#e i     ####
#lsr#thgir:=t
#:t:###t stup
#=u=##tfel:=t
#tpt#########

ลองออนไลน์!

นี่คือพอร์ตของ Python ของ Curtis Bechtel ที่ตอบ Ruby, golfed อีกเล็กน้อย

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

สร้างของคุณเอง


2

แบตช์438 321 ไบต์

:::::::::::::@@@:
@echo left&: eee:
@exit/b&:    cxc:
@echo right&:hih:
:  :         oto:
:: &          / :
:& t         rbl:
:t h         i&e:
:f:g         g:f:
:e&i         h t:
:lbr         t &:
: /          & ::
:oto         :  :
:hih:&thgir ohce@
:cxc    :&b/tixe@
:eee :&tfel ohce@
:@@@:::::::::::::

คำอธิบาย: A :ใช้เพื่อระบุเลเบลซึ่งดีเท่ากับความคิดเห็นดังนั้นเมื่อโปรแกรมมีการหมุนสมมาตรความแตกต่างเพียงอย่างเดียวระหว่างสองเวอร์ชันคือ@บรรทัดใดเป็นอันดับแรกในกรณีใดleftหรือrightเป็นเอาต์พุตก่อนสคริปต์ ทางออก

ฉันพยายามที่จะทับเส้นหมุนที่ซ้อนกันอย่างสร้างสรรค์ แต่ความพยายามของฉันก็จบลงด้วยกริดที่ใหญ่กว่า

แก้ไข: บันทึกแล้ว 117 ไบต์ขอบคุณ @ ØrjanJohansen


ฉันคิดว่าคุณสามารถแทนที่โดย&rem &:
Ørjan Johansen

@ ØrjanJohansenฉันดูเหมือนจะจำได้ว่าพยายามก่อนหน้านี้ในความท้าทายที่คล้ายกัน แต่ฉันไม่คิดว่ามันจะทำงานได้ดี
Neil

นี้ (ไม่ต้องสนใจ Haskell, TIO ดูเหมือนจะไม่มีแบทช์) ทำงานให้ฉันเหมือนtest.batในพรอมต์คำสั่ง Win10
Ørjan Johansen

@ ØrjanJohansenยุติธรรมมากพออาจเป็นข้อผิดพลาดในรุ่นก่อนหน้าCMD.EXEหรือบางสิ่งบางอย่าง
Neil

2

05AB1E (ดั้งเดิม) , 89 55 ไบต์

'…¸q©ƒ'
ƒ     …
©     ¸
q     q
¸     ©
…     ƒ
'ƒ©q¸…'

วิธีการขั้นพื้นฐานมาก เอาต์พุตเป็นตัวพิมพ์เล็กแบบเต็ม

ลองออนไลน์หรือลองออนไลน์สะท้อน (แต่ละการหมุนเหมือนกัน)

คำอธิบาย:

'…¸   '# Push the dictionary string "left" to the stack
   q   # Stop the program (and output the top of the stack implicitly)
       # Everything else after it is ignored

ย้อนกลับ

'ĩ   '# Push the dictionary string "right" to the stack
   q   # Stop the program (and output the top of the stack implicitly)
       # Everything else after it is ignored

ดู 05AB1E เคล็ดลับของฉัน (ส่วนวิธีใช้พจนานุกรมได้อย่างไร )เพื่อทำความเข้าใจว่าเพราะ'…¸อะไร"left"และ'ƒ©เป็น"right"อย่างไร


คำสั่งที่ละเว้นนั้นไม่มีตัวเลือกจริง ๆ หรือไม่เคยไปถึงเพราะเหตุ qใด
Ørjan Johansen

@ ØrjanJohansenประการที่สองพวกเขาไม่เคยไปถึง ดังนั้นในทางเทคนิคแล้วไม่มีตัวเลือก (ซึ่งเป็นคำที่ฉันมักจะใช้กับรหัสทั้งหมดที่ละเว้นในคำตอบของฉัน) สิ่งนี้ยังไม่สามารถใช้งานได้ในรุ่นใหม่ของ 05AB1E เนื่องจากดูเหมือนว่าจะดูรหัสก่อน (เรียงลำดับของการคอมไพล์) แล้วจึงดำเนินการเท่านั้น ในขณะที่รุ่นมรดกเพิ่งเริ่มดำเนินการฉันคิดว่า นี่คือเหตุผลที่ฉันระบุว่าฉันใช้(legacy)รุ่น 05AB1E
Kevin Cruijssen


1

เวทมนตร์รูน 116 ไบต์

> \ !U\L
 ...@.. 
 \.R""" 
 @""trl 
 "lrhie 
 teiggf 
 ffgiht 
 ethrt" 
 l"t""@ 
 " "R.\ 
 .\@.@. 
DR\!!/R 
     !! 

ลองออนไลน์!

และกลับด้าน

ไม่ใช่พอร์ต แต่ใช้Klein 000 ของ Post Left Garf Hunter ตอบเป็นจุดเริ่มต้นเนื่องจากความเข้ากันได้โดยทั่วไปของทั้งสองภาษา (คำสั่งส่วนใหญ่เหมือนกันและขอบการตัดขอบใน Runic นั้นเหมือนกับ Klein 000) ปัญหาเดียวคือ Klein IP นั้นเริ่มต้นจากด้านบนซ้ายเสมอและ Runic ไม่ได้ เช่น.นี้เป็นส่วนหนึ่งของรหัสต้นฉบับและยังคงถือว่าเป็น NOP โดย Runic ในขณะที่ NOPs ฉันต้องเพิ่มเป็นส่วนหนึ่งของการควบคุมการไหล

พิมพ์"left"ในการหมุนทั้ง 4 และ"right"เมื่อสะท้อน (และในทั้งสี่การหมุนของมัน) คอลัมน์กลางสองคอลัมน์ไม่ได้ใช้งานอย่างสมบูรณ์หลังจากการแก้ไขของฉันดังนั้นฉันจึงสามารถลบออกได้

ในทางทฤษฎีแล้วการหมุนที่มีช่องว่างต่อท้ายจำนวนมากสามารถใช้สำหรับจำนวนไบต์ที่ต่ำกว่า (เช่นตัวแปรนี้ ) อย่างไรก็ตามช่องว่างจำเป็นต้องหมุนโครงสร้างอย่างถูกต้องโดยใช้เครื่องมือภายนอกดังนั้นฉันจึงรวมมันไว้ด้วย

ตัวแปรด้านล่างมีชิ้นส่วนที่ไม่ได้ใช้ซึ่งถูกลบออก แต่ไม่เหมือนกัน:

ทั้งสี่ทักทาย เอาท์พุทleftleftleftleft(ความจริงที่ว่าทั้งสี่สามารถเรียกใช้เช่นนี้เป็นเรื่องบังเอิญ)

ขวา 1 , ขวา 2 , ขวา 3 , ขวา 4


1

Gol> <> , 342 ไบต์

 8A_          _A8 
9       ""       9
A       LR       A
_       EI       _
        FG        
        TH        
        "T        
         "        
 "TFEL" HH"RIGHT" 
 "THGIR"HH "LEFT" 
        "         
        T"        
        HT        
        GF        
_       IE       _
A       RL       A
9       ""       9
 8A_          _A8  

ว้าว! ที่ใช้เวลานานกว่าที่ฉันคาดไว้ครึ่งทางที่ฉันรู้ว่าการสะท้อนนั้นเป็นแนวตั้งไม่ใช่แนวนอนเหมือนที่ฉันเข้ารหัสไว้! ฉันค่อนข้างแน่ใจว่าใช้งานได้ แต่ถ้าฉันทำผิดพลาดโปรดแจ้งให้ฉันทราบ นี่น่าจะเป็นเรื่องที่น่าขันมากกว่านี้ฉันเพิ่งใช้วิธีการดุร้ายอย่างมาก รูปร่างนั้นจริง ๆ แล้วเป็นรูปสี่เหลี่ยมจัตุรัสมันเป็นรูปสมมาตรทางเทคนิคยกเว้นข้ามแกน x ดังนั้นเมื่อมันพลิกมันจะส่งกลับ "RIGHT" แทน !!!

ตัวละครที่ทำให้โปรแกรมนี้เป็นไปได้คือ 'A' ซึ่งอนุญาตให้ทำการส่งผ่านทางไกลไปยังจุดเริ่มต้นของบรรทัดหนึ่ง!

ลองออนไลน์!


1
การสะท้อนแนวตั้งและแนวนอนไม่ควรสร้างความแตกต่างเนื่องจากมันจะเหมือนกันหลังจากการหมุน
ข้าวสาลีตัวช่วยสร้าง

@TRITICIMAGVS หืมไม่คิดอย่างนั้นขอบคุณที่ชี้ให้เห็นว่าฉันเพิ่งรู้ว่าสิ่งทั้งหมดนี้ไม่มีประโยชน์ JoKing ทำหนึ่งขนาด 27 ไบต์
KrystosTheOverlord

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