루빅스 큐브 스크램블


21

당신의 임무는 임의의 동작 시퀀스를 만드는 것인데,이 동작은 루빅스 큐브를 뒤섞는 데 사용될 수 있습니다. 이러한 스크램블은 정확히 25 개의 동작으로 구성됩니다. 각 이동은 UDRLFB선택적으로 접미사 중 하나가 오는 문자로 구성됩니다 '2.

이 표기법을 Singmaster 표기법이라고합니다. UDRLFB는 6 개의면 중 하나를 나타내고 선택적 접미사 '2는 회전 각도를 나타냅니다. 이 정보는 작업을 해결하는 데 필요하지 않습니다.

스크램블이 '좋은 품질'이되도록하려면 다음 두 가지 규칙을 적용해야합니다.

  • 두 번 연속으로 같은 글자를 가져서는 안됩니다. 이것은 연속적인 이동을 금지 UU, DD, RR, LL, FFBB과 같은 옵션 접미사를 사용하여 모든 조합 U2U또는 U'U'.

    이 이동 쌍은 1 또는 0 이동으로 쉽게 줄일 수 있기 때문에 금지됩니다. U2U동일한 효과를 갖고 U', R'R동일한 효과 .

  • 세 번의 연속 이동은 동일한 문자 그룹이 아니어야합니다. 문자 그룹은 UD, RL하고 FB. 이 규칙은 추가로 연속 이동을 금지 UDU, DUD, RLR, LRL, FBF, BFB와 같은 선택적 접미사를 사용하는 모든 조합 U2DU, RL'R또는 B2FB'.

    그룹은 이동 축을 기준으로면을 정렬합니다. U그리고 D, 같은 그룹에있는 동일한 축을 중심으로 두 차례 때문이다. 따라서 U움직임은 D얼굴 D조각에 영향을 미치지 않으며 움직임은 U얼굴 조각에 영향을 미치지 않습니다 . 따라서 두 동작을 교환 할 수 있으며 UDU와 동일한 효과가 UUD있으며 이는로 줄일 수 있습니다 U2D.

도전

임의의 스크램블을 생성하는 스크립트 또는 함수를 작성하십시오. 입력이 없습니다. 스크립트 / 함수는 한 칸씩 분리하거나 분리하지 않고 25 개의 동작을 인쇄하거나 해당 문자열을 반환해야합니다.

프로그램은 위의 규칙을 만족하는 모든 단일 스크램블을 만들 수 있어야합니다. 물론, 난수 생성기는 의사 난수가 아니라 진정한 난수라고 가정합니다.

이것은 코드 골프입니다. 가장 짧은 코드 ( 바이트 단위로 계산 )가 이깁니다.

출력 예 :

스크립트 / 함수를 3 번 ​​호출하면 다음과 같이 인쇄 / 반환해야합니다.

R'B2R2F2R2FB'R2DR2ULFB2RB'U2B'FL'BR'U'RB'
U'DBR'B2U'B'U'RUF'B'RDR2U'B'LR'B'F2D2UF2L'
BR2F'B'R'D'R'U2B'F2D2R'F2D'F'D2R2B'L2R'UB'R2L'D

각각의 공백으로 동작을 분리하면 :

R2 L' F2 U2 D' R2 L2 F L' D2 U R B D' U2 L B2 L U B2 D U2 R' D2 U'
B R D2 F U2 B' R2 F2 B' U' L' R2 B U2 R' D B' F' U2 R' B' L R D2 R2
B2 R2 U D' B R D' R L2 D2 L2 R B2 F U' F2 B2 U' F U' D F R2 U2 B'

이 모든 출력은 25 개의 동작으로 구성되지만 선택적 접미사로 인해 길이가 다릅니다. 접미사로 사용 2되거나 공백 '으로 사용되는 경우 공백을 인쇄 할 수 없습니다 . 당신은 인쇄해야 L2UR2F'R'U2하거나 L2 U R2 F' R' U2. L2U R2F'R'U2허용되지 않습니다.


UR 2허용되지 않았습니까 ? 나는 움직임 사이의 공백이 의미가 있기 때문에 허용 U R2 되어야 한다고 생각합니다.
mbomb007

@ mbomb007 같은 것을 의미 L2U R2F'R'U2합니다. U선택적 접미사가 없으므로 공백이 없어야합니다. 공백은 선택적 접미사를 대신해서는 안됩니다.
Jakube

