ย้อนกลับอัลกอริทึม Cube ของรูบิค


19

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

เป้าหมายของความท้าทายนี้คือการค้นหาสิ่งที่ตรงกันข้ามของอัลกอริทึมที่กำหนด

รายละเอียด:

อินพุตประกอบด้วยอาร์เรย์ของการเคลื่อนไหวแต่ละรายการ การย้ายแต่ละครั้งเป็นสตริงที่มีความยาว 1 หรือ 2 แน่นอนคุณสามารถใช้รูปแบบการป้อนข้อมูลใดก็ได้ที่มีความหมายมากที่สุดในภาษาของคุณ การย้ายแต่ละครั้งประกอบด้วยโครงสร้างXหรือX'หรือX2ซึ่งXเป็นตัวอักษรตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก

ที่จะย้อนกลับเพียงแทนที่ด้วยX X'ในทำนองเดียวกันจะกลายเป็นX' ในทางกลับกันไม่ได้รับการเปลี่ยนแปลงXX2

เมื่อต้องการสร้างผลลัพธ์ให้ย้อนการย้ายแต่ละครั้งจากนั้นย้อนกลับอาร์เรย์

ตัวอย่าง (สตริงคั่นด้วยช่องว่าง):

R => R'

D U' => U D'

S T A C K => K' C' A' T' S'

A2 B2 => B2 A2

เกณฑ์การให้คะแนน:

นี่คือโค้ดกอล์ฟดังนั้นจำนวนไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ ไม่อนุญาตช่องโหว่มาตรฐาน


อนุญาตR2-> R2'หรือB-> B3หรือไม่
CalculatorFeline

2
ต้องจัดการX3หรือX1เป็นส่วนเสริมที่ดีสำหรับความท้าทาย
Shaggy

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

4
@AvishekSaha: สำหรับปัญหาลูกบาศก์ของรูบิค "อัลกอริธึม" ถูก จำกัด ตามความหมาย "ลำดับของการเคลื่อนไหวที่คุณสามารถทำได้บนคิวบ์" ในแง่นี้ไม่มีสิ่งใดที่เป็นอัลกอริทึมการแฮชแบบทางเดียวใน Cube
Ross Presser

5
น่าจะมีD2R2เป็นกรณีทดสอบ ...
Neil

คำตอบ:



7

V , 13 10 ไบต์

æGÇä/á'Ó''

ลองออนไลน์!

บันทึกได้ 3 ไบต์ด้วย @nmjmcman ซึ่งชี้ให้เห็นถึงคุณสมบัติที่ฉันโปรดปราน คำอธิบาย:

æG          " Revere the order of every line
  Ç         " On every line not containing...
   ä/       " a digit:
     á'     "   Append an '
       Ó    "   Remove every instance on this line
        ''  "     Of two single quotes

ไม่äชอบเป็นตัวแทน regex เมื่อรวบรวมเป็นกลุ่ม?
Downgoat

@ ลงไปใช่! มันทำ โซลูชันนี้เป็น:g!/\d/norm A'<CR>:%s/''//g<CR>gg:g/^/m0<CR>ข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ V บีบอัดนิพจน์ทั่วไปได้ที่นี่
DJMcMayhem

@DJMcMayhem ไม่สิ้นสุดโดยนัยเหมือนคุณลักษณะที่คุณชื่นชอบใช่ไหม ลองออนไลน์!
nmjcman101

3
ฉันรู้ว่ามันค่อนข้างช้า แต่ก็ใช้ไม่ได้สำหรับฉัน มันเปลี่ยน R2 เป็น 2R ซึ่งไม่ถูกต้อง
Jamie Sanborn

7

เรติน่า 0.8.2 , 27 26 ไบต์

\w
$&'
''

