루빅스 큐브 알고리즘 반전


19

Rubik 's Cube를 움직일 때마다 첫 번째 이동을 취소하는 리버스 이동이 있습니다. 이 때문에 모든 알고리즘 (이동 세트)에는 첫 번째 알고리즘을 취소하는 역 알고리즘이 있습니다.

이 과제의 목표는 주어진 알고리즘의 반대를 찾는 것입니다.

사양:

입력은 개별 이동 배열로 구성됩니다. 각 이동은 길이가 1 또는 2 인 문자열입니다. 물론 언어에 가장 적합한 입력 형식을 사용할 수 있습니다. 각각의 움직임은 구조로 구성 X하거나 X'또는 X2, X대문자 또는 소문자입니다.

반대로 X바꾸 려면 간단히 바꾸십시오 X'. 마찬가지로 X'가됩니다 X. X2반면에 변경되지 않습니다.

출력을 만들려면 각 이동을 반대로 한 다음 배열을 뒤집습니다.

예 (공백으로 구분 된 문자열) :

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도전에 대한 좋은 추가되었습니다.
얽히고 설킨

1
"이 때문에 모든 알고리즘 (이동 세트)에는 첫 번째 알고리즘을 취소하는 역 알고리즘이 있습니다"는 모든 알고리즘에 해당됩니다. 원인 해싱 알고리즘이 한 가지 방법이라고 생각합니다. 리버스 알고리즘이 없다는 것을 의미합니까? 알려주세요
Avishek Saha

4
@AvishekSaha : Rubik의 큐브 문제에서 "알고리즘"은 "큐브에서 수행 할 수있는 일련의 동작"이라는 의미로 제한됩니다. 이런 의미에서 큐브에는 단방향 해싱 알고리즘과 같은 것이 없습니다.
로스 Presser

5
D2R2테스트 사례로 했어야했는데 ...
Neil

답변:



7

V , 13 10 바이트

æGÇä/á'Ó''

온라인으로 사용해보십시오!

내가 좋아하는 기능을 지적하는 @nmjmcman 덕분에 3 바이트가 절약되었습니다. 설명:

æ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

않는 ä정력에 컴파일 할 때처럼은 정규식을 나타냅니다?
Downgoat

@ Downgoat 예! 그렇습니다. vim으로 번역 된이 솔루션은 :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

자바 스크립트 (ES6), 45 바이트

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

가장 짧은 솔루션은 어레이 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

당신은 1 바이트 .reverse()::reverse절약하지만 ES7
Downgoat

@Downgoat ES7을 테스트 할 수있는 곳이 있습니까?
코너 오브라이언

@ ConorO'Brien 당신은 babel 온라인 REPL (틱 실행 및 모든 기능에 대한 모든 사전 설정 상자)을 사용할 수 있습니다 : babeljs.io/repl
Downgoat

4

젤리 , 11 바이트

ḟ;ċ?”'ḣ2µ€Ṛ

문자 목록 ( "문자열"의 "배열") 목록을 리턴하는 모나드 링크.

온라인으로 사용해보십시오! 바닥 글은 출력을 스매싱하지 않고 목록을 공백으로 나눕니다.

어떻게?

ḟ;ċ?”'ḣ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"]

새로운 Jelly가있는 10 바이트
user202729

4

자바 스크립트 (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

이전 테스트가 사실이라면 간단히 반환하십시오 m.

:m[0]

그렇지 않으면의 첫 문자를 반환하십시오 m.

:m+"'"

문자열에 두 번째 문자가 포함되어 있지 않으면을 m추가하여 반환 하십시오 '.

.reverse()

수정 된 배열을 뒤집습니다.


미안, 방금 봤어 내 답변은 당신과 비슷합니다 : P
Conor O'Brien

2

파이썬 ,  51  48 바이트

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

명명되지 않은 함수로 문자열 목록을 가져오고 반환합니다.

온라인으로 사용해보십시오!

입력 목록을 a[::-1];로 바꿉니다 . '모든 항목 에 a 를 추가합니다 v+"'". 원본에의 사용 여부에 따라 각 1 ~ 2 자 (영문 1 ~ 2 자) '입니다 [:2-("'"in v)].


2

파이썬 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, 그것이 허용되는 것을 몰랐다 (일부 통역사가 그것을 허용했다는 것을 알고, 코드 골프에서 허용되는 것을 몰랐다)
sagiksp

2
여기서 언어는 통역사가 정의하므로 통역사에서 작동하면 유효합니다.
얽히고 설킨

통역사가 허락하면 할 수 있습니다. 그것은 모든 코드 골프에 관심이 있습니다.)
Stephen

len(i)-2보다 짧습니다 len(i)==1(0은 거짓임을 기억하십시오)
Stephen



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는 작은 따옴표를 나타내는 데 필요한 불행한 이스케이프 시퀀스가 ​​아닌 다른 것을 잘 처리합니다.

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

박스형 데이터를 사용하여 목록을 표현해야합니다. 하나와 두 개의 문자 항목이 혼합되어 있기 때문입니다.

  • &.> - "언 박스에서"는 각 요소의 박스를 해제하고 뒤에 나오는 작업 (예 : 아래 설명 된 기호)을 수행 한 다음 완료되면 다시 보냅니다.
  • (''''={:) "두 번째 문자가 작은 따옴표 인 경우"....
  • @. (J의 의제 동사, 일종의 일반화 된 3 원 진술 또는 사례 진술) "그런 다음 의제 목록에서 2 번째 항목을 수행하십시오. 그렇지 않으면 첫 번째 항목을 수행하십시오"
  • }: (의제 목록의 두 번째 항목), "마지막 문자 제거", 즉 작은 따옴표
  • `(J 's tie verb) 이것을 아젠다 항목 구분자로 생각할 수 있습니다
  • ,&'''' (의제 목록의 첫 번째 항목) "끝에 작은 따옴표 추가"
  • |. "역"

온라인으로 사용해보십시오!




0

자바 (8) 141 128 126 바이트

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

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.