Dekoduj 7-segmentowy wyświetlacz


17

Prawdopodobnie wszyscy znacie 7-segmentowy wyświetlacz, który może wyświetlać między innymi wszystkie cyfry od 09 :

Wyświetlacz 7-segmentowy (wikipedia.org)

Wyzwanie

Rozważamy tylko segmenty AG , Twoim zadaniem jest zdekodowanie pojedynczej cyfry, biorąc pod uwagę, które segmenty są włączone.

Można to zakodować jako 8-bitową liczbę całkowitą, oto tabela każdej cyfry z ich reprezentacją binarną oraz odpowiadającymi jej wartościami little-endian i big-endian:

Digit.ABCDEFGLittle-endianBig-endian0011111101260x7E1260x7E100110000480x30120x0C2011011011090x6D1820xB63011110011210x791580x9E400110011510x332040xCC501011011910x5B2180xDA601011111950x5F2500xFA7011100001120x70140x0E8011111111270x7F2540xFE9011110111230x7B2220xDE

Reguły i I / O

  • Wejście będzie jednym z
    • jedna liczba całkowita (jak w tabeli powyżej jednego z dwóch podanych zamówień)
    • lista / tablica / .. bitów
    • ciąg składający się ze znaków ABCDEFG(możesz założyć, że jest posortowany, jako przykład ABCkoduje 7 ), ich wielkość jest twoją decyzją (nie wielkimi literami)
  • Wyjście będzie cyfrą, którą koduje
  • Możesz założyć, że nie ma nieprawidłowych danych wejściowych (niepoprawny oznacza, że ​​nie ma odpowiedniej cyfry)

Testy

Ponieważ to wyzwanie pozwala na wiele reprezentacji, zapoznaj się z tabelą.



Czy możemy zaakceptować liczbę całkowitą (lub tablicę) w dowolnej określonej kolejności bitów lub tylko w dwóch pokazanych?
Jonathan Allan

@JonathanAllan: Wyjaśnię, tylko te już pokazane.
ბიმო

O cholera, nie musisz obsługiwać wszystkich typów danych wejściowych? Tylko jeden? Ups ...
Magic Octopus Urn

@MagicOctopusUrn: Tak, rzeczywiście :)
ბიმო

Odpowiedzi:




7

Wolfram Language (Mathematica) , 41 bajtów

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

Wypróbuj online!

Używa wejściowej kolumny little-endian liczb całkowitych. Zignoruj ​​ostrzeżenie o składni.

Dla wejściowego X najpierw bierzemy X mod 41, a następnie bierzemy wynik mod 11. Wyniki są odmiennymi mod 11, więc możemy je wyodrębnić z tabeli. Na przykład 126 mod 41 mod 11 to 3, więc jeśli ustawimy pozycję 3 na 0, wówczas otrzymamy poprawną odpowiedź dla wejścia 126.

Stół jest 9[,6,0,8,2,3,1,7,5,4]. Część 0 to głowa 9. Brakuje części 1, więc jest to Nullzapisanie bajtu: nigdy nie musimy brać udziału 1. Zatem część 2 jest 6, część 3 jest 0i tak dalej, jak zwykle.