'2'
2
O$^`.'?2?

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


สิ่งนี้จะปรับปรุงให้ดีขึ้นด้วยการเปิดตัวRetina 1.0หรือไม่
MD XF

@MDXF ดูเหมือนว่าO$^ในความเป็นจริงยังคงเป็นวิธีที่ดีที่สุดในการกลับรายการการแข่งขันดังนั้นจำนวนไบต์จะไม่เปลี่ยนแปลงจริงใน Retina 1
Neil

5

JavaScript (ES6), 45 ไบต์

s=>s.map(([a,b])=>b?+b?a+b:a:a+"'").reverse()

ทางออกที่สั้นที่สุดคือการใช้ Array IO ใช้งานง่ายและเหมาะสมในการทำลายการโต้แย้ง

เอาท์พุทสตริงเป็น 8 .join` `ไบต์

อินพุตสตริงเอาต์พุตอาร์เรย์: 69 ไบต์

(s,k=[])=>s.replace(/\S\S?/g,([a,b])=>k.unshift(b?+b?a+b:a:a+"'"))&&k

f=

(s,k=[])=>s.replace(/\S\S?/g,([a,b])=>k.unshift(b?+b?a+b:a:a+"'"))&&k

;

console.log(["R", "D U'", "S T A C K", "A2 B2"].map(e => `${e} => ${f(e)}`));
<textarea oninput="out.value=(f(this.value)||[]).join` `" placeholder="input here"></textarea>
<textarea id="out" readonly></textarea>


ทำได้ดีนี่. ทำไมฉันถึงไม่คิดที่จะทำลายพารามิเตอร์ของฟังก์ชั่น?! :(
Shaggy

คุณควรจะสามารถแทนที่.reverse()ด้วย::reverseการบันทึก 1 ไบต์ แต่ทำให้ ES7
Downgoat

@Downgoat สถานที่ใดที่ฉันสามารถทดสอบ ES7 ได้
Conor O'Brien

@ ConorO'Brien คุณสามารถใช้ REPL ออนไลน์ของ Babel (เห็บดำเนินการและกล่องที่กำหนดไว้ล่วงหน้าสำหรับคุณสมบัติทั้งหมด): babeljs.io/repl
Downgoat

4

เยลลี่ 11 ไบต์

ḟ;ċ?”'ḣ2µ€Ṛ

ลิงก์ monadic ที่ส่งคืนรายการของอักขระ ("อาร์เรย์" ของ "สตริง")

ลองออนไลน์! (ส่วนท้ายเพื่อหลีกเลี่ยงการเอาท์พุทยอดเยี่ยมแสดงรายการแยกด้วยช่องว่าง)

อย่างไร?

ḟ;ċ?”'ḣ2µ€Ṛ - Link: list of lists of characters             e.g. ["F'", "D2" , "R"]
        µ€  - perform the chain to the left for €ach turn instruction:
    ”'      -   literal "'" character
   ?        -   if:
  ċ         -     count (number of "'" in the instruction) i.e.:  1   , 0    , 0
ḟ           -   then: filter out                                  "F"
 ;          -   else: concatenate                                       "D2'", "R'"
      ḣ2    -   head to index 2                                   "F" , "D2" , "R'"
          Ṛ - reverse                                            ["R'", "D2" , "F"]

10 ไบต์พร้อมเยลลี่ใหม่
user202729

4

JavaScript (ES6), 46 ไบต์

รับอินพุตเป็นชุดของการย้าย

a=>a.map(m=>m[1]?+m[1]?m:m[0]:m+"'").reverse()

ทดสอบมัน

ป้อนรายการย้ายที่คั่นด้วยเครื่องหมายจุลภาค

o.innerText=(f=
a=>a.map(m=>m[1]?+m[1]?m:m[0]:m+"'").reverse()
)((i.value="S,T,A,C,K").split`,`);oninput=_=>o.innerText=f(i.value.split`,`)
<input id=i><pre id=o>


คำอธิบาย

a=>

aฟังก์ชั่นที่ไม่ระบุชื่อการอาร์เรย์ของการย้ายเป็นอาร์กิวเมนต์ผ่านพารามิเตอร์

a.map(m=>                       )

แม็พกับอาร์เรย์ผ่านแต่ละสตริงผ่านฟังก์ชันโดยที่mเป็นสตริงปัจจุบัน

 m[1]?

ตรวจสอบว่าสตริงมีอักขระตัวที่สองที่สอง ( "'"หรือ"2")

+m[1]?

หากพยายามโยนสตริงอักขระนั้นให้เป็นจำนวนเต็ม หากสตริงเป็น"2"มันจะกลายเป็น2ซึ่งเป็นความจริง หากสตริงเป็น"'"มันจะกลายเป็นNaNซึ่งเป็นเท็จ

m

หากการทดสอบก่อนหน้านี้ truthy mเพียงแค่กลับ

:m[0]

mมิฉะนั้นกลับตัวอักษรตัวแรกของ

:m+"'"

หากสายไม่ได้มีตัวละครที่สองจากนั้นกลับมาผนวกเข้ากับm'

.reverse()

ย้อนกลับอาร์เรย์ที่ปรับเปลี่ยน


ขออภัยฉันเพิ่งเห็นสิ่งนี้ คำตอบของฉันคล้ายกับของคุณ: P
Conor O'Brien

2

Pythonขนาด 51  48 ไบต์

lambda a:[(v+"'")[:2-("'"in v)]for v in a[::-1]]

ฟังก์ชั่นที่ไม่มีชื่อการรับและส่งคืนรายการสตริง

ลองออนไลน์!

ย้อนกลับรายการอินพุตด้วยa[::-1]; ผนวก'ไปทุกรายการที่มีv+"'"; หัวหนึ่งไป 1 หรือ 2 ตัวละครแต่ละคนขึ้นอยู่กับว่าเดิมมีในหรือไม่ด้วย'[:2-("'"in v)]


2

Python 3 , 91 89 72 70 69 65 ไบต์

lambda s:[i[0]+(len(i)-2and"'"or"2"*("2"==i[1]))for i in s[::-1]]

ลองออนไลน์! (พร้อมทดสอบ)

เห็นได้ชัดว่าคุณไม่จำเป็นต้องใช้อินพุตและเอาต์พุตเป็นสตริงดังนั้นโซลูชัน 69 ไบต์จึงเป็นไปได้


AFAIK คุณสามารถลบพื้นที่หลังจากlen(i)==1
Stephen

@ StepHen Huh ไม่รู้ว่าได้รับอนุญาต (รู้บ้างว่าล่ามบางคนอนุญาตให้ทำได้แค่ไม่รู้ว่ามันอนุญาตใน codegolf)
sagiksp

2
ภาษาถูกกำหนดโดยล่ามของพวกเขาที่นี่ดังนั้นหากใช้งานได้กับล่ามคนใดคนหนึ่งมันก็ใช้ได้
Shaggy

หากล่ามอนุญาตคุณก็สามารถทำได้ นั่นคือทั้งหมดที่ code-golf ใส่ใจ;)
Stephen

len(i)-2สั้นกว่าlen(i)==1(โปรดจำไว้ว่า 0 คือเท็จ)
สตีเฟ่น



1

05AB1E , 13 ไบต์

RεÐ1èQ''si«ëK

ลองออนไลน์!

คำอธิบาย

RεÐ1èQ''si«ëK
R             # Reverse input array
 ε            # Map over each element...
  Ð1èQ         # Is the second char in the element the first one? (Uses the fact that in python indexing loops)
      ''       # Push '
        s      # Swap top items of stack
         i     # If the question above is true...
          «     # Concatenate
           ë   # Else
            K   # Push element without '  

1

J, 25 ไบต์

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

|.,&''''`}:@.(''''={:)&.>

เราจำเป็นต้องแสดงรายการโดยใช้ข้อมูลที่บรรจุอยู่เนื่องจากเป็นการรวมกันของรายการอักขระหนึ่งและสองจึง:

  • &.> - "under unbox" ซึ่งหมายถึง unbox แต่ละองค์ประกอบทำการดำเนินการที่ตามมา (เช่นสัญลักษณ์ที่อธิบายด้านล่าง) จากนั้น rebox เมื่อเสร็จแล้ว
  • (''''={:) "ถ้าอักขระตัวที่ 2 เป็นเครื่องหมายคำพูดเดี่ยว" ....
  • @. (คำกริยาในวาระการประชุมของ J, ประโยคคำศัพท์ทั่วไป, หรือคำสั่งกรณี) "จากนั้นดำเนินการรายการที่ 2 ในรายการวาระหรือดำเนินการก่อน"
  • }: (รายการที่ 2 ในรายการวาระ) "ลบตัวอักษรตัวสุดท้าย" กล่าวคือคำพูดเดียว
  • `(กริยาเสมอของ J) คุณสามารถคิดว่านี่เป็นตัวแยกรายการวาระ
  • ,&'''' (รายการแรกในรายการวาระ) "เพิ่มคำพูดเดียวจบ"
  • |. "ย้อนกลับ"

ลองออนไลน์!




0

Java 8, 141 128 126 ไบต์

a->new StringBuffer(a.replaceAll("(.)","$1'").replace("'''","").replaceAll("(.)'","'$1").replaceAll("'(.)'2","2$1")).reverse()

รับอินพุตเป็น Single Stringโดยไม่มีช่องว่าง (เช่นRUR'URU2R'U)

คำอธิบาย:

ลองออนไลน์

a->new StringBuffer(           // Method with String parameter and StringBuffer return-type
  a.replaceAll("(.)","$1'")    //1  Add an apostrophe after every character
   .replace("'''","")          //2  Remove all occurrences of three adjacent apostrophes
   .replaceAll("(.)'","'$1")   //3  Reverse letter+apostrophe to apostrophe+letter
   .replaceAll("'(.)'2","2$1") //4  Reverse letter+2 to 2+letter and remove aphostrophes
  ).reverse()                  //5 Reverse everything

ตัวอย่างขั้นตอนข้างต้นโดยป้อนข้อมูลตามที่กำหนด: RUR'URU2R'U

  1. RUR'URU2R'UR'U'R'''U'R'U'2'R'''U'
  2. R'U'R'''U'R'U'2'R'''U'R'U'RU'R'U'2'RU'
  3. R'U'RU'R'U'2'RU''R'UR'U'R'U'2R'U
  4. 'R'UR'U'R'U'2R'U'R'UR'U'R2UR'U
  5. 'R'UR'U'R2UR'UU'RU2R'U'RU'R'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.