7- 세그먼트 차이


26

나는 여기에있는 대부분의 사람들이 숫자에 대한 7 세그먼트 디스플레이가 무엇인지 알고 있다고 생각합니다.

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

자리 사이 의 7- 세그먼트 차이 (7SD) 를 서로 전환하기 위해 토글해야하는 세그먼트 수로 정의 할 수 있습니다. 예를 들어 사이의 7SD 는 5 이고 (세 개의 수평 세그먼트와 아래쪽 두 개의 수직 세그먼트는 전환해야 함) 6과 8 사이의 7SD는 1 입니다.12

또한 두 숫자 사이의 7SD를 해당 숫자 사이의 7SD의 합으로 정의 할 수 있습니다 . 한 숫자가 다른 숫자보다 길면 숫자가 오른쪽으로 정렬되었다고 가정하고 더 큰 숫자의 가장 중요한 숫자를 표시하는 데 필요한 세그먼트 수를 추가합니다. 예를 들어 다음 12345과 사이의 7SD를 고려하십시오 549.

  x:  1 2 3 4 5
  y:      5 4 9
7SD:  2+5+2+0+1 = 10

당신의 임무는 것입니다 사이에 7SD을 계산 NN + 1 , 주어진 N .

편의를 위해 다음은 개별 숫자 사이의 7SD 전체 테이블입니다. 행 _은 빈 위치를 나타냅니다.

   _ 0 1 2 3 4 5 6 7 8 9

_  0 6 2 5 5 4 5 6 3 7 6
0  6 0 4 3 3 4 3 2 3 1 2
1  2 4 0 5 3 2 5 6 1 5 4
2  5 3 5 0 2 5 4 3 4 2 3
3  5 3 3 2 0 3 2 3 2 2 1
4  4 4 2 5 3 0 3 4 3 3 2
5  5 3 5 4 2 3 0 1 4 2 1
6  6 2 6 3 3 4 1 0 5 1 2
7  3 3 1 4 2 3 4 5 0 4 3
8  7 1 5 2 2 3 2 1 4 0 1
9  6 2 4 3 1 2 1 2 3 1 0

입력

  • 입력은 단일 양의 정수 n입니다.
  • STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을받는 프로그램 또는 함수를 작성할 수 있습니다.
  • 입력 값이 최대 127보다 작은 값을 지원하는 한, 언어의 표준 정수 유형으로 표시 될 수있는 최대 숫자보다 하나 더 작다고 가정 할 수 있습니다.

산출

  • n와 사이의 7SD 단일 정수를 인쇄해야합니다 n+1.
  • STDOUT (또는 가장 가까운 대안), 함수 반환 값 또는 함수 (out) 인수를 통해 출력 할 수 있습니다.

채점

표준 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

테스트 사례

모호한 이유로이 시퀀스는 아직 OEIS에 없지만 A123587 과 밀접한 관련이 있습니다. 다음은 처음 100 개의 숫자입니다 (로 시작 n = 1, 2, 3, ...).

5, 2, 3, 3, 1, 5, 4, 1, 4, 4, 5, 2, 3, 3, 1, 5, 4, 1, 7, 4, 5, 2, 3, 3, 1, 
5, 4, 1, 4, 4, 5, 2, 3, 3, 1, 5, 4, 1, 5, 4, 5, 2, 3, 3, 1, 5, 4, 1, 5, 4, 
5, 2, 3, 3, 1, 5, 4, 1, 3, 4, 5, 2, 3, 3, 1, 5, 4, 1, 7, 4, 5, 2, 3, 3, 1, 
5, 4, 1, 6, 4, 5, 2, 3, 3, 1, 5, 4, 1, 3, 4, 5, 2, 3, 3, 1, 5, 4, 1, 6, 4

7SD가 9보다 큰 첫 번째 입력은 199911을 산출하는 것입니다. 다른 더 큰 예는 다음과 같습니다.

n          7SD
1999        11
12345        1
999999      14
5699999     15
8765210248   1

답변:


8

젤리 , 25 22 21 20 바이트