Odpowiedź Jonathana Allana daje nam 1[4,9,8,6,2,0,5,3,7][[384~Mod~#~Mod~13]]&. Nie jest to wcale krótsze, ale pozwala uniknąć ostrzeżenia o składni!


Wolfram Language (Mathematica) , 27 25 bajtów

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

(Przykro nam, jest tu jakaś postać, która się nie pojawia. Kliknij poniższy link, a zobaczysz.)

Wypróbuj online!

Chodzi o brutalne zmuszanie jakiegoś łańcucha do wejścia, Hashaby hasze miały prawidłowe wartości mod 11. Większe brutalne wymuszenie prawdopodobnie doprowadzi nas do jeszcze krótszego rozwiązania.


Czy mógłbyś wyjaśnić tę odpowiedź trochę dla kogoś, kto nie zna matematyki?
jrook

Myślałem, że będzie to czytelne dla każdego, ale dobrze, zmienię wyjaśnienie.
Misza Ławrow

Gratulacje; 41-bajtowe rozwiązanie zepsuło moją sprężarkę Mathematica.
lirtosiast





3

Biała spacja , 152 bajty

Obowiązkowe „S, T i L tak naprawdę nie istnieją, są po prostu widocznymi reprezentacjami poleceń”.

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	

Wypróbuj online!

Kończy się błędem.

Równoważna składnia podobna do złożenia:

	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

Możesz usunąć trzy końcowe znaki nowej linii, aby zapisać 3 bajty. Daje błąd w STDERR, ale program nadal działa i jest to dozwolone przez meta-reguły .
Kevin Cruijssen

3

pieprzenie mózgu , 474 176 154 151 149 149 137 bajtów

Zajmuje ciąg wejściowy ośmiu 0 i 1tym pierwszy 0na miejscu po przecinku.

(jak w drugiej kolumnie tabeli w poście)

Wyprowadza cyfrę od 0 do 9.

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

Wypróbuj online!

Algorytm

Obserwując stan określonego segmentu, możemy podzielić zestaw możliwych cyfr na mniejsze podzbiory. Poniżej znajduje się statyczne drzewo wyszukiwania binarnego użyte w moim kodzie. Lewe poddrzewa odpowiada stanowi WŁĄCZENIA segmentu, prawe odpowiada Stanowi WYŁĄCZENIA segmentu.

                                         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

Kilka uwag przydatnych podczas gry w golfa

  1. Bity C i D są zbędne i można je zignorować.
  2. Zera wiodące (bit dziesiętnego punktu) może być (ab) użyte jako wartość 48, ważna zarówno przy analizie danych wejściowych, jak i przygotowaniu danych wyjściowych.
  3. Po osiągnięciu liścia i wydrukowaniu cyfry wystarczy pominąć wszystkie pozostałe warunki. Można tego dokonać, przesuwając wskaźnik danych wystarczająco daleko do obszaru zer, aby nie mógł wrócić.
  4. Dla kompatybilności lepiej jest używać zer po prawej stronie, ponieważ niektóre implementacje BF nie obsługują ujemnych wskaźników danych.
  5. Dlatego lepiej jest przechowywać wartość wyjściową w prawej komórce, abyśmy mogli łatwo dotrzeć do obszaru zer po prawej stronie.
  6. Dlatego lepiej jest sprawdzać bity od lewej do prawej: A, B, E, F, G, aby łatwiej dotrzeć do komórki wyjściowej.
  7. Różne cyfry mogą współdzielić kod wyjściowy. Na przykład 5 i 6 znajdują się w tym samym poddrzewie. Możemy zrobić +++++dla obu wartości, a następnie +tylko dla sześciu.
  8. Możemy zmniejszyć liczbę +poleceń, jeśli z góry dodamy 2 do wartości wyjściowej. W takim przypadku musimy zmniejszyć go 0, a 1tylko i uzyskać korzyści dla innych cyfr.

2

Siatkówka , 96 bajtów

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

Wypróbuj online! Może nie jest to najlepszy sposób, ale jest to interesujący sposób programowania w Retina. Wyjaśnienie:

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

Próbuje uchwycić interesujące przypadki. Pozytywne przechwytywania po prostu przechwytują literę, jeśli jest obecna. Długość przechwytywania wynosi zatem 1, jeśli jest obecny, i 0, jeśli go nie ma. Przypadkami szczególnymi są zrzuty 4 i 6, które istnieją tylko wtedy, gdy odpowiednio D lub E są nieobecne. Te mogą być wyrażone tylko w postaci dziesiętnej, jak $#4i $#6, ale to wszystko musimy tutaj. Przechwyty są następnie budowane w ciąg, którego długość jest pożądaną liczbą. Na przykład, jeśli piszemy, 6*$1to ten łańcuch ma długość 6, jeśli A jest obecny, i 0, jeśli jest nieobecny. Aby wybierać między różnymi wyrażeniami, używamy $.(dla przechwytywania dodatniego) lub $#(dla przechwytywania ujemnego), które oceniają na 0 lub 1, a do tej pory można to pomnożyć przez ciąg.

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

Fpowtarza się 6 razy i Bdwa razy (przez konkatenację, ponieważ jest golfistą). Jednak wynik jest ignorowany, chyba że jedno i drugieE i Gsą obecne. Obsługuje to przypadki 2, 6i 8.

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

Fpowtarza się 5 razy, a jeśli Bjest obecny, dodaje się go po raz szósty plus dodatkowe 3 (reprezentowane przez stały ciąg długości 3). Jednak wynik jest ignorowany, chyba że Djest obecny iE nieobecny. Obsługuje to przypadki 3, 5i 9.

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

Apowtarza się 6 razy i Gpowtarza się 3 razy, a dodatkowo 1dodawany (reprezentowany przez stały znak między nimi, ponieważ jest bardziej golfowy). Jednak wynik jest ignorowany, chyba żeD jest nieobecny. Obsługuje to przypadki 1, 4i 7.

$.(

Powyższe ciągi są następnie łączone i brana jest długość. jeśli żadna z powyższych nie ma zastosowania, łańcuch nie jest generowany, a zatem jego długość wynosi 0.

Wynikowe ciągi (przed pobraniem długości) są następujące:

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

2

MATL , 14 bajtów

'/lx2Z^o~z'Q&m

Dane wejściowe to liczba reprezentująca segmenty w formacie little-endian.

Wypróbuj online!

Wyjaśnienie

'/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

Japt, 15 bajtów

Pobiera na wejściu wartość big-endian.

"~¶ÌÚúþÞ"bUd

Spróbuj


Wyjaśnienie

Ciąg zawiera znaki w każdym punkcie kodowym wartości big-endian; Udpobiera znak w punkcie kodowym wejścia i bznajduje indeks tego w ciągu.


1

Neim , 15 bajtów

&bᚫJ𝕂𝕨O𝐖𝐞ℤ£ᛖ𝕪)𝕀

Wyjaśnienie:

&bᚫJ𝕂𝕨O𝐖𝐞ℤ£ᛖ𝕪)      create list [126 48 109 121 51 91 95 112 127 123]
                 𝕀     index of

Wypróbuj online!



1

TI-BASIC (seria TI-83 + / 84 +), 15 bajtów

int(10fPart(194909642ln(Ans

Wykorzystuje wejście little-endian. Skróty są dość powszechne w TI-BASIC, więc napisałem funkcję skrótu brute-forcer dla takich przypadków.

Mamy tu trochę szczęścia, ponieważ mnożnik ma 9 cyfr zamiast oczekiwanej 10.

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

1

05AB1E , 17 16 15 12 bajtów

•NŽyf¯•I41%è

-1 bajt dzięki @ErikTheOutgolfer .
-1 bajt, tworząc port odpowiedzi Mathematica @MishaLavrov .
-3 bajty dzięki @Grimy .

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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)

Zobacz moją wskazówkę 05AB1E (rozdział Jak kompresować duże liczby całkowite? ), Aby zrozumieć, dlaczego tak •NŽyf¯•jest 99608231754.



@EriktheOutgolfer Ah, oczywiście .. Przypadkowo tak 128в. Zapomniałem, że jest wbudowany do 128połowy 256. Dzięki!
Kevin Cruijssen

Próbowałem też trochę dziwacznych rzeczy, których nie mogłem zdobyć poniżej 15. Dziwaczna próba: ¦C•26¤æÈÛµÀš•2ô₂+sk(19).
Magic Octopus Urn

1
@Grimy Thanks! Teraz, gdy to widzę, jest oczywiste, ponieważ skompresowana liczba całkowita ma rozmiar 11 i zaczyna się
owijanie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.