소등, 7 세그먼트 버전


14

일부 세그먼트가 켜져 있고 일부는 꺼져있는 7 세그먼트 디스플레이에서 각 숫자에 해당하는 세그먼트를 전환 한 후 모든 세그먼트가 꺼 지도록 일련의 숫자 (0-9)를 찾으십시오.

  _
  _    [3] =>     |   [1] =>    [OFF]
  _               |

숫자와 해당 세그먼트 :

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

규칙

Codegolf ⊨ 최단 참가작이 승리합니다.

입력

비어 있지 않은 세그먼트 목록은 다음과 같이 주어집니다.

  1. 일련의 숫자. 세그먼트는 위에서 아래로, 왼쪽에서 오른쪽으로 번호가 매겨집니다. 0 또는 1부터 시작합니다. 숫자를 순서대로 지정할 필요는 없습니다.

  2. 단일 7 비트 숫자 MSB / LSB가 지정되지 않았으므로 선택할 수 있습니다.

숫자 사이의 숫자가 아닌 문자는 허용되지만 지원되지는 않습니다.

예 : 번호 7: 136하거나 1010010또는0100101

산출

디스플레이에 "적용"될 일련의 숫자. 숫자 순서와 같은 어떤 방식으로도 제한되지 않습니다. 예 : 초기 상태에 대응하는 번호에 대해 1유효한 출력 될 1, 111,010

대체 출력은 10 비트 숫자입니다 (다시 말해서 MSB / LSB가 선택됩니다). 예 : 위한 1로서 입력, 출력 될 10000000000000000001.

