슈퍼 퍼뮤 테이션


26

소개

당신은 새로운 기술 스타트 업 Dejavu의 비밀 계획을 훔치는 범죄자입니다. 뒷벽 너머로 몰래 들어가지만 문을 열려면 핀이 필요한 문을 찾으십시오. 잠금을 확인하고 0에서 4까지의 모든 숫자를 사용하여 5 자리 핀을 사용한다는 것을 알고 있습니다. 각 숫자를 입력 한 후 잠금은 마지막으로 입력 한 5 자리를 확인하고 코드가 올바른 경우 열립니다. 이 자물쇠를지나 쳐야합니다.

간단히 말해서 슈퍼 퍼뮤 테이션

순열은 특정 숫자 집합의 가능한 모든 조합입니다. 예를 들어, 숫자 0, 1, 2의 모든 순열은 다음과 같습니다.

012, 021, 102, 120, 201 및 210.

이러한 순열을 모두 연결하면 초 순열이 발생합니다.

012021102120201210

이 수퍼 퍼뮤 테이션에는 0, 1, 2의 모든 순열이 포함되지만 이보다 하나 더 짧게 만들 수 있습니다. 여기서는 조금 생략하지만이 숫자의 가장 짧은 초 치환은 다음과 같습니다.

012010210

우리의 의도와 목적을 위해, 이것은 본질적으로 해당 숫자의 가능한 모든 순열을 포함하는 가장 짧은 자릿수, 즉 초 순열입니다.

태스크

걱정할 두 자리가 더 있기 때문에 위의 그림과 같이 과잉 치환 예제보다 작업이 약간 어렵습니다. -당신이 초 순열에 대해 읽지 않았거나 위의 예가 약간 불분명 한 경우 Patrick Honner의 주제에 대해이 위대한 기사를 읽는 것이 좋습니다 (이 도전은 그의 기사에서 큰 영감을 얻었으므로 그에게 큰 도움이되었습니다). https://www.quantamagazine.org/unscrambling-the-hidden-secrets-of-superpermutations-20190116/ . 당신의 목표는 가능한 한 가장 짧은 프로그램을 작성하여 0에서 4까지의 숫자의 초 치환을 생성하는 것입니다.

채점

프로그램은 어떤 종류의 입력도 취하지 않으며 0에서 4까지의 숫자의 초 순환을 생성합니다.이 결과로 만들어진 초 순환은 콘솔에 인쇄되거나 선택한 언어에서 제공하는 범위까지 사용자에게 표시되어야합니다. 이것은 가능한 가장 짧은 순열 일 필요는 없으며, 유효한 초 순열이어야합니다. 이 때문에 목표는 초 순환이 가장 짧은 가장 짧은 프로그램을 작성하는 것이므로 다음과 같이 점수를 계산해야합니다.

파일 크기 (바이트) * 생성 된 초 치환 길이 (자리)

예를 들어, 내가 40 바이트 프로그램을 가지고 있고 슈퍼 퍼뮤 테이션의 길이가 153 자리이면 내 점수는 다음과 같습니다.

40 * 153 = 6120

항상 목표는이 점수를 가능한 한 낮추는 것입니다.

주형

답변을 게시하는 방법은 다음과 같습니다.

언어 | 점수

작업 환경에서 코드에 연결 (가능한 경우)

code snippet

코드 설명 등

결승

이것은이 사이트의 첫 번째 질문 중 하나입니다. 따라서 누락 된 것이 있거나 도전 과제의 일부가 확실하지 않은 경우 알려주십시오. 고마워요, 즐거운 골프 되세요!


최저 점수에 대한 아이디어를 얻기 위해 가장 짧은 초 치환의 길이를 알 수 있습니까?
치명적

1
@Fatalize 153 짧다
TFeld

1
@Fatalize 참조 A180632 .
Arnauld

1
언뜻보기에, 이것은 de Bruijn 시퀀스를 요구하는 것처럼 보입니다. 그러나 점수 기준은이 도전을 흥미롭게 만듭니다. 잘 했어!
Erik

