7 세그먼트 디스플레이 디코딩


17

당신은 아마 모두 알고 7 세그먼트 디스플레이 에서 다른 것들 모든 숫자들 사이에서 표시 할 수 있습니다 :09

7 세그먼트 디스플레이 (wikipedia.org)

도전

우리는 세그먼트 만 고려합니다 . 당신의 임무는 어떤 세그먼트가 켜져 있는지 주어진 한 자리를 해독하는 것입니다.

이것은 8 비트 정수로 인코딩 될 수 있습니다. 여기에는 이진수 표현과 해당 리틀 엔디안 및 빅 엔디안 값이있는 각 숫자 표가 있습니다.

숫자.ABCDEFG리틀 엔디안빅 엔디안0011111101260x7E1260x7E100110000480x30120x0C2011011011090x6D1820xB6011110011210x791580x9E400110011510x332040xCC501011011910x5B2180xDA601011111950x5F2500xFA7011100001120x70140x0E8011111111270x7F2540xFE9011110111230x7B2220xDE

규칙 및 I / O

  • 입력은
    • 단일 정수 (두 개의 주어진 순서 중 하나 위의 표에서와 같이)
    • 비트리스트 / 배열 / ..
    • 문자로 구성된 문자열 ABCDEFG(예를 들어ABC 인코딩 하면 정렬 된 것으로 가정 할 수 있음 ), 대소 문자를 선택하십시오 (대소 문자를 구분하지 않음)7
  • 출력은 인코딩하는 숫자입니다.
  • 유효하지 않은 입력이 없다고 가정 할 수 있습니다 (유효하지 않은 경우 해당 숫자가 없음).

테스트

이 과제는 여러 가지 표현을 허용하므로 표를 참조하십시오.



지정된 비트 순서 또는 표시된 두 순서로 정수 (또는 배열)를 사용할 수 있습니까?
Jonathan Allan

@JonathanAllan : 나는 이미 보여준 것만 명확히 할 것이다.
ბიმო

헛소리, 모든 입력 유형을 다룰 필요는 없습니까? 단 하나? Whoops ...
Magic Octopus Urn

@MagicOctopusUrn : 그렇습니다 실제로 :)
ბიმო

답변:




7

Wolfram Language (Mathematica) , 41 바이트

