Spojrzenie na wartości binarne wydrukowane jako owale i patyki nie jest takie proste ... Aby temu zaradzić, musisz napisać funkcję (lub program), która drukuje liczby w niestandardowej reprezentacji binarnej.
Więc chcę wziąć liczbę, powiedzmy 3 ( 00000011
) i wypisać bity w formacie zdefiniowanym przez użytkownika, na przykład z parami oddzielonymi spacjami:
00 00 00 11
lub powiedzmy w odwrotnej kolejności i z niektórymi dekoratorami, np .:
11_00_00_00
Ponadto musi istnieć możliwość pokazania „0” i „1” jako niestandardowych znaków, aby lepiej je odróżnić, np .:
XX oo oo oo
Wyzwanie polega więc na napisaniu kodu, który robi to wszystko, zgodnie z następującą specyfikacją.
Specyfikacja
Funkcja pobiera dane wejściowe w następujący sposób: f (A, maska, zera, jedynki)
Parametry:
A - liczba wejściowa - dowolna (niepodpisana) liczba całkowita z zakresu 0–255.
mask - parametr ciągu określający konstrukcję wyjścia.
zera - ciąg o tej samej długości, definiuje „zero” glifów dla każdego gniazda wyjściowego.
te - ciąg o tej samej długości, definiuje „jeden” glif dla każdego gniazda wyjściowego.
Zasady konstrukcji wyjściowej:
Przyjrzyj się dokładnie temu obrazowi z przykładem, aby zrozumieć, w jaki sposób generowane są dane wyjściowe:
Więc tylko pojedyncze cyfry w masce są analizowane i zastępowane przez odpowiednie bity, inne znaki są lewo jak ma to miejsce . Ponadto, jeśli wartość pobranego bitu wynosi 1, to pojawia się on na końcowym wyjściu jako „X”, a jeśli jest równy 0, pokazuje się jako „o”. W powyższym przykładzie wszystkie cztery pobrane bity to „1”, więc we wszystkich gniazdach widzimy „X”.
Gdyby liczba wejściowa wynosiła 128, to logicznie wyjściem byłoby X foo bar ooo
. Znaki w parametrach „zera” i „jedynki”: dowolne znaki ASCII, które można wydrukować, zakładają, że zawsze są wyrównane znakami do maski.
Uwagi :
- Bity są indeksowane 0: 0 bit to MSB.
- Załóżmy, że cyfry 8,9 nie są dozwolone w ciągu maski.
- Ciągi wejściowe obejmują dowolne znaki ASCII do wydruku.
- „Zero” i „jedynki” są wyrównane znakami z maską.
- W przypadku znaków specjalnych / modyfikatorów w Twoim języku: możemy założyć, że nie pojawią się one w ciągu wejściowym.
Dla przejrzystości zobacz więcej przykładów.
Dane wejściowe -> Przykłady wyjściowe
Wypisz wszystkie 8 bitów we wspólnej kolejności za pomocą separatora spacji, we wspólnej notacji owal-patyk:
mask = "0123 4567"
zeros = "0000 0000"
ones = "1111 1111"
A=1 -> 0000 0001
Dane wyjściowe w odwrotnej kolejności, w notacji myślnik i glif:
mask = "| 7654 3210 |"
zeros= " ---- ---- "
ones = " ssss ssss "
A=1 -> | s--- ---- |
A=3 -> | ss-- ---- |
A=128-> | ---- ---s |
Różne zapisy w jednym wyjściu, np. Dla spakowanych danych:
mask = "0 | 123 4567"
zeros= " --- ----"
ones = "X kkk ssss"
A= 15 -> | --- ssss
A= 16 -> | --k ----
A= 32 -> | -k- ----
A= 128 -> X | --- ----
A= 255 -> X | kkk ssss
Powtarzające się wzory:
mask = "| 7 66 555 4444 |"
zeros= " . .. ... .... "
ones = " 0 00 000 0000 "
A= 0 -> | . .. ... .... |
A= 1 -> | 0 .. ... .... |
A= 2 -> | . 00 ... .... |
A= 3 -> | 0 00 ... .... |
A= 4 -> | . .. 000 .... |
Aktualizacja
Reguły zostały nieco uproszczone - program musi wydrukować tylko jeden numer (nie tablicę / listę liczb, jak pierwotnie zaproponowano).
A
dzieje, ponieważ jest tak samo we wszystkich przypadkach testowychOdpowiedzi:
JavaScript (ES6), 57 bajtów
Pokaż fragment kodu
źródło
Rubinowy , 48 bajtów
Parametry zer i jedynek są traktowane jak tablica (
*b
), a parametr zerów jest przechowywany w,b[0]
a parametr jedynek jest przechowywany wb[1]
.Parametr maski
f
ma każdą cyfrę (/\d/
) podstawioną znakiem z odpowiedniej tablicy. Specjalna zmienna$`
, która przechowuje tekst prowadzący do bieżącego dopasowania, jest (ab) używana tutaj do śledzenia pozycji.Indeksowanie bitów Ruby wywołuje 0 najmniej znaczący bit, ale wyzwanie wywołuje 0 najbardziej znaczący bit. Odejmowanie ASCII od 55 (znak „7”) daje użyteczny indeks bitowy Ruby.
Wypróbuj online!
źródło
Perl 6 , 60 bajtów
źródło
Python, 97 bajtów
źródło
Mathematica, 131 bajtów
źródło
Length[x]
może byćLength@x
i{#2,#3,#4}
może być{##2}
.StringJoin@@
może byćStringJoin@
i#1
jest po prostu#
q / kdb +,
8664 bajtówRozwiązanie:
Przykłady:
Wyjaśnienie:
Wyciągnij indeksy, w których maska wejściowa
M
jest liczbą, nazwij to,m
gdzie będziemy modyfikować maskę wejściową. Wyjmij cyfry z ciągu, rzutuj na liczby całkowite, a następnie zindeksuj do naszej 8-bitowej tablicy, aby uzyskać prawidłowe uporządkowanie. Użyj tej 8-bitowej tablicy, aby zindeksować alboO
(jeśli ustawiony jest 1) lubZ
(jeśli ustawiony jest 0), a następnie zindeksuj te listy według wskaźników podanych przezm
. Na koniec zastosuj (:
) tę nową listę do oryginalnej maski w indeksachm
.Uwagi:
Gdybyśmy mogli podać argumenty w postaci, moglibyśmy ogolić kolejne 14 bajtów:
[A;M;(Z;O)]
a Q pozwala do 3 argumenty są podane funkcji bez wyraźnie nazwany (są
x
,y
iz
odpowiednio)źródło