‘DṁDḟ"DFị9979482ḃ5¤S

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

배경

먼저 입력 n을 증가시키고 변경되지 않은 n + 1 의 모든 숫자를 버립니다 .

예를 들어, n5699999 인 경우 다음을 얻습니다.

n     : 5700000
n + 1 : 5699999
Result:  700000

이 결과의 모든 자릿수에는 고정 된 수의 세그먼트가있어 전환해야합니다. 토글 목록을 bijective base 5 로 변환하여 일부 바이트를 절약 할 수 있습니다.

digit:   1 2 3 4 5 6 7 8 9 0
toggles: 4 5 2 3 3 1 5 4 1 2

출력은 단순히 개별 토글의 합입니다.

이것은 대부분의 n 값에서 작동 하지만 n + 1n 보다 많은 자릿수를 갖는 경우 특별한주의가 필요합니다 . 이 경우 모든 자릿수는 9 여야합니다 . n + 1 에서 후행 0 을 잘라내어이 문제를 해결합니다 .

예를 들어, n999999 인 경우 다음을 얻습니다.

n     :  999999
n + 1 : 1000000
Result: 100000

이것은 선행 14 개의 토글 ( 01 사이의 거리)로 평가되는 반면 실제 토글의 양은 2 ( 01 사이의 거리 )이고 하나의 후행 0을 억제 하면 합계에서 2 개의 토글이 제거 되기 때문입니다.

작동 원리

‘DṁDḟ"DFị9979482ḃ5¤S  Main link. Argument: n

‘                     Compute n+1.
 D                    Convert n+1 from integer to base 10.
   D                  Convert n from integer to base 10.
  ṁ                   Mold the left result as the right result.
                      This chops of a 0 if n+1 has more digits than n.
    ḟ"D               Vectorized filter-false with the base 10 digits of n.
                      This removes the digits from n+1 that are identical to
                      the corresponding digits of n.
       F              Flatten the resulting list of lists.
         9979482ḃ5¤   Convert 9979482 to bijective base 5.
                      This yields [4, 5, 2, 3, 3, 1, 5, 4, 1, 2].
        ị             Retrieve the digits at the right that correspond to the
                      indices at the left.
                   S  Compute the sum of the results.

10

자바 스크립트 (ES6), 46 40 바이트

f=n=>n?+"452331541"[n%10]||f(n/10|0)+2:2

대체 포 뮬레이션, 46 40 바이트 :

f=n=>n?26523308>>n%10*3&7||f(n/10|0)+2:2

편집 : @xsot 덕분에 6 바이트가 절약되었습니다.


ES6의 논리 또는 연산자가 파이썬의 논리 또는 연산자와 같이 작동하면 두 번째 코드를 더 줄일 수 있습니다. 예를 들어 내 제출을 참조하십시오.
xsot

@xsot 사실 둘 다 단축 할 수 있습니다! 나는 그것이 4 바이트이기 때문에 제로 특별한 경우를 변경하는 데 도움이되지 않는다고 생각합니다.
Neil

와우, 나는 첫 번째 작품이 놀랍습니다. 오류가 예상되었습니다.
xsot

@xsot 자바 스크립트는 단순히 오류가 아닙니다. Javascript가 태어난 10 일 동안 가장 올바른 접근 방식처럼 보였습니다. . 이후 버전에서는 좀 더 엄격한 동작을 선택할 수 있지만 왜 여기에있는 사람일까요? 논리 연산자의 단락 동작은 매우 일반적이지만 PHP는 항상 부울을 반환하여 잘못된 일을합니다.
John Dvorak

@JanDvorak 사실, 문자열의 길이보다 큰 문자열의 인덱스에 액세스 할 수 있다는 사실에 놀랐습니다.
xsot

10

파이썬, 50 48 바이트

f=lambda n:26523308-0**n*2>>n%10*3&7or f(n/10)+2

설명

이 기능은 숫자의 최하위 자릿수에서 작동 n하며 첫 번째 9자릿수가 아닌 숫자 까지 1 씩 증가 할 때 숫자의 7SD를 합산합니다 .

