성냥개비 퍼즐 해결


17

수수께끼 SE에는 수학이 성냥개비 로 쓰여지는 "성냥개비 문제" 가 있으며, 특정 속성을 얻기 위해 특정 숫자를 움직일 수 있습니다.

이 질문에서는 7- 세그먼트 디스플레이 형식으로 표현 된 정수만 고려할 것입니다. 해당 형식의 모든 10 자리 숫자는 다음과 같습니다.

 __          __   __          __    __    __    __    __
|  |     |   __|  __|  |__|  |__   |__      |  |__|  |__|
|__|     |  |__   __|     |   __|  |__|     |  |__|   __|    

디스플레이의 각 세그먼트는 하나의 "매치 스틱"으로 나머지 번호와 독립적으로 이동할 수 있습니다. 성냥개비는 불가분의 관계이며 파괴 할 수 없으며 어떤 수단으로도 파괴하거나 제거 할 수 없습니다.

일반적인 퍼즐은 10 진법에 주어진 숫자를 가지고 주어진 횟수만큼 움직일 수 있도록하는 것입니다. 이동은 점유 된 슬롯에서 다른 비 사용 슬롯으로의 성냥개비의 움직임으로 간주됩니다. 당신은 숫자의 양쪽에 새로운 숫자를 만들 수 있습니다. 예를 들어 0은 77으로 움직일 수 있습니다.

 __      __  __      __   __      __   __
|  |    |  |        |  |    |       |    |
|__| ,   __|     ,     |      ,     |    |

그러나 한 슬롯을 2로 만들거나 기존 슬롯 사이에 새 슬롯을 만들 수 없습니다 (예 : 숫자 중간에 4를 11로 바꾸거나 기존 슬롯 사이에 새 숫자 삽입). 각 움직임은 적절한 숫자를 만들 필요는 없지만 기본 10 7 세그먼트 디스플레이에서 최종 결과는 적절한 숫자 여야합니다. 원하지 않으면 모든 움직임을 사용할 필요는 없습니다. 이 수수께끼에 달리하는 것은 [태그 : 가까운 끝난 질문] 당신이 하지 않을 수 있습니다 귀하의 답변에 어떤 사업자 (곱하기, 지수 등) 또는 수학 상수 (PI, 그레이엄의 번호 등)를 사용합니다.

직무

숫자와 숫자의 움직임을 입력으로 받아 원래 숫자에서 그 숫자만큼 많은 동작을 수행 할 수있는 가장 큰 숫자를 반환하는 프로그램이나 함수를 작성하십시오.

이것은 질문이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.

테스트 사례

n, moves -> max
0, 1     -> 9
0, 3     -> 77
0, 4     -> 111
8, 3     -> 74
220, 1   -> 320
220, 2   -> 520
220, 3   -> 7227
220, 4   -> 22111
220, 5   -> 32111
747, 1   -> 747
747, 2   -> 7171
747, 3   -> 7711

관련


5
나는 ... 어제 늦은 밤에 다양한 성냥개비 숫자 사이의
레 벤슈 테인

1
중간에 형성된 빈 슬롯을 마지막에 무시할 수 있습니까? 예 :919, 2 -> 991
DanTheMan


밀 마법사, 어떤 그리드가 사용되고 있습니까?
tuskiomi

@tuskiomi "그러나 당신은 하나의 슬롯을 2로 만들거나 기존 슬롯 사이에 새로운 슬롯을 만들 수 없습니다"
Post Rock Garf Hunter

답변:


7

자바 스크립트 (ES6), 297 286 279 267 바이트

currying syntax에서 입력을받습니다 (s)(k). 여기서 s 는 숫자 문자 배열이고 k 는 이동 횟수 (정수)입니다.

s=>k=>(B=(n,b=0)=>n?B(n^n&-n,b+1):b,b=[...p='u"[k,iy#}m'].map(c=>c.charCodeAt()+2),r=[],g=(n,d='')=>n?n>0&&b.map((v,i)=>g(n-B(v),d+i)):r.push(d))(s.reduce((s,c)=>s+B(b[c]),M=0))&&b.map((_,j)=>r.map(n=>M=[...n+p].reduce((t,d,i)=>t+B(b[d]^b[s[i-j]]),0)>k*2|+n<M?M:n))|M