일부 조합에는 여러 비 반복 솔루션이 있습니다 (예 : 대문자에 해당하는 세그먼트 는 및 H로만 끌 수 있습니다 .0134890258

해결책이 없으면 (가능하지 않다고 생각) 출력이 비어 있습니다.


2
더 많은 사양이 필요합니다. 각 숫자에 어떤 세그먼트가 포함되어 있습니까 (예를 들어, 9는 아래쪽 세그먼트를 포함합니까?) 모든 숫자를 그리고 각 숫자에 포함 된 세그먼트의 숫자를 표시하십시오.
레벨 리버 St

또한 어떤 형식의 입력이 허용됩니까? 세그먼트 번호는 순서대로 제공됩니까? 해결책이 없으면 어떻게해야합니까?
레벨 리버 St

"일부 조합에는 여러 가지 비 반복적 솔루션이 있습니다" 또한 솔루션의 순열은 또 다른 솔루션입니다. (같은 301에 대한 H).
Arnauld 2016 년

1
솔루션이 항상 존재한다는 증거 : 각 개별 세그먼트에 대한 솔루션을 찾기에 충분합니다. 위에서 아래로 수평 세그먼트에 대한 솔루션,있다 17, 08하고 1479. 왼쪽에서 오른쪽으로 위쪽 세로 세그먼트에 대한 솔루션은 3959입니다. 왼쪽에서 오른쪽으로 낮은 수직 세그먼트를위한 솔루션이다 562389.
Greg Martin

1
@GregMartin은 2당신이 중 하나로 교체 할 수 있기 때문에, 항상 필요하지 않다 0468, 1358또는 1369당신이 원하는 여부에 따라 0, 8또는 9당신의 대답에,하지만 거기에 제거 할 수있는 방법은 없습니다 7모두에서, 그리고 난 당신이 적어도 하나 가지고 있다고 생각 의 13.
Neil

답변:


4

젤리 , 26 25 바이트

2ṗ⁵’µ×“wØ][:koR¶{‘^/=µÐfḢ

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

입력을 7 비트 정수로 취합니다. 10 비트 정수의 이진 형식을 반환합니다.

이것은 단지 모든 무력을 강요합니다. 가능한 모든 출력을 얻으 려면를 제거 하거나 X임의의 가능한 출력을 얻으 려면를 대체하십시오 .

매직 시각화 프로그램!

작동 원리

2ṗ⁵’µ×“wØ][:koR¶{‘^/=µÐfḢ  - main link, takes one integer
2ṗ⁵’                       - generate all length-10 binary arrays
    µ                µÐf   - now we find those arrays which correspond to digit-
                              sequences which work to switch off all segments:
                              Filter (keep) those arrays which:
     ×                      - multiplied by 
      “wØ][:koR¶{‘          - [119, 18, 93, 91, 58, 107, 111, 82, 127, 123] 
                               (encoding for turned-on segments given number)
                  ^/        - reduced by XOR
                    =      - are equal to (implicit) the program's input
                        Ḣ  - output the first of these valid arrays

1
숫자 배열 ( “wØ][:koR¶z‘)에 오류가있을 수 있습니다. 숫자 9에는 하단 세그먼트가 없습니다 ( 9시각화는 작업 설명 의 숫자와 비교 ). 그렇지 않으면 시각화가 특히 좋습니다!
kyrill

1
@kyrill 고정! 목록 리터럴에서 약간의 변경이 필요했습니다.
fireflame241

2

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

n=>[65,35,55,42,48,54,110].reduce((r,v,i)=>r^=n>>i&1&&v+v,0)

이것은 다음과 같은 이유로 작동합니다.

  • 1과 7을 토글하면 상단 세그먼트 만 토글됩니다.
  • 1, 2 및 6을 전환하면 왼쪽 상단 세그먼트 만 토글됩니다.
  • 1, 2, 3, 5 및 6을 전환하면 오른쪽 상단 세그먼트 만 토글됩니다.
  • 2, 4 및 6을 전환하면 중앙 세그먼트 만 토글됩니다.
  • 5와 6을 토글하면 왼쪽 하단 세그먼트 만 토글됩니다.
  • 2, 3, 5 및 6을 전환하면 오른쪽 하단 세그먼트 만 토글됩니다.
  • 2, 3, 4, 6 및 7을 전환하면 하단 세그먼트 만 토글됩니다.

1
Arnauld에서 영감을 얻었 기 때문에 이것이 승자로 인정되는지 확실하지 않습니다. 그러나 그는 또한 당신의 의견에서 영감을 얻었습니다. 어쨌든, 좋은 대답, 둘 다!
kyrill

@kyrill 업데이트 된 답변은 Neil의 제안이기도합니다. 그의 대답이 지금까지이기는 것은 의심의 여지가 없습니다.
Arnauld 2016 년

2

자바 스크립트 (ES6) 117 107 101 86 84 바이트

Neil 덕분에 15 바이트 절약

입력을 7 비트 정수로 취합니다. 여기서 LSB는 상위 세그먼트입니다. LSB가 숫자 인 10 비트 정수를 리턴합니다 0.

f=(n,k)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?f(n,-~k):k

데모


1
재귀가 더 짧습니다 f=(n,k=1023)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?k--&&f(n,k):k. 또는 답변이 있다고 가정하면 f=(n,k=0)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?f(n,k+1):k.
Neil

1
@ 닐 감사합니다! 예, 항상 답변이 있습니다.
Arnauld

1
이 숫자를 사용하여 답을 작성하는 것이 가능로서 1-7, 당신은 제거하여 추가 8 바이트를 저장할 수 83과를 ,91,75하고 사용 k+2.
Neil

2

Mathematica, 40 바이트

BitXor@@{260,802,10,514,3,266,293}[[#]]&

(각 세그먼트에 대한 출력을 신중하게 선택하고 LSB와 MSB 간을 전환하여 골프를 더 많이 벌 수 있습니다.)

예를 들어 위치 목록으로 입력을 취하고 MSB 순서 (0, ..., 9) {2,4,5,7}로 10 비트 숫자 ( 384= 0110000000이진)를 출력하십시오 .

이 예에서는

  |_
  |_

출력은에 해당합니다 {7,8}.

설명:

매직 넘버 (하드 코딩 된 목록)는 각 세그먼트에 대해 반환되는 출력입니다. (이진수로 인코딩 됨) 숫자가 목록에 두 번 나타나면 효과가 나타나지 않는 것과 같으므로 비트 XOR이 사용됩니다. 가능한 세그먼트 값의 출력을 XOR하면됩니다.


2

젤리 , 12 바이트

ị“A#7*06n‘^/

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

이것은 무력하지 않으며 다른 솔루션보다 훨씬 짧습니다. 켜진 세그먼트 목록으로 입력을 취하고 LSB가 최상위 세그먼트 인 출력을 가져옵니다.

자릿수 이동으로 출력합니다.

작동 원리

이것은 빠를거야

ị“A#7*06n‘^/ - main link, takes input as a list of turned-on segments (eg. [1,3,6])
 “A#7*06n‘   - list literal [65,35,55,42,48,54,110] where each element is a 7-bit
                 integer, where each integer corresponds to how to turn off
                 a segment (eg. turn off the first segment with 7 and 1 =>2^7+2^1=>64)
ị            - get the elements in the list corresponding to the input indices
          ^/ - XOR reduce these elements to get a single 7-bit integer

이 알고리즘을 사용할 때 XOR- 리 듀스를 더 짧은 것 (예 : 평평한 것)으로 대체하기 위해 반복적 인 솔루션이 허용된다는 사실을 이용할 수 없습니까? 아니면 뭔가 빠졌습니까?

내가 가지고있는 코드는 이제 대략 같은 것과 같은 7 비트 정수 목록을 생성 한 1*use digit 1 + 2*use digit 2 + 4*use digit 3 ... 64*use digit 7다음 XOR을 줄임으로써 @ ais523입니다. 병합은 더 많은 문자를 사용하는 자릿수 목록에서 작동합니다.
fireflame241241
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.