3
@EriktheOutgolfer 그것의 다만 점수 차이가하십시오 superpermutation는 동안, 어떤 길이의 모든 순열을 포함 드 브루 인 순서가 어떤 길이의 모든 문자열이 포함되어 있습니다.
Anders Kaseorg

답변:


6

05AB1E , 점수 = 1673 (7 바이트 · 239)

žBœ∊{3ý

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

작동 원리

žB          push 1024
  œ         permutations: ["1024", "1042", …, "4201"]
   ∊        vertically mirror: ["1024", "1042", …, "4201", "4201", …, "1042", "1024"]
    {       sort: ["0124", "0124", "0142", "0142", …, "4210", "4210"]
     3      push 3
      ý     join: "01243012430142301423…3421034210"

Pyth , 점수 = 1944 (9 바이트 · 216)

s+R+4d.p4

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

작동 원리

 +R   .p4   append to each permutation d of [0, 1, 2, 3]:
   +4d        [4] + d
s           concatenate

1
vy3yJ바이트 절약
Emigna

1
Pyth 코드에서 m+d-> +R는 바이트를 저장합니다.
isaacg

8
접근 방식과 프로그래밍 언어가 모두 다르기 때문에 이것을 두 개의 분리 된 답변으로 게시하는 것이 낫지 않습니까?
Kevin Cruijssen

@KevinCruijssen Meh, 나머지 요소와 4 개의 요소 순열을 결합하는 주제에 대한 변형입니다. 내 05AB1E 답변은 실제로 다른 버전의 자체와 마찬가지로 Pyth 답변과 거의 공통점이 있습니다. 그래서 나는 언어를 바꾸는 것보다 두 배나 많은 공의를 요구하고 싶지 않았습니다.
Anders Kaseorg

3

Brachylog , 점수 = 2907 (19 바이트 × 153)

4⟦pᶠP∧~l.g;Pz{sᵈ}ᵐ∧

아무것도 볼 수 있지만 변경하면 너무 느린 42: 당신이 그것을 테스트 할 수 있습니다 온라인으로보십시오!

이것은 다음과 같이 가장 짧은 초 치환을 찾습니다.

4⟦                   The range [0,1,2,3,4]
  pᶠP                P is the list of all permutations of this range
     ∧
      ~l.            Try increasing lengths for the output
         g;Pz        Zip the output with P
             {sᵈ}ᵐ   For each permutation, it must be a substring of the output
                  ∧

2

자바 스크립트 (ES6), 26975 (325 * 83 바이트)

이 스코어링 시스템을 사용하면 '최적의 초 돌연변이 하드 코딩''짧은 내장을 사용하여 모든 순열을 연결하는 것'사이 에 최소한의 비속어가 필요합니다.

어쨌든 시도가 있습니다.

f=(a=[0,1,2,3,4],p=r='')=>a.map((v,i)=>f(a.filter(_=>i--),p+v))|~r.search(p)?r:r+=p

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

325 바이트의 문자열을 생성합니다.

012340124301324013420142301432021340214302314023410241302431031240314203214032410341203421
041230413204213042310431204321102341024310324103421042310432201342014320314203412041320431
210342104330124301423021430241304123042131024310423201432041321044012340132402134023140312
4032141023410324201342031421034301243021431024320143210

당신은 유효한 포인트를 가지고, 나는 점수 시스템에 대해 약간 걱정했다 말할 것입니다. 앞으로는 다양한 방법을 고려할 수있는 방법으로보다 사려 깊고 점수를 매길 수 있도록 노력하겠습니다. : D
Isaac C

23 바이트 미만의 상용구에 대해 문자열을 반환 할 수 있으면 하드 코딩이이 솔루션보다 우수합니다 ( 26975/153-153>23)
Sanchises

@Sanchises 문자열에는 5 바이트 상용구 , BigInt에는 4 바이트가 필요합니다 .
Arnauld

@Sanchises 문자열을 약간 압축 할 수 있습니다 : 온라인으로 사용해보십시오! (또는 출력 하는 기본 n접미사를 계산하지 않으면 더 적음 console.log)
Neil


2

05AB1E , 점수 : 5355 2160 (216 * 10 바이트 )

3ÝœJε4yJ}J

@AndersKaseorg 포트 Pyth 답변 , 따라서 그를 찬성 해야합니다!

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

설명:

3Ý           # Push a list in the range [0,3]: [0,1,2,3]
  œ          # Get all possible permutations of this list
   J         # Join each inner list together to a single string
    ε        # Map each string `y` to:
             #  (Push string `y` implicitly)
     4       #  Push 4
      y      #  Push string `y` again
       J     #  Join all three together
        }J   # After the map: Join all strings together to a single string
             # (and output it implicitly as result)