모든 움직임 사이에 공백이 있으면 어떻게합니까? U F2 L D2 R'...예를 들어 출력 할 수 있습니까? 이 경우 여분의 공간 이 없으므로 규칙에 따라 괜찮을 것 같습니다.
mbomb007

@ mbomb007 예, 설명에 넣겠습니다.
Jakube

편지 앞에 2가 아닌가? oO
Oliver Ni

답변:


6

CJam, 47 45 바이트

이 솔루션은 지금까지 게시 된 다른 방법과 다릅니다. CJam의 간결한 목록 작업을 활용하여 사용 가능한 이동 목록을 생성하고 각 반복마다 하나씩 하나씩 선택합니다. 수정자는 독립적으로 간단하게 생성됩니다.

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

{BA^2/6,_B-?A:B-mr0=:A"UDRLFB"=3mr[L2'']=}25*

설명

{               "Loop...";
  BA^2/           "If the two previous moves were not from the same group, ...";
  6,              "... then produce the available move list [0 1 2 3 4 5], ...";
  _B-             "... else produce the available move list [0 1 2 3 4 5] with
                   the second previous move removed";
  ?
  A:B             "Save the previous move as the second previous move";
  -               "Remove the previous move from the available move list";
  mr0=            "Randomly select an available move";
  :A              "Save this move as the previous move";
  "UDRLFB"=       "Map this move to its character (implicitly printed)";
  3mr[L2'']=      "Randomly select a modifier (implicitly printed)";
}25*            "... 25 times";

9

C, 129

f(){int i,n,m,r,s,t;for(i=26;i--;i<25&&printf("%c%c","URFDLB"[s%6],"'2"[r%3])){for(n=m,t=1;t;t=m*n==9)m=(r=rand()%15)/3+1;s+=m;}}

내부 루프는 모듈로 6에 추가되고 모듈로 6을 취할 때 큐브의 같은면에 두 개의 연속 이동이 없도록하는 m범위 의 값을 생성합니다 . 의 이전 값 이 저장되고 테스트 는 값 = 3이 한 번에 두 번 생성되지 않도록합니다 (따라서 반대쪽면은 한 번에 두 번 선택할 수 없습니다. 문자열에서면의 순서를 확인하십시오).1..5smnm*n==9m

의 적어도 상당 부분 r하는 접미사 (결정하는 데 사용됩니다 ', 2의 끝에 널 문자를 활용, 사용에 또는 null) "'2".

외부 루프는 26 번 실행됩니다. 처음에는 U선택할 수 없으므로 printf첫 번째 반복에서는 억제됩니다.

테스트 프로그램의 언 골프 코드

ungolfed 코드는 명확성을 위해 각 이동 사이에 공백을 넣습니다 (골프 코드는 1 바이트를 절약하기 위해 아닙니다). 또한 골프 코드는 대괄호 printf안에 위치를 지정하여 세미콜론을 저장합니다 for.

f(){
  int i,n,m,r,s,t;
  for(i=26;i--;){
    for(n=m,t=1;t;t=m*n==9)m=(r=rand()%15)/3+1;
    s+=m;
    i<25&&printf("%c%c ","URFDLB"[s%6],"'2"[r%3]);
  }
}

main(){
  int j;
  srand(time(0));
  for(j=0;j<5;j++)f(), puts("");
}

일반적인 출력

U' B D2 B' R' L F' D2 B D2 B2 R' B2 U D2 F' R U R' L B' L R2 B2 F'
U B U B F L2 D2 B' U' L B L R' D B U' D R D' B' F2 D' B D R
L D F2 B2 R' U F B' D2 L U R' L' U2 F' R F D U2 B L' B' U L2 F'
R2 B' F2 R2 L2 F' U2 L U' B' F R' D' F2 D F' L2 U2 R' D' B2 D F R2 L'
U2 F2 B2 D' F D F R L2 U' B D2 L' R D R F2 R' F2 U2 D R' D2 L F2



4

피스, 65 66

나는 Pyth에서 골프를 한 적이 없으며 프로그램을 작성했을 수도 있습니다. 이것은 기본적으로 @ steveverrill 의 솔루션으로 Pyth로 번역되었습니다. 개선 제안을 환영합니다.

업데이트 : 스크램블도 시작하도록 1 바이트를 추가했습니다 U. 어쩌면 C 솔루션은 정의되지 않은 동작에 의존하여 작동하게합니다.

=YO6V25JZK1WK=GO15=Z/+3G3=Kq9*ZJ)~YZpd+@"URFDLB"%Y6?@"'2"%G3>2%G3k

