Moim pierwszym programem do układania puzzli i gry w golfa jest Seven-Slash Display . Oto moje pierwsze wyzwanie, również oparte na 7-segmentowym wyświetlaczu.
Często zastanawiam się, oprócz cyfr, jakie litery mogę wyświetlić za pomocą prostego 7-segmentowego wyświetlacza. Okazuje się, że można wyświetlić wiele liter. W rzeczywistości wszystkie litery oprócz K, M, V, W, X można wyświetlić za pomocą pojedynczego wyświetlacza 7-segmentowego. Wynika to z faktu, że możesz wyświetlać małe lub duże litery. na przykład
„abcdef” może być wyświetlany jako
_ _ _ _
!_!!_ ! _!!_ !_
! !!_!!_ !_!!_ !
Zauważ, że każdy znak to macierz 3x3 złożona z !
i _
.
Oczywiście 7-segmentowy wyświetlacz może służyć do wyświetlania liczb i symboli:
_ _ _ _ _ _ _
! _ !_ !_ ! _! !!_ !_!! !_!!_!
! _!!_ !_! !_! ! _!! !_ ! ! _!
Niektóre litery mogą mieć zarówno duże, jak i małe litery:
_ _
! _ !_!!_ ! ! ! _ ! !
!_ !_ ! !! ! ! !!_!!_!!_!!_!
Oto pełny zestaw znaków:
_ _ _ _ _ _ _ _ _
! ! ! _! _!!_!!_ !_ !!_!!_! _ !_ _ _ _!
!_! !!_ _! ! _!!_! !!_! _! !_ ! ! !!_!!_! !
_ _ _ _ _ _ _ _ _ _
!_!!_ ! _!!_ !_ ! !_! ! !! _ ! !!_!!_! _ !_ !_ ! !!_! _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_! _!!_
Zwróć uwagę, że istnieją białe spacje ( ), myślnik (
-
) i znak zapytania ( ?
). Pismo I
, O
i Z
są takie same jak numery 1
, 0
i 2
odpowiednio.
W tym wyzwaniu napiszesz program lub funkcję do wyświetlania łańcucha przy użyciu powyższego formatu wyświetlania 7-segmentowego.
Zasady
Możesz napisać program lub funkcję
To jest code-golf, wygrywa najkrótszy kod w bajtach
Twój program lub funkcja powinna pobierać dane wejściowe ze STDIN lub jako parametr. I wysyła ciąg do STDOUT lub jako ciąg w 3 liniach bez spacji wiodących, ale zakończony znakiem nowej linii.
CHIOU
Prawidłowo obchodź się z górną / dolną skrzynką .Opcjonalnie możesz wydrukować końcowe białe spacje
Musisz postępować zgodnie z powyższym formatem. Użycie podkreślnika
_
i wykrzyknika!
do utworzenia wyświetlacza 7-segmentowego.Musisz obsługiwać białe znaki ( )
, myślnik (
-
) i znak zapytania (?
)Jeśli ciąg zawiera nieobsługiwany znak (k, m, v, w, x), wyświetlany jest znak pojedynczego błędu (linia 3 horyzontu, patrz przykład). Oprócz 5 nieobsługiwanych znaków można założyć, że dane wejściowe składają się tylko z obsługiwanego zestawu znaków.
Zdecydowałem się nie mieć litery na małe litery L (
l
) ze względu na zamieszanie, ale jeśli masz taką skłonność, możesz wyświetlić ją jak1
po prawej lub lewej stronie.
Przykłady
$./a.out Start
_ _
!_ !_ !_! _ !_
_!!_ ! !! !_
$./a.out "7-seg dIsplay"
_ _ _ _ _ _ _
! _ !_ !_ ! _! !!_ !_!! !_!!_!
! _!!_ !_! !_! ! _!! !_ ! ! _!
$./a.out "0123456789 chiou-?"
_ _ _ _ _ _ _ _ _
! ! ! _! _!!_!!_ !_ !!_!!_! _ !_ _ _ _!
!_! !!_ _! ! _!!_! !!_! _! !_ ! ! !!_!!_! !
$./a.out "ABCDEFGHIJLNOPQRSTUZ"
_ _ _ _ _ _ _ _ _ _
!_!!_ ! _!!_ !_ ! !_! ! !! _ ! !!_!!_! _ !_ !_ ! ! _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_!!_
$./a.out "abcdefghijlnopqrstuz"
_ _ _ _ _ _ _ _
!_!!_ _ _!!_ !_ ! !_ !! _ _ !_!!_! _ !_ !_ _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_!!_
$./a.out "Bad Form"
_
_
_
$./a.out "Hello"
_
!_!!_ ! ! _
! !!_ !_ !_ !_!
$./a.out "World"
_
_
_
k, m, v, w, x
nie będą się wyświetlać.\r
) z przesunięciem linii (LF,\n
). * nix używa LF, a Windows używa CRLF. Tylko niektóre starsze systemy same używają CR. Więcej informacji tutaj: en.wikipedia.org/wiki/NewlineOdpowiedzi:
CJam,
123114112110 bajtówW powyższym użyto notacji karetką, ponieważ kod zawiera znaki niedrukowalne. Jednym z nich jest bajt zerowy (
^@
), co oznacza, że ten kod można wykonać tylko z wiersza poleceń.Kosztem tylko dwóch kolejnych bajtów (w sumie 112 ) możemy to naprawić.
Tym razem wszystkie znaki można wydrukować. Wypróbuj online w interpretatorze CJam .
Przykładowy przebieg
Pomysł (wersja do wydruku)
Każda postać może być pokazana na 9-segmentowym wyświetlaczu
przez zastąpienie niektórych znaków postaci spacjami.
Możemy zamienić określony znak w liczbę całkowitą, zastępując każdy pokazany segment w naturalnej kolejności odczytu wartością 1 , a każdy nie pokazany segment cyfrą 0 i biorąc pod uwagę wynikowe liczby binarne.
Pierwszy i trzeci segment nigdy nie są pokazywane, więc spowoduje to utworzenie liczb całkowitych z przedziałów [0,64) i [128 192) .
Możemy zakodować każdą z tych liczb całkowitych jako pojedynczy bajt, ale połowa z nich spowoduje powstanie znaków niedrukowalnych. Tak więc, dodamy 64 do każdej liczby całkowitej przed odlewania do znaku, który pilnuje punkty kodowe są w zakresach [64,128) i [192,256) .
Jedynym niedrukowalnym znakiem w tych dwóch zakresach jest DEL (punkt kodowy 127), co odpowiada następującej, niepotrzebnej konfiguracji wyświetlania:
Możemy odwrócić powyższe kodowanie poprzez dodanie 448 == 512 - 64 do każdego punktu kodowego, konwersję do podstawy 2 i usunięcie pierwszej cyfry binarnej.
Wszystko, co pozostało, aby znaleźć skuteczny sposób powiązania tych zakodowanych segmenetów z odpowiadającymi im znakami ASCII.
Jeśli zamapujemy znaki
" -chiou"
na znaki";=KMVWX"
i przekonwertujemy cały tekst na wielkie litery, możemy po prostu zapisać kodowanie wszystkich znaków między0
(punkt kodowy 48) aZ
(punkt kodowy 90), co daje zakres 43.Indeksowanie macierzy jest modułowe w CJam, więc jeśli
A
jest łańcuchem o długości 43A86=
,A43=
iA0=
wszystkie dają takie same wyniki. Znak o punkcie kodowym 86 jestV
, więc po prostu przechowujemy zakodowane segmenty V - Z i 0 - U , w kolejności.W rzeczywistym kodzie wybieramy znak at jako znak „złej formy”, zastępujemy całe wejście ciągiem,
"@"
jeśli zawiera on niedozwoloną literę, i odwracamy kroki od góry.Kod (wersja do wydruku)
źródło
Perl,
475469424390280272 bajtówwieloliniowy z komentarzami:
Wzory bitów kodujące segmenty są przechowywane w ciągu (unikając 3 znaków niedrukowalnych za pomocą
\x
i wykorzystując\0
spację) i są odwzorowywane na znaki wejściowe za pomocą operatora transliteracji Perl.W przypadku 5 z 7 segmentów bitowe jest używane wraz z operatorem trójskładnikowym w celu wyprowadzenia spacji lub znaku segmentu. W dolnych lewych dwóch segmentach (zakodowanych przez 2 i 4 w zestawie bitów) do zapisania 2 bajtów służy wyszukiwanie podciągu w ciągu 8 znaków.
Dzięki Dom Hastings za jego wskazówki dotyczące gry w Perla.
Stara wersja (używanie wyrażeń regularnych do kodowania wzorców), 390 bajtów:
wieloliniowy z komentarzami:
Łańcuch jest wczytywany i sprawdzany pod kątem niepoprawnych znaków za pomocą wyrażenia regularnego, kończąc, jeśli jakieś zostaną znalezione. Następnie niedozwolone znaki są zastępowane dozwolonymi małymi znakami, a cały ciąg znaków jest konwertowany na małe litery.
Wiersze są generowane pojedynczo, z 1 segmentem na literę w pierwszym rzędzie i 3 w pozostałych dwóch. Dla każdego wiersza ciąg jest przetwarzany po jednym znaku na raz, a znak jest dopasowywany do wyrażenia regularnego dla każdego segmentu, aby sprawdzić, czy! lub _ powinno zostać wyświetlone. Użycie wyrażenia regularnego oznacza, że dla znaków, w których segment nie jest ustawiony, potrzeba 0 bitów na segment na znak, aby zakodować, czy należy go ustawić, a dla znaków, w których jest ustawiony, zajmuje to nieco mniej niż 8 bitów, ponieważ zakresy wyrażeń regularnych mogą być używany. Działa więc do około 3 lub 4 bitów na segment na znak w zestawie lub około 21-24 bitów na znak.
Nie obsługuje zawijania linii.
źródło
' '
może być zastąpiony przez$"
i' '
może być tym,$"x3
który przycina kilka, twoje\n
mogą być dosłownie nowymi liniami, aby pozbyć się kilku innych. Twoje wcześniejsze wyjście może być również zwarte za pomocą kości, dzięki czemuif(/[kmvwx]/i){print" -\n"x3;exit}
staje siędie" - "x3if(/[kmvwx]/i)
. Przy odrobinie kruszenia możesz ponownie ustawić pętlę, aby uniknąć nawiasów i nie musisz$z
oszczędzać więcej!$_=lc<>
nie działa, ponieważ wtedy kod nie może rozróżniać wielkich i małych liter CHIOUCommon Lisp,
488416Przykład
Z
"abcdefg'hijklnopqrstuz"
drukuje:Uwagi
Znaki i ich reprezentacje są zakodowane w tym numerze w bazie 36:
Binarna reprezentacja tej cyfry jest podzielona na grupy 17 bitów.
Na przykład ostatnia grupa 17 bitów
110000111101010
, która jest tutaj podzielona na dwie części:110000
, kod znaków0
111101010
, kodowanie rysunku, najlepiej przedstawione w następujący sposób:Bity w pierwszej i ostatniej „kolumnie” dotyczą
!
znaków, te w środkowej kolumnie dla_
znaku. W razie potrzeby przechowywane są zarówno duże, jak i małe wersje znaku.Funkcja iteruje trzy razy po ciągu wejściowym, po jednym dla każdego wiersza wyniku, wyszukuje pasujący znak w tabeli (lub domyślnie 146, czyli trzy paski) i drukuje reprezentację w bieżącym wierszu.
źródło
'
postać, co jest miłe; będzie jednak wyświetlany poza 7-segmentowym wyświetlaczem. Jeśli przesuniesz w!
dół o 1 linię, byłoby idealnie.'
znak i edytuję pytanie,K
ponieważ w rzeczywistościK
wstawiłem niewłaściwe miejsce w ciągu wejściowym („... jlKn ...”) ;-) Widać tylko trzy paski (błąd) po prostu po L. Dziękuję za zauważenie tego.JavaScript (ES6),
380352324 bajty( Uwaga: Kod używa notacji karetki, ponieważ zawiera pewne znaki niedrukowalne. Aby uzyskać oryginalny kod, kliknij tutaj i wybierz nieprzetworzone dane. I nie,
h
to nie jest program CJam.)Nazywany jako
d("7-seg display")
lub podobny. Działa w przeglądarce Firefox 40, ale może nie działać w innych przeglądarkach. Z jakiegoś powodu fragment kodu HTML / JS nie zapisuje materiałów niedrukowalnych, ale możesz skopiować i wkleić surowe dane z tego miejsca .Nie golfowany:
( Uwaga:
g
ih
są spacjami dopasować8
,-
,ÿ
ispace
z ich odpowiednimi wartościami unikodowe).Wyjaśnienie:
Natychmiast zauważyłem, że 7 segmentów, przekonwertowanych na
0
/1
bity, pasuje do pierwszych 128 znaków Unicode. Problem z tym pomysłem polega na tym, że 1/4 z tych znaków to niedrukowalne znaki kontrolne. Wykorzystanie ich w moim kodzie sprawiłoby, że wyglądałoby to niesamowicie niechlujnie (lub niesamowicie inteligentnie; nie zdecydowałem, który z nich). Aby rozwiązać ten problem, pozostawiając resztę kodu prostą, wpadłem na ten pomysł:Z wyjątkiem
-
, przestrzeni i błędów , żaden z bohaterów brakowało zarówno z niższych segmentów pionowych. Aby upewnić się, że wszystkie te znaki pozostały pomiędzy0020
i007f
, po prostu zamapowałem 64 i 32 bity na te segmenty, tak:Liczby pozostałych 5 segmentów nie są zbyt ważne; można je ułożyć w inny sposób i nadal mieć wszystkie te same znaki „w granicach”.
Jako przykład, oto zakodowana wersja A :
Następnie wrzuciłem zakodowaną wersję każdego 7-segmentowego znaku
h
. Jednak8
spowodowało007f
(do kasowania kodu sterującego; stała bez względu na to, w jaki sposób segmenty są ułożone), przestrzeń spowodowała0000
(z zerowym kodem; również stała),-
spowodowały0002
, i błąd spowodowała0007
. Kopiować, wklejać nieprzetworzonych bajtów w odpowiedniej pozycji za8
,-
i błąd ; łatwo było uzyskać przestrzeń\0
.Po tym całym kodowaniu musiałem tylko użyć go do zdekodowania łańcucha i wyprowadzenia go w formacie czytelnym dla 7 segmentów. Użyłem pętli for i trzech zmiennych (
x
,y
iz
każda odpowiadająca linii wyjściowej), aby przejść przez każdy znak w ciągu i dodać jego 7-seg ekwiwalent do wyniku. Wybrałemÿ
do błędu charakteru ponieważ AFAIK, to nie na każdej klawiaturze, a to ostatnia postać wu+0000-u+00ff
zasięgu. Być możeΞ
zamiast tego mógłbym być dowcipny i wybrany (grecka litera xi) ....;)Edit 1: Saved grono przestrzeni tworząc mini-funkcje, aby określić, czy
!
,_
czyjest potrzebne.
Edycja 2: Zaoszczędziłem sporo miejsca dzięki sztuczkom, których nauczyłem się od czasu, gdy ostatnio odwiedziłem ten post.
Jak zwykle sugestie są bardzo mile widziane!
źródło