테스트 사례


어떻게?

형상 데이터 및 도우미 기능

  • 배열 b 는 숫자의 모양을 7 비트 정수로 설명합니다. 여기서 각 비트는 세그먼트입니다.

    7 세그먼트

    예를 들어, "7"의 모양은 0b0100101 = 37입니다.

  • 도우미 함수 B () 는 주어진 숫자의 이진 표현에서 1의 숫자를 반환합니다.

    B = (n, b = 0) => n ? B(n ^ n & -n, b + 1) : b

1 단계

먼저 입력 번호에 사용 된 성냥개비 수를 계산합니다.

s.reduce((s, c) => s + B(b[c]), 0)

2 단계

이 값을 재귀 함수 g () 로 전달하면 목록 r 에 정확히이 수의 성냥개비로 만들 수있는 모든 숫자가 채워집니다 .

g = (n, d = '') =>
  n ?
    n > 0 &&
    b.map((v, i) => g(n - B(v), d + i))
  :
    r.push(d)

예를 들어, g (5)r에 로드 [ '17', '2', '3', '5', '71' ]됩니다 .

3 단계

이제 허용 된 이동 횟수 k 내에서 입력 번호에서 실제로 얻을 수 있는 r 에서 가장 높은 수 M 을 선택해야합니다 .

각 수 있기 때문에 NR의 용도를 정확하게 입력 수만큼 성냥개비로 S , 움직임의 횟수는 변환 요구 N 동일 그 자리 각 세그먼트 사이의 차이의 수.

두 자릿수 xy 사이의 세그먼트 차이 수는 b [x] XOR b [y] 의 이진 표현에서 1의 수로 제공됩니다 .

마지막으로 s 의 첫 번째 숫자 가 반드시 n 의 첫 번째 숫자에 매핑 될 필요는 없기 때문에 가능한 몇 가지 숫자 정렬을 시도해야합니다 . 숫자들 사이의 이동 은 코드에서 변수 j 에 의해 주어진다 .


1

매스 매 티카, 188 197 200 203 170 174 바이트

참고 : 코드는 여전히 버그가 있습니다. 작업 중입니다.

버그 +30 바이트

(p=PadLeft;q=IntegerDigits;g=Join@@(#~q~2~p~7&/@ToCharacterCode["w$]m.k{% o"][[1+q@#]])&;h=(v=g@#2~#~96-g@i~#~96;Tr@v==0&&Tr@Abs@v<=2#3)&;For[i=10^Tr@g@#,!h[p,##]&&!h[PadRight,##],--i];i)&

문자 사이 %o해야 0x7F하지만, SE는 그것을 허용하지 않습니다. pastebin 링크 를 클릭 하여 원래 코드를 복사 할 수 있습니다.

6 ~ 7 개 이상의 스틱이 있으면 코드에 많은 시간이 걸립니다. (시작 값을 i더 작은 숫자로 수정하여 테스트 할 수 있음)

설명

g를 위해 와 같이 숫자를 스틱 표현 목록 ( 여기 에 따라)으로 변환하는 도우미 함수 {1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1}입니다 220.

h 두 숫자 사이의 왼쪽 패딩과 오른쪽 패딩을 처리하는 도우미 함수입니다.

f반복에서 10^Tr@g@#(상한) 내지 1그 스틱 표현의 동일한 양을 갖는 정수 검색 1 -> 00 -> 1원래 번호와 비교하고, 수량이 두번째 인수보다 작거나 같다.


이기는 답변이 다른 답변보다 점수가 낮은 것을 본 적이 없기 때문에 +1을주었습니다. 온라인 테스트 옵션이 없기 때문이라고 생각합니다. Mathematica를 가진 사람들이 와서 그것을 테스트하고 잘 작동하는지 확인할 수 있습니다. 또는 가능하면 누군가 옥타브로 변환 할 수 있습니다.
geokavel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.