나는 이것이 적은 할당으로 이루어져야한다고 생각하지만 알고리즘을 많이 수정해야합니다. (음, 시도해 볼 수 있습니다.)

C 코드에 기반한 설명은 다음과 같습니다.

=YO6           s = random.choice(range(6))
V25            for i in range(25):
  JZ               n = m
  K1               t = 1
  WK               while t:
    =GO15              r = random.choice(range(15))
    =Z/+3G3            m = (r + 3) / 3
    =Kq9*ZJ            t = 9 == m * n
  )
  ~YZ              s += m
  pd               print(..., end = " ")
  +                ... + ...
  @"URFDLB"%Y6     "URFDLB"[s % 6]
  ?@"'2"%G3>2%G3k  "'2"[G % 3] if 2 > G % 3 else ""

변수를 전환 Y하고 Z. Z0으로 사전 초기화되므로 처음 3자를 저장합니다.
Jakube

@Jakube 그러나 그런 다음 n = m(3 번째 설명 줄) 을 설정 해야합니다. 이는 n = 0처음을 의미해야하며 , Y0이되어야합니다.
PurkkaKoodari

Y빈 목록으로 사전 초기화됩니다 []. 그리고 나는 n첫 번째 반복에서 문제 의 가치를 생각하지 않습니다 .
Jakube

Btw, 귀하의 코드는로 시작하는 스크램블을 생성하지 않습니다 U.
Jakube

@Jakube 감사합니다.
PurkkaKoodari

4

자바 스크립트 (ES6) 175 178 204

코드를 변경하여 1을, 바이트를 계산하는 방식을 변경하여 2를 3 바이트 이하로 편집하십시오 (카운팅 F=아님)

반복을 피하는 코드는 @stevemiller에서 가져 왔습니다. 편지 그룹을 관리하는 그의 방법은 훨씬 나아지지만 도둑질하지는 ​​않을 것입니다.

보너스 : 선택적으로 이동 횟수를 지정할 수 있습니다.

(n=25,R=n=>Math.random()*n|0)=>(r=>{for(N=_=>'UDRLFB'[(r-=~R(5))%6],b=N(a=N(s=''));n;~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')?0:s+=(--n,a=b,b=c)+["","'",2][R(3)])c=N()})(0)||s

덜 골프

(n = 25) => 
{
  R = n => Math.random()*n | 0;
  N = _ => 'UDRLFB'[(r += 1+R(5)) % 6];
  r = 0;
  b = N();
  a = N();
  for(s = '' ; n; )
     c = N(),
     ~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')
       ? 0
       : s += (--n, a=b, b=c) + ["","'",2][R(3)];
  return s
}

테스트

var F=
(n=25,R=n=>Math.random()*n|0)=>(r=>{for(N=_=>'UDRLFB'[(r-=~R(5))%6],b=N(a=N(s=''));n;~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')?0:s+=(--n,a=b,b=c)+["","'",2][R(3)])c=N()})(0)||s

function go() {
  console.log(F(+M.value))
}

go()
Moves <input type=number min=1 id=M value=25 max=999>
<button onclick='go()'>Test</button>


2

자바 스크립트-112

for(c=b=j=25,r=Math.random;j;c+b-5|c-m&&b-m?document.write("URFBLD"[j--,c=b,b=m]+" 2'"[0|r()*3]+" "):0)m=0|r()*6



1

클로저, 223 바이트

(let[R(range)F(fn[f p c](apply concat(filter f(partition-by p c))))](apply str(map str(take 25(F(fn[p](<(count p)3))(zipmap"UDLF""1122")(F(fn[p](=(count p)1))int(for[_ R](rand-nth"UDRLFB")))))(for[_ R](rand-nth[""\'\2])))))

이것은 "시퀀스-> 파티션 별-> 필터-> concat"패턴에 크게 의존하며, "잘못된"순서의 얼굴을 걸러내는 데 사용됩니다. 그런 다음이 seq는 임의의 접미사 (빈 문자열 포함)와 함께 문자열에 매핑됩니다.

언 골프 시작점 :

(->> (for[_(range)](rand-nth"UDRLFB"))
     (partition-by int)           ; "identity" would be the correct fn to use here
     (filter(fn[p](=(count p)1))) ; Only one identical value in partition
     (apply concat)
     (partition-by(zipmap"UDLF""1122")) ; R & B are in the implicit nil group
     (filter(fn[p](<(count p)3)))       ; Only 1 or 2 consecutive faces from a group
     (apply concat)
     (take 25))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.