26523308숫자에 대한 매핑을 인코딩하는 비트 마스크입니다 0-8. 경우 n=0때만 발생하는 n단계는 단지 9s의 해답은 두으로 해제 될 것이다. 이것은 식으로 보상됩니다 0**n*2. digit 9에 대해 비트 마스크는 0으로 평가되어 27SD에 추가 하는 동안 재귀 호출을 트리거합니다 .


이것이 어떻게 변환에 대한 설명을 할 수 있습니까? 나는 영리함을 +1하지만 영리하게 길을 잃었습니다.
CAD97

8

05AB1E , 31 30 28 27 26 바이트

암호:

9Ü©T%•2X›ùì•sè¹g®g-·¹Ú9Q·O

설명 ( 구식 ) :

9Ü                              # Trim off trailing 9's
  ©                             # Copy this into the register
   T%                           # Get the last non-9 digit
     žh                         # Short for 0123456789
       •2X›ù앧                 # Compressed version of 4523315412
               ‡                # Transliterate

다음을 9가 아닌 마지막 숫자로 변경합니다.

0 -> 4
1 -> 5
2 -> 2
3 -> 3
4 -> 3
5 -> 1
6 -> 5
7 -> 4
8 -> 1
9 -> 2

특별한 경우 :

                ¹g              # Get the length of the input
                  ®g            # Get the length of the input with all trailing 9 gone
                    -           # Substract, giving the number of 9's at the end of 
                                  the input
                     2*         # Multiply by two
                       O        # Sum everything up
                        ¹Ú      # Uniquify the input
                          9Qi   # If this is equal to 9 (only 9's in the input)
                             Ì  #   Increment by 2 (_ -> 1)

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오! .

28 바이트 대안 : D[¤©•2X›ùì•sès®9Ê#¨]\rÚ9Q4*O.



3

MATL , 61 39 36 바이트

tQvV15\'3dAsMh818RG5'6Y27WZaw)Z}Z~Bz

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

설명

tQv            % Implicit input. Duplicate, add 1, concatenate vertically
V              % Convert to 2D char array: each number in a row, possibly left-padded 
               % with a space
15\            % Modulo 15. With modular indexing this corresponds to the order
               % '9', ' ', '0', '1', ..., '8'
'3dAsMh818RG5' % This string encodes active segments for each of the 11 chars
6Y2            % Source alphabet printable ASCII chars (predefined literal)
7W             % Target alphabet: [0 1 ... 127]
Za             % Base conversion: decode string into vector of 11 numbers, where each
               % number from 0 to 127 encodes the 7-segment representation of a digit,
               % in the order '9', ' ', '0', '1', ..., '8'
w              % Swap top two elements in stack
)              % Use as index. Gives 2-row array, where each column is a digit 
Z}             % Split into the two rows
Z~             % Bitwise XOR, elementwise
B              % Convert to binary. Each number gives a row
z              % Number of nonzero elements. Implicitly display

3

줄리아, 44 바이트

!x=x<1?2:(t=x%10÷1)<9?3045058÷6^t%6:2+!.1x

여기에서 시도하십시오.

데니스는 바이트를 저장했습니다!


1
호기심에서 숫자를 사용하는 것이 어떻습니까?
Conor O'Brien

Julia TIO가 있다고 믿을 수 없습니다. 웰프, 그때 줄리아를 배울 시간입니다 ...
Mama Fun Roll

3

파이썬, 71 66 바이트

xsot로 48 바이트 . 더 많은 마법 수학!

f=lambda n:(2+f(n/10)if n%10==9else 26523308>>n%10*3&7)if n else 2

이데온에서 보자

때문에 이전에 파이썬 대답은 작동 및 최적 거리가 멀다하지 않습니다. 이전 ES6 버전 의 간단한 포트 . 이제 비트 트위들 링 (ES6 대체 공식)을 사용하여 캐스트를 잘라내십시오!

+1 바이트에 floordiv를 명시 적으로 사용하여 Python 3에서 작동하도록 만들 수 있습니다.


