디지털 시계 퍼즐 맞추기


10

새로운 숫자 나 모양을 만들기 위해 특정 수의 일치 항목을 추가, 제거 또는 이동하는 것과 관련된 일치 하는 퍼즐 이 많이 있습니다 . 이것은 디지털 시계와 같습니다.

12 시간 디지털 시계에 유효한 시간이 주어지면 시계에서 보이는 모든 숫자가 해당 숫자가되도록 가장 적은 행을 이동해야하는 숫자를 출력하십시오. 둘 이상의 숫자가 최소값이면 모두 출력하십시오. 모든 숫자를 같은 숫자, 출력 -1또는 0 이외의 잘못된 값 으로 만드는 것이 불가능한 경우 (많은 숫자를 얻습니다).

시계 숫자는 다음과 같습니다.

  |
  |
 _
 _|
|_
 _
 _|
 _|

|_|
  |
 _
|_
 _|
 _
|_
|_|
 _
  |
  |    
 _ 
|_|
|_|
 _
|_|
 _|
 _
| |
|_|

테스트 사례 :

입력: 123

시계 표시 :

       _   _
  | :  _|  _|
  | : |_   _|

산출: 4

설명 : 표시 1:23하려면 총 12 개의 선을 그려야합니다. 따라서 모든 숫자가 동일하기 위해서는 각 숫자에 4 줄이 있어야합니다. 4 행이있는 유일한 숫자는 4입니다. 따라서 대답은이어야 4합니다.

입력: 1212

시계 표시 :

     _        _
  |  _| :  |  _|
  | |_  :  | |_

산출: -1

설명 : 표시 12:12에는 14 행이 필요합니다. 14를 4로 나눈 값은 정수가 아니므로 모든 숫자가 같을 수는 없습니다.

입력: 654

시계 표시 :

 _     _  
|_  : |_  |_|
|_| :  _|   |

산출: 5

설명 : 총 행 수는 15입니다. 15를 3으로 나눈 값은 5이므로 각 숫자에는 5 개의 행이 있어야합니다. 5 개 라인을 가지고있는 유일한 자리는 2, 3하고 5. 답은 5모든 자릿수 5를 만들기 위해 2 번의 이동 만 필요하기 때문입니다. 6의 왼쪽 하단에있는 선을 4의 하단으로 옮기면됩니다.

 _     _  
|_  : |_  |_|
 _| :  _|  _|

그리고 보시다시피, 원래 4 자리였던 숫자의 오른쪽 상단에있는 선을 움직이면 5:55됩니다. 모든 숫자를 a로 만들려면 2또는 3두 번 이상 이동해야합니다.

입력: 609

시계 표시 :

 _     _   _
|_  : | | |_|
|_| : |_|  _|

출력 : 609( 6,0,9또는 확인 [6,0,9]).

설명 : 6, 09은 6 행을 갖는 유일한 숫자입니다. 따라서 이들은 유일한 솔루션입니다. 이 숫자를 유일한 숫자로 만들기 위해서는 두 번의 움직임이 필요하다는 것을 알기 어렵지 않습니다. 따라서 세 자리를 모두 출력합니다.

노트:

  • 입력 시간이 유효해야하지만 출력 시간이 맞지 않습니다 (예 : 999출력이 정상 임).
  • 나는 입력에 매우 유연합니다. 선행 0이 필요할 수 있습니다. 소수점이있는 숫자를 사용할 수 있습니다. 문자열을 사용할 수 있습니다. 배열을 사용할 수 있습니다. 모든 숫자에 대한 매개 변수를 가질 수 있습니다.

답변:


1

줄리아 160 157 154

x->(c=count_ones;l=[119;36;93;109;46;107;123;37;127;111];m=l[x+1];n=map(a->c(a)==mean(map(c,m))?sum(map(b->c(a$b),m)):1/0,l);find(n.==minimum(n).!=1/0)-1)

이것은 람다 함수입니다. 변수에 지정하여 호출하십시오. 0-9임의의 길이 범위의 정수 벡터를 허용하고 결과의 빈 벡터를 반환합니다.

테스트 사례

julia> clock = x->(c=co...        # assign function to variable
(anonymous function)

julia> clock([1 2 3])
1-element Array{Int64,1}:
 4

julia> clock([1 2 1 2])
0-element Array{Int64,1}

julia> clock([6 5 4])
1-element Array{Int64,1}:
 5

clock([6 0 9])
3-element Array{Int64,1}:
 0
 6
 9

설명

7 개의 세그먼트를 열거하고 비트 벡터로 나타냅니다.

+---+                     +-0-+
|   |      Enumerate      1   2
+---+   >  the seven  >   +-3-+
|   |      segments       4   5
+---+                     +-6-+

예 : 1 (세그먼트 2 + 5 사용)이 36(비트 2 + 5 세트)가됩니다.
다음은 숫자에 대한 표현입니다 0-9.

l=[119;36;93;109;46;107;123;37;127;111];
m=l[x+1];

숫자를 인덱스로 사용하여 비트 벡터 표현을 얻을 수 있습니다. +1julia의 1 기반 인덱싱 때문에

이 함수 c=count_ones;는 1 비트 수를 정수로 계산합니다. 더 자주 필요하므로 별칭을 할당합니다.

다소 풀리지 않은 전체 프로그램 :

x->(
  c=count_ones;
  l=[119;36;93;109;46;107;123;37;127;111];
  m=l[x+1];
  n=map(a->c(a)==mean(map(c,m))?sum(map(b->c(a$b),m)):1/0,l);
  find(n.==minimum(n).!=1/0)-1
)

이제 마지막 두 줄에 대해 자세히 설명합니다.

mean(map(c,m)) 입력 숫자 당 평균 라인 수를 계산합니다.

n=map(a->...,l) 모든 숫자의 벡터 표현을 반복합니다.

현재 자릿수의 줄 수가 a입력의 평균 줄 수와 같지 않으면를 반환 inf합니다.

c(a)==mean(map(c,m))?...:1/0

그렇지 않은 경우 현재와 ​​모든 입력 숫자 사이의 해밍 거리 의 합을 반환하십시오 .

sum(map(b->c(a$b),m))

이제 모든 입력 자릿수를 해당 숫자 로 변환 하기 위해 수행해야하는 총 추가 / 삭제 수를 제공 하는 숫자 를 나타내는 n길이 의 벡터 가 있습니다 .100-9inf

find(n.==minimum(n).!=1/0)-1

마지막으로 아닌 모든 최소의 위치 (0부터 시작)를 출력하십시오 inf.

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