Dla fanów gry Nandgame: wypróbuj DPD również dziesiętnie w bramkach logicznych !
tło
Gęsto upakowane miejsca dziesiętne (DPD) to sposób na skuteczne przechowywanie cyfr dziesiętnych w formacie binarnym. Przechowuje trzy cyfry dziesiętne (od 000 do 999) w 10 bitach, co jest znacznie wydajniejsze niż naiwny BCD (który przechowuje jedną cyfrę w 4 bitach).
Notacje
- Małe litery
a
toi
są bity, które są kopiowane do reprezentacji dziesiętnej. 0
i1
są dokładnymi bitami we wzorcach bitów wejściowych lub wyjściowych.x
bity są ignorowane podczas konwersji.
Tabela konwersji
Poniżej znajduje się tabela konwersji z 10 bitów DPD na trzy cyfry dziesiętne. Każda cyfra dziesiętna jest reprezentowana jako 4-bitowy układ binarny (BCD). Obie strony są pisane od lewej do prawej, od najbardziej znaczącej cyfry do najmniejszej.
Bits => Decimal (Digit range)
a b c d e f 0 g h i => 0abc 0def 0ghi (0-7) (0-7) (0-7)
a b c d e f 1 0 0 i => 0abc 0def 100i (0–7) (0–7) (8–9)
a b c g h f 1 0 1 i => 0abc 100f 0ghi (0–7) (8–9) (0–7)
g h c d e f 1 1 0 i => 100c 0def 0ghi (8–9) (0–7) (0–7)
g h c 0 0 f 1 1 1 i => 100c 100f 0ghi (8–9) (8–9) (0–7)
d e c 0 1 f 1 1 1 i => 100c 0def 100i (8–9) (0–7) (8–9)
a b c 1 0 f 1 1 1 i => 0abc 100f 100i (0–7) (8–9) (8–9)
x x c 1 1 f 1 1 1 i => 100c 100f 100i (8–9) (8–9) (8–9)
Zadanie
Konwertuj 10 bitów DPD na 3 cyfry dziesiętne.
Przypadki testowe
DPD Decimal
0000000101 005
0001100011 063
0001111001 079
0000011010 090
0001011110 098
1010111010 592
0011001101 941
1100111111 879
1110001110 986
0011111111 999
1111111111 999 * Output is same regardless of the `x` bits
Wkład
Domyślnym formatem wejściowym jest lista 10 bitów. Bity powinny być zgodne z dokładną kolejnością powyżej lub odwrotnie. Zamiast tego możesz użyć równoważnego ciągu lub liczby całkowitej. W przeciwieństwie do innych moich wyzwań, zmiana kolejności lub użycie struktur zagnieżdżonych jest niedozwolone .
Dla danych wejściowych [1, 1, 0, 0, 0, 1, 0, 1, 0, 0]
dozwolone są następujące formaty:
- Lista bitów:
[1, 1, 0, 0, 0, 1, 0, 1, 0, 0]
- Strunowy:
"1100010100"
- Binarna liczba całkowita:
788
lub0b1100010100
- Liczba dziesiętna:
1100010100
- Odwrócone:
[0, 0, 1, 0, 1, 0, 0, 0, 1, 1]
i odwrócone w dowolnych innych formatach powyżej
Następujące formaty NIE są dozwolone:
- Dowolna zmiana kolejności bitów:
[0, 0, 0, 0, 0, 1, 1, 1, 0, 1]
- Struktury zagnieżdżone:
[[1, 1, 0], [0, 0, 1], [0, 1, 0, 0]]
lub[0b110, 0b001, 0b0100]
Wydajność
Domyślny format wyjściowy to lista 3 cyfr dziesiętnych. Każda cyfra powinna być reprezentowana od 0 do 9, albo liczbą całkowitą, albo znakiem. Tak jak na wejściu, możesz wybrać reprezentację ciągu lub liczby całkowitej. Jeśli wybierzesz reprezentację liczb całkowitych, zera wiodące można pominąć.
Kryterium punktacji i wygranej
Obowiązują standardowe zasady gry w golfa . Wygrywa najkrótszy program lub funkcja w bajtach dla każdego języka.
źródło
Python 3 ,
229 ... 9796 bajtówWypróbuj online!
-4 bajty przez @xnor
-6 bajtów autorstwa @nwellnhof
Sformatowany:
Wyjaśnienie
Ponieważ początkowo chciałem to zaimplementować w Jelly, podchodzę do innego rozwiązania w stosunku do większości odpowiedzi tutaj, które jest proste i być może pasuje do języka golfa. Chociaż funkcja gry w golfa przyjmuje liczbę całkowitą, niech wejście będzie w postaci listy bitowej
[a0,a1,...,a9]
. Następnie możemy wyprowadzić trzy wartości z danych wejściowych[a2,a5,a9]
: zawsze będą to odpowiednio niskie bity[d0,d1,d2]
.[2*a0a1,2*a3a4,2*a7a8,8]
: Wysokie bity każdej cyfry będą jednym z nich.[a3,a4,a5,a7,a8]
określające, jak uzyskać wysokie bity każdej cyfry. Obliczamy wskaźnik (od 1 do 8) w następujący sposób:Następnie n-ta cyfra może być elegancko obliczona jak
high_bits[arr[indicator][n]] | low_bits[n]
w poniższej tabeli, która jest skompresowana w ciąg.źródło
b"..."
aby zastąpić konwersjęord
.b"$>6;-/'?"[a&8and(~a&6or a>>4&6|1)]
oszczędza kolejne cztery bajty.JavaScript (Node.js) ,
126119117112111 bajtówWypróbuj online!
-5 bajtów dzięki @tsh (i 2 przez siebie) Więc
l
mogę zrobić więcej wysiłku, niż się spodziewałem.-2 więcej bajtów przy użyciu techniki @ tsh!
-5 bajtów dzięki @Arnauld
-1 bajtów dzięki @Neil
Dane wejściowe jako lista 10 bitów (jako 10 argumentów), dane wyjściowe jako lista 3 cyfr.
źródło
(!i|!d|e)
->i+l!=5
;(d|e|!h)
->h+l!=1
(g?h-i|h&!e?h?b:e:8:h*4+i*2)
->(g?h<i?e:h>i*e?b:8:h*4+i*2)
zapisuje kolejny bajt. (Tym razem sprawdziłem ...)C (gcc) ,
138129 bajtówWypróbuj online!
Pierwszy ekstraktów niektórych bitów w zmiennych
s
at
, tak że osiem rzędów z tabeli konwersji mogą być określane:Następnie ustawia się
u
iv
podziałami (prawa zmiany), tak żeu
,v
oraz wkładw
zawiera trzy niższe BCD bitów w pozycjach 0-2. Reszta jest nieco tasowana w zależności ods
it
. Dwie ważne sztuczki to:Port rozwiązania JavaScript Shieru Asakoto ma tylko 124 bajty :
Wypróbuj online!
źródło
f(b){int a=b/2%8,e=b&110,c=b/16,d=c/8;b=10*(10*(d%2|(6>a|78==e?d:8))+c%2+(3<a&a%2?e-46?8:d&6:c&6))+b%2+(4>a?b&6:a-5?a-6&&e-14?8:d&6:c&6)};
Ruby ,
153 ... 119117 bajtówWypróbuj online!
Jak to działa:
To jest punkt początkowy: przekonwertuj na BCD, przesuwając 3 bity w lewo, co działa w przypadku większości wzorów.
Zdobądź środkowe bity każdego skórka (i jeden dodatkowy bit trzeciego skórka, ale zamaskuj najmniej znaczący bit).
Jeśli trzecia cyfra jest mniejsza niż 10 (mniejsza niż 9, ponieważ i tak nigdy nie dbaliśmy o LSB), ustawiamy: jest to zwykły BCD, możemy wyprowadzić hex bez zmiany czegokolwiek
W przeciwnym razie wykonaj czarną magię, przesuwając kawałki i dodając magiczne liczby, aż uzyskamy pożądany rezultat.
źródło
Retina 0.8.2 ,
191181 bajtówWypróbuj online! Link zawiera przypadki testowe. Edycja: Zapisano 10 bajtów, nie dopełniając cyfr do 4 bitów, chyba że to konieczne. Wyjaśnienie:
Wstaw separatory, aby każdą cyfrę można było przekonwertować osobno na dziesiętne. To skutecznie obsługuje pierwsze dwa przypadki w tabeli konwersji.
Obsługuj ostatni (ósmy) przypadek w tabeli konwersji.
Obsługuj szósty i siódmy przypadek w tabeli konwersji.
Obsługuj piąty przypadek w tabeli konwersji.
Obsługuj trzeci i czwarty przypadek w tabeli konwersji.
Wykonaj konwersję binarną na dziesiętną.
źródło
Galaretka ,
51484039 bajtówWypróbuj online!
Algorytm
Z wyjątkiem indeksów list, wszystkie liczby całkowite w tej sekcji są zapisywane binarnie.
Kod
źródło
Python 2 , 157 bajtów
Wypróbuj online!
źródło
Czysty ,
238... 189 bajtów-2 bajty dzięki Neilowi
Wypróbuj online!
Pobiera „listę” 10 bitów w postaci 10 argumentów, używając bezpośredniej formuły do obliczenia wyniku.
źródło
i*(9*e+19*d+i*...)
, ten drugii*
wygląda niepotrzebne.Perl 5, 195 bajtów
Wypróbuj online
Wiem, że 195 bajtów to zdecydowanie za dużo dla tego konkursu, ale nie miałem pojęcia, jak dalej kompresować kod Perla. Propozycje?
Objaśnienie kodu
W bardziej czytelnej wersji intencja kodu powinna stać się widoczna:
W regułach kodowania DPD każda linia jest kodowana na wartość 18-bitową, segmentacja na (6,6, (2,2,2)) bity.
@p
dla 3-bitowych sekwencji, które mają być splatane do bitów 11-9, 7-5 i 3-1 wyniku.@p
jest zbudowana z bitów 9-8, 6-5, 3-2 danych wejściowych i liczby8
jako czwartego elementuNa przykład pierwszy numer na liście
16390
, który jest100000000000110
polem bitowym, zawiera następujące informacje:źródło
05AB1E , 84 bajty
Odpowiedź portu KimOyhus na 05AB1E.
Wypróbuj online!
Szorstkie wyjaśnienie:
źródło
05AB1E ,
104103101 bajtówZdecydowanie nie jest to odpowiedni język dla tego rodzaju wyzwań, ale cóż…
Wpisz jako ciąg, wyślij jako listę trzech cyfr.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Do rozważenia jest osiem następujących scenariuszy:
Najpierw podzielę (niejawne) dane wejściowe na kawałki wielkości
[2,1,2,1,3,1]
i przechowuję tę listę w rejestrze:Zobacz moją wskazówkę 05AB1E (rozdział Jak kompresować duże liczby całkowite? ), Aby zrozumieć, dlaczego tak
•3γã•
jest212131
Teraz najpierw zbudujemy cyfry 0 i 1 dla pierwszej cyfry wyniku. Wykorzystanie scenariuszy 1,2,3,7
'0'+1st+2nd
; i scenariusze 4,5,6,8 użycia'100'+2nd
:Następnie zbudujemy cyfry 0 i 1 dla drugiej cyfry wyniku. Wykorzystanie scenariuszy 1,2,4
'0'+3rd+4th
; wykorzystanie scenariuszy 3,5,7,8'100'+4th
; a scenariusz 6 wykorzystuje'0'+1st+4th
:Następnie zbudujemy cyfry 0 i 1 dla trzeciej cyfry wyniku. Scenariusze użycia 1,2
5th+6th
; scenariusz 3 zastosowania'0'+3rd+6th
; wykorzystanie scenariuszy 4,5'0'+1st+6th
; i scenariusze 6,7,8 użycie'100'+6th
:Teraz mamy wszystkie zera i jedynki na stosie, więc możemy przekonwertować je na trzy cyfry wyjściowe:
źródło