2

옥타브 , 27 x 442 = 11934

'01234'(perms(1:5)'(4:445))

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

따라서 순 열적으로 모든 순열을 생성 한 다음 여전히 유효한 수퍼 순열 인 가장 짧은 하위 문자열로 자르는 것이 가장 짧은 수퍼 순열을 생성하는 것보다 짧습니다. 슬프게도 이번에는 점수가 회문이 아닙니다.

옥타브 , 97 x 153 = 14841

a=sym(9);while i<120
i=0;a+=1;q='01234';for t=q(perms(1:5))'
i+=any(regexp(char(a),t'));end
end
a

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

몇 가지 사항으로 업데이트 된 항목

  • a++ 기호 숫자에는 구현되지 않습니다.
  • contains()Octave에서는 구현되지 않습니다. 로 대체되었습니다 any(regexp()).
  • 온라인 링크에서, 나는 수동으로 a153- 길이 슈퍼 퍼뮤 테이션에 매우 가까이 들어갔다 . 이를 통해 솔루션을 확인할 수 있습니다.

2

CJam (6 * 240 = 1440)

5e!72>

온라인 데모 , 유효성 검사 (각 순열을 0..4찾을 수있는 색인을 출력합니다. 원래 프로그램은 stdout에 적합한 출력을 제공하지만 스택에 배치하는 것은 직접 사용할 수 없기 때문에 출력을 평탄화해야합니다).

CJam 의 순열 순서는 다르지만 다른 부분 문자열을 제공하지만 Sanchises 에서 도난 된 접근법 .


CJam (22 * 207 = 4554)

0a4{)W@+W+1$)ew\a*W-}/

온라인 데모 , 검증 .

해부

이것은 간단한 재귀 구조를 사용합니다.

0a       e# Start with a superpermutation of one element, [0]
4{       e# for x = 0 to 3:
  )      e#   increment it: n = x+1
  W@+W+  e#   wrap the smaller superpermutation in [-1 ... -1]
  1$)ew  e#   split into chunks of length n+1
  \a*    e#   insert an n between each chunk
  W-     e#   remove the -1s from the ends
}/


1

, 29 바이트, 출력 길이 153, 점수 4437

”)⊞⧴�r3⁼H⁴↓¦σ✳LïpWS [T↑ZωÞ”‖O

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명 : @TFeld와 마찬가지로 초 순열의 절반을 인쇄하고 미러링합니다. 다음 코드를 사용하여 초 치환을 계산했습니다.

Push(u, w);
for (u) {
    Assign(Plus(Plus(i, Length(i)), i), h);
    Assign(Ternary(i, Join(Split(w, i), h), h), w);
    Assign(Incremented(Length(i)), z);
    if (Less(z, 5)) for (z) Push(u, Slice(h, k, Plus(k, z));
}
Print(w);

이것은 Charcoal의 45 바이트 프로그램으로 번역되어 6885 점을 얻었을 것입니다.




0

Perl 6 , 7191 (153 * 47 바이트)

say first *.comb(permutations(5).all.join),0..*

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

숫자의 모든 순열을 포함하는 첫 번째 숫자는 0 4.이이 걸릴 것입니다 찾습니다 실행 시간,하지만 당신은 처음 두 순열로 테스트 할 수 있습니다 00,1


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.