Spoglądając na kawałki

9

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:

wprowadź opis zdjęcia tutaj

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).

Michaił V.
źródło
Czy możemy również przesłać program, który akceptuje cztery dane wejściowe? Niektóre języki nie działają zbyt dobrze.
Stephen
@StephenS Przypuszczam, że tak, ale nie jestem pewien, czy zrozumiem te: /
Mikhail V
2
Dwa ostatnie argumenty wydają się zupełnie nieistotne w większości języków, dlaczego więc nie wymagać tylko 1 i 0? Pierwszy argument, jakim jest lista, wydaje się nie robić wiele poza tym, że zwykłe języki dodają prostą pętlę / rekurencję, jednocześnie utrudniając konkurowanie bardziej ezoterycznym językom.
FryAmTheEggman
@MikhailV, jeśli chcesz zrozumieć wszystkie zgłoszenia dotyczące swoich wyzwań, powodzenia: / większość z nich ma linki TryItOnline, dzięki czemu możesz zobaczyć, jak działają, ale większość języków golfowych wygląda na nonsens, dopóki nie wiesz, co robią
Stephen
@FryAmTheEggman Nie rozumiem też, co się Adzieje, ponieważ jest tak samo we wszystkich przypadkach testowych
Stephen

Odpowiedzi:

2

JavaScript (ES6), 57 bajtów

(A,M,O,I)=>M.replace(/[\d]/g,(d,i)=>(A>>7-d)%2?I[i]:O[i])

darrylyeo
źródło
2

Rubinowy , 48 bajtów

->a,f,*b{f.gsub(/\d/){b[a[55-$&.ord]][$`.size]}}

Parametry zer i jedynek są traktowane jak tablica ( *b), a parametr zerów jest przechowywany w, b[0]a parametr jedynek jest przechowywany w b[1].

Parametr maski fma 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!

RJHunter
źródło
1

Perl 6 , 60 bajtów

->\a,$_,\o,\z{S:g|\d|{substr (z,o)[a+>(7-$/)%2],$/.from,1}|}
Sean
źródło
1

Python, 97 bajtów

lambda A,M,Z,O:"".join([[Z,O][1&(A>>7-int(d))][i] if d.isdigit() else d for i,d in enumerate(M)])
Michaił V.
źródło
1

Mathematica, 131 bajtów

""<>Table[(f/@{##2})[[x[[i]],i]],{i,Length[x=(f=Characters)@#2/.Table[ToString@i->2+Floor[#/2^(7-i)]~Mod~2,{i,0,7}]/._String->1]}]&
użytkownik202729
źródło
Length[x]może być Length@xi {#2,#3,#4}może być {##2}.
CalculatorFeline
Ponadto, StringJoin@@może być StringJoin@i #1jest po prostu#
CalculatorFeline
Lekko uprościłem zasady, patrz aktualizacja.
Michaił V
1

q / kdb +, 86 64 bajtów

Rozwiązanie:

f:{[A;M;Z;O]@[M;m;:;((-8#0b vs A)"I"$'M m)(Z;O)'m:(&)M in .Q.n]}

Przykłady:

q)f[1;"0123 4567";"0000 0000";"1111 1111"]
"0000 0001"
q)f[1;"| 7654 3210 |";"  ---- ----  ";"  ssss ssss  "]
"| s--- ---- |"
q)f[15;"0 | 123 4567";"    --- ----";"X   kkk ssss"]
"  | --- ssss"
q)f [0;"| 7 66 555 4444 |";"  . .. ... ....  ";"  0 00 000 0000  "]
"| . .. ... .... |"

Wyjaśnienie:

Wyciągnij indeksy, w których maska ​​wejściowa Mjest liczbą, nazwij to, mgdzie 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ć albo O(jeśli ustawiony jest 1) lub Z(jeśli ustawiony jest 0), a następnie zindeksuj te listy według wskaźników podanych przez m. Na koniec zastosuj ( :) tę nową listę do oryginalnej maski w indeksach m.

{[A;M;Z;O]                                                   } / lambda function with 4 parameters
          @[ ; ; ;                                          ]  / apply, applies 3rd parameter to 1st parameter at indexes from parameter 2 with parameter 4 :)
                   (-8#0b vs A)                                / convert input number to binary (64 bit), take the last 8 items
                                              m:(&)M in .Q.n   / returns indices where mask is in "0123..789", stores in variable m
                               "I"$'M m                        / index into mask at indices m, then cast these numbers to an integer array
                  (                    )                       / we then index into our 8 bits a these offsets to get the output order
                                        (Z;O)                  / 2-item list of the zeroes and ones mask
                                             '                 / take each item on the left and right and apply them to (Z;O) (ie index in at 0 / 1 and then 123..67)
            M m :                                              / apply *this* list to M at each index given by m

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, yi zodpowiednio)

f:{@[y;m;:;((-8#0b vs x)"I"$'y m)z'm:(&)y in .Q.n]}
streetster
źródło