9[,6,0,8,2,3,1,7,5,4][[#~Mod~41~Mod~11]]&

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

리틀 엔디안 열의 정수를 입력으로 사용합니다. 구문 경고를 무시하십시오.

입력 X의 경우 먼저 X mod 41을 가져온 다음 결과 mod 11을 사용합니다. 결과는 고유 한 mod 11이므로 테이블에서 결과를 추출 할 수 있습니다. 예를 들어, 126 mod 41 mod 11은 3이므로 위치 3을 0으로 설정하면 126의 입력에 대한 정답을 얻습니다.

테이블은 9[,6,0,8,2,3,1,7,5,4]입니다. 파트 0은 헤드입니다 9. Part 1은 누락되었으므로 Null바이트를 절약 할 수 있습니다. Part 1을 취할 필요는 없습니다. 그런 다음 평소와 같이 part 2는 6, part 3은 0등입니다.


Jonathan Allan의 대답 은 우리에게 1[4,9,8,6,2,0,5,3,7][[384~Mod~#~Mod~13]]&. 이것은 더 짧지는 않지만 구문 경고를 피합니다!


Wolfram Language (Mathematica) , 27 25 바이트

Mod[Hash[")dD}"#]+2,11]&

(여기에 보이지 않는 문자가 있습니다. 죄송합니다. 아래 링크를 클릭하면 표시됩니다.)

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

이것은 모든 문자열이 내부에 들어가 Hash도록 강제하는 것 입니다. 해시가 올바른 값 mod 11을 갖도록합니다.


Mathematica를 모르는 사람을 위해이 답변을 조금 설명해 주시겠습니까?
jrook

누구나 읽을 수 있다고 생각했지만 설명으로 편집하겠습니다.
Misha Lavrov

축하합니다. 41 바이트 솔루션으로 Mathematica 압축기가 고장났습니다.
lirtosiast



4

자바 (JDK) , 32 바이트

n->"99608231754".charAt(n%41%11)

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

크레딧


Misha Lavrov의 방법은 32를 만듭니다 .
Jonathan Allan

감사합니다, @JonathanAllan! 매우 감사!
Olivier Grégoire


3

공백 , 152 바이트

의무적 인 "S 's, T 's 및 L' s는 실제로 존재하지 않으며 단지 명령의 가시적 인 표현 일뿐입니다."

S S S T	S S L
S S S T	S T	L
S S S T	T	T	L
S S S T	L
S S S T	T	L
S S S T	S L
S S S T	S S S L
S S S L
S S S T	T	S L
S S S L
S S S T	S S T	L
S S S L
S L
S T	L
T	T	T	T	T	S S S T	S T	S S T	L
T	S T	T	S S S T	S T	T	L
T	S T	T	L
S S L
S L
S L
T	S S L
S T	L
S T	L
S S S T	L
T	S S T	L
S L
L
L
S S S L
S L
L
T	L
S T	

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

오류로 끝납니다.

동등한 어셈블리 유사 구문 :

	push 4
	push 5
	push 7
	push 1
	push 3
	push 2
	push 8
	push 0
	push 6
	push 0
	push 9
	push 0
	dup
	readi
	retrieve
	push 41
	mod
	push 11
	mod
slideLoop:
	dup
	jz .slideLoop
	slide 1
	push 1
	sub
	jmp slideLoop
.slideLoop:
	drop
	printi

3 개의 후행 줄 바꿈을 제거하여 3 바이트를 절약 할 수 있습니다. STDERR에서 오류가 발생하지만 프로그램은 여전히 ​​작동 하며 meta-rules에서 허용됩니다 .
Kevin Cruijssen

3

브레인 퍽 , 474 176 154 151 149 137 바이트

의 입력 문자열 소요 팔을 0 하고 1처음 포함 0소수점에 대한합니다.

(포스트에서 표의 두 번째 열에서와 같이)

0에서 9까지의 숫자를 출력합니다.

,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]

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

연산

특정 세그먼트의 상태를 관찰하여 가능한 숫자 세트를 더 작은 서브 세트로 분할 할 수 있습니다. 아래는 내 코드에서 사용되는 정적 이진 검색 트리입니다. 왼쪽 서브 트리는 세그먼트 ON 상태에 해당하고 오른쪽은 세그먼트 OFF 상태에 해당합니다.

                                         0,1,2,3,4,5,6,7,8,9
                                                  |    
                                         /-------[A]-------------------------\
                                 0,2,3,5,6,7,8,9                             1,4
                                        |                                     |
                         /-------------[B]----------------\             /----[G]----\
                   0,2,3,7,8,9                            5,6          4             1   
                        |                                  |
              /--------[E]--------\                  /----[E]----\    
            0,2,8                3,7,9              6             5
              |                    |
        /----[F]----\        /----[F]----\
      0,8            2      9            3,7   
       |                                  |
 /----[G]----\                      /----[G]----\
8             0                    3             7

골프에 유용한 몇 가지 관찰

  1. 비트 C와 D는 중복되어 무시할 수 있습니다.
  2. 선행 제로 (소수점 비트)는 값 48로 사용될 수 있으며, 입력 구문 분석 및 출력 준비에 중요합니다.
  3. 잎에 도달하고 숫자가 인쇄되면 모든 추가 조건을 건너 뛰면됩니다. 데이터 포인터를 0의 영역으로 충분히 멀리 이동하면 다시 올 수 없습니다.
  4. 호환성을 위해 일부 BF 구현은 음수 데이터 포인터를 지원하지 않기 때문에 오른쪽에 0을 사용하는 것이 좋습니다.
  5. 따라서 가장 오른쪽 셀에 출력 값을 저장하는 것이 좋으므로 오른쪽으로 0의 영역에 쉽게 도달 할 수 있습니다.
  6. 따라서 왼쪽에서 오른쪽으로 A, B, E, F, G 비트를 확인하는 것이 좋습니다. 따라서 출력 셀에 쉽게 도달 할 수 있습니다.
  7. 다른 숫자는 출력 코드를 공유 할 수 있습니다. 예를 들어 5와 6은 동일한 하위 트리에 있습니다. 우리는 +++++두 가지 가치 모두에 +대해 6 가지에 대해서만 할 수 있습니다.
  8. +출력 값에 2를 미리 더하면 명령 수를 줄일 수 있습니다. 이 경우 우리는 그것을 감소해야 0하고 1단지 다른 숫자에 대한 이점을 얻을.

2

레티 나 , 96 바이트

^(A)?(B)?C?(D|())(E|())(F)?(G)?
$.($.5*$.8*$(6*$7$2$2)$#6*$.3*$($.2*$(___$7)5*$7)$#4*$(6*$1_3*$8

온라인으로 사용해보십시오! 가장 좋은 방법은 아니지만 Retina에서 재미있는 프로그래밍 방법입니다. 설명:

^(A)?(B)?C?(D|())(E|())(F)?(G)?

흥미로운 사례를 포착하려고 시도합니다. 긍정적 인 캡처는 편지가있는 경우 단순히 편지를 캡처합니다. 따라서 캡처의 길이는 존재하는 경우 1이고없는 경우 0입니다. 특별한 경우는 D 또는 E가 각각없는 경우에만 존재하는 캡처 4 및 6입니다. 이 단지 10 진수로 표현 될 수 $#4$#6하지만 우리는 여기에 필요하다고. 그런 다음 캡처는 길이가 원하는 숫자 인 문자열로 구성됩니다. 예를 들어, 작성 6*$1하면 A가 있으면이 문자열의 길이는 6이고,없는 경우 0입니다. 다른 표현 중에서 선택하기 위해 0 또는 1로 평가되는 ( $.긍정적 캡처) 또는 $#(음성 캡처)를 사용하고 지금까지 문자열을 곱할 수 있습니다.

$.5*$.8*$(6*$7$2$2)

F6 번과 B2 번 반복 됩니다 (골퍼처럼 연결하여). 그러나 E와 둘 다 G존재 하지 않으면 결과는 무시됩니다 . 이것은의 경우를 처리 2, 68.

$#6*$.3*$($.2*$(___$7)5*$7)

F는 5 번 반복 B되며, 존재하는 경우 6 번째 시간에 추가 3을 더한 길이 3의 상수 문자열로 표시됩니다. 그러나 D존재 하지 않는 한 결과는 무시됩니다 E. 이것은의 경우를 처리 3, 59.

$#4*$(6*$1_3*$8

A6 회 G반복되고 3 회 반복되고 추가가 1추가됩니다 (골퍼이기 때문에 둘 사이에 일정한 문자로 표시됨). 그러나 D결석이 없으면 결과는 무시됩니다 . 이것은의 경우를 처리 1, 47.

$.(

그런 다음 위의 문자열을 연결하고 길이를 가져옵니다. 위의 어느 것도 적용되지 않으면 문자열이 생성되지 않으므로 길이는 0입니다.

결과 문자열 (길이를 가져 오기 전)은 다음과 같습니다.

1   _
2   BB
3   ___
4   _GGG
5   FFFFF
6   FFFFFF
7   AAAAAA_
8   FFFFFFBB
9   ___FFFFFF

2

MATL , 14 바이트

'/lx2Z^o~z'Q&m

입력은 리틀 엔디안 형식의 세그먼트를 나타내는 숫자입니다.

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

설명

'/lx2Z^o~z'  % Push this string
Q            % Add 1 to the codepoint of each char. This gives the array
             % [48 109 ... 123], corresponding to numbers 1 2 ... 9. Note that
             % 0 is missing
&m           % Implicit input. Call ismember function with second output. This
             % gives the 1-based index in the array for the input, or 0 if the
             % input is not present in the array.
             % Implicit display



1

apt, 15 바이트

빅 엔디안 값을 입력으로 사용합니다.

"~¶ÌÚúþÞ"bUd

시도 해봐


설명

문자열에는 빅 엔디안 값의 각 코드 포인트에있는 문자가 포함됩니다. Ud입력의 코드 포인트에서 문자를 가져 와서 문자열에서 해당 문자 b의 색인을 찾습니다.




1

TI-BASIC (TI-83 + / 84 + 시리즈), 15 바이트

int(10fPart(194909642ln(Ans

리틀 엔디안 입력을 사용합니다. 해시는 TI-BASIC에서 상당히 일반적이므로 이런 경우에 해시 함수 무차별 대입을 작성 했습니다 .

승수는 예상 10이 아닌 9 자리 길이이므로 약간 운이 좋습니다.

      fPart(194909642ln(Ans   hash function mapping onto [0,1)
int(10                        take first digit after decimal point

1

05AB1E , 17 16 15 12 바이트

•NŽyf¯•I41%è

@ErikTheOutgolfer 덕분에 -1 바이트 . @MishaLavrov 의 Mathematica 응답
포트를 생성하여 -1 바이트 . @Grimy 덕분에 -3 바이트 .

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

NŽyf¯•       # Push compressed integer 99608231754
       I41%   # Push the input modulo-41
           è  # Index this into the integer (with automatic wraparound)
              # (and output the result implicitly)

내이 05AB1E 팁을 참조하십시오 (섹션 얼마나 큰 정수를 압축하는 방법을? ) 이유를 이해하는 •NŽyf¯•것입니다 99608231754.



@EriktheOutgolfer 아, 물론 .. 우연히 그것은 128в입니다. 128절반 이 내장되어 있다는 것을 잊었다 256. 감사!
Kevin Cruijssen

나는 15 살 이하의 괴물을 시도했다 ¦C•26¤æÈÛµÀš•2ô₂+sk.
매직 문어 Urn

1
트윗 담아 가기 압축 된 정수의 크기 (11)와 랩 어라운드 차기 때문에 지금은 그것을 볼 것을 그것은 명백하다.
케빈 Cruijssen

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