당신은 후에 공간을 꺼낼 수 있습니다9
Maltysen

@ Maltysen은 분명히 맞습니다. e예를 들어, 숫자 다음에 유효한 문자 이므로 오류 가 될 것이라고 생각했습니다 9e9.
CAD97 2016 년

이것은 내 Java 답변 보다 깁니다 ! 우리는 이것을 어떻게 해결할 수 있습니까? 에서 n%10==9를 비교할 n%10<9때이 순서대로 공백이 필요하지 않은 경우로 저장하지 않습니다.
CAD97

그리고 xsot가 훨씬 짧은 Python 버전을 만들었습니다. 잘 했어!
CAD97 2016 년

2

줄프, 32 바이트

Ώ?H?<γ%Ht9P."452331541"γ+2Ώc/Ht2

여기 사용해보십시오!

설명

이것은 닐의 대답을 번역 한 것입니다.

Ώ?H?<γ%Ht9P."452331541"γ+2Ώc/Ht2
Ώ                                 define a function Ώ of H
 ?H                            2  (when H is zero, return is 2)
      %Ht                         H mod 10
     γ                            γ = ^
   ?<    9                        is it less than 9?
                                  if so:
           ."452331541"γ           get the γth element of that string
          P                        as a number
                                  else
                        +2         add two to
                          Ώ        Ώ over
                           c/Ht    int(H / 10)


0

J, 53 바이트

2:`((2+10$:@<.@%~[)`(6|3045058<.@%6^])@.(9>])10&|)@.*

원래 @Neil의 솔루션을 기반으로 합니다 . 그런 다음 @Lynn의 솔루션 에서 동일한 수식을 사용하여 바이트를 저장하여 개선 .

문자열을 기반으로 한 54 바이트 버전은

2:`((2+10$:@<.@%~[)`('452331541'".@{~])@.(9>])10&|)@.*

용법

   f =: 2:`((2+10$:@<.@%~[)`(6|3045058<.@%6^])@.(9>])10&|)@.*
   f 1999
11
   f 1999 12345 999999 5699999 8765210248
11 1 14 15 1

0

망막 , 34 바이트

M!`.9*$
^9
0
T`d`4523315412
.
$*
.

온라인으로 사용해보십시오!첫 번째 줄은 여러 테스트 사례를 한 번에 처리 할 수있게합니다.

설명

지금까지 대부분의 답변에서 발견 한 것처럼 9증분시 숫자 가 가장 작은 숫자 만 변경 되므로 전체 테이블을 사용할 필요가 없습니다 . 이 답변도 작동합니다.

M!`.9*$

이것은 M정규식, .9*$9끝에서 s 로만 분리 된 첫 번째 숫자 와 일치합니다 ( ) . 이 명령 !은 Retina에게 입력을이 일치 항목으로 바꾸고 7SD에 영향을 미치지 않는 모든 것을 버립니다.

^9
0

입력이 이제 9그 의미로 시작하는 경우 입력 자체 는 s 로만 구성 9되므로 7 세그먼트 디스플레이는 1어떤 비용 을 앞에 두어야합니다 2. 이를 처리하는 가장 간단한 방법 9은이 경우 선행을를로 바꾸는 것 입니다. 이는 0증분 비용이 9(to 0)이고 2증분 비용이 0(to 1) 4이므로이므로 2필요한만큼 전체 비용이 증가 합니다.

T`d`4523315412

이제 각 숫자를 증가시키기위한 비용으로 바꾸는 음역 단계가 있습니다 ( d확장하기 때문에 0123456789). 이것은 7SD 테이블의 첫 번째 하위 대각선입니다.

.
$*

이것은 각 숫자 n를의 n복사본으로 대체합니다 1. 즉, 각 숫자를 단항으로 변환하며 구분 기호가 없으므로 즉시 함께 추가합니다.

.

마지막으로 .결과에서 문자 수 (즉, 일치하는 수)를 세어 단항 합계를 다시 십진수로 변환합니다.

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