Lubię grać w golfa dc
, ale czasami jestem sfrustrowany, ponieważ dc
nie mam operacji bitowych.
Wyzwanie
Zapewnić cztery nazwach funkcji, które implementują odpowiednik operacji c bitowe &
, |
, ~
oraz ^
(bitowe AND, OR, NOT i XOR). Każda funkcja przyjmuje dwa operandy ( ~
zajmuje tylko jeden), które są co najmniej 32-bitowymi liczbami całkowitymi bez znaku. Każda funkcja zwróci liczbę całkowitą bez znaku o tej samej szerokości bitów co argumenty.
Ograniczenie
Możesz używać tylko operacji obsługiwanych przez dc
. To są:
+
-
*
/
Dodawanie, odejmowanie, mnożenie i dzielenie arytmetyczne~
modulo (lub divmod, jeśli Twój język to obsługuje)^
potęgowanie|
modułowe potęgowaniev
pierwiastek kwadratowy>
>=
==
!=
<=
<
standardowe operatory równości / nierówności>>
<<
operatorzy zmiany bitów.dc
nie ma ich, ale ponieważ są one trywialnie realizowane w kategoriach dzielenia / mnożenia przez potęgi 2, pozwolę na to.
Struktury kontrolne mogą dc
być niezgrabnie budowane przy użyciu (rekurencyjnych) makr i (nie) operacji równości. Możesz używać dowolnych wbudowanych struktur kontrolnych, które posiada Twój język.
Możesz także użyć operatorów logicznych &&
||
!
, nawet jeśli nie są one bezpośrednio dostępne w dc
.
Ci nie muszą stosować operatory bitowe &
, |
, ~
i ^
ani żadnych funkcji, które implementują je trywialnie.
Ponadto nie wolno używać wbudowanych operatorów lub funkcji konwersji ciągów bazowych.
Zastanów się też nad udostępnieniem programu testowego lub fragmentu kompilatora online (nieuwzględnionego w wynikach golfa), aby pomóc w weryfikacji odpowiedzi.
źródło
Odpowiedzi:
C 134
Preprocesor C jest przyjemny w nadużywaniu. Zasadniczo makro 3 określa funkcje
a
,o
ix
naand
,or
ixor
odpowiednio. Jedyną różnicą w algorytmie dla tych operacji są kryteria ustawienia bitu w wyniku.not
jest funkcjąn
.Program testowy (zajmuje dużo czasu, wcale nie spędziłem czasu na jego optymalizowaniu, ale testuje każdy możliwy przypadek testowy, oprócz tych związanych z MAX_INT):
źródło
ised 76 bajtów
ised również nie ma operacji bitowych - zwykle denerwujących, ale teraz mile widzianych, ponieważ naprawdę potrzebujemy je wdrożyć.
Funkcje będą przechowywane w ponumerowanych gniazdach pamięci (bez pełnych nazw).
Konwersja do iz pliku binarnego:
NIE może być,
@1{:$6::{1-$5::x}:}
ale oczywiście łatwiej jest po prostu odjąć:LUB:
I:
XOR:
To doprowadziłoby nas do 156 bajtów (z nowymi liniami i średnikami). Kod testowy to po prostu (NOT, OR, AND, XOR z rzędu, znaleziony pod nazwami 1 $, 2 $, 3 $, 4 $):
Ale oczywiście LUB i NIE to wszystko, czego naprawdę potrzebujemy, a sprawy można uprościć:
To 109 znaków. Kiedy znaki nowej linii i średniki są pomijane, a przy odrobinie golfa mamy 76 znaków:
źródło
Nim
(537)(490)Nim Compiler 0.10.2
Szukałem powodu, żeby się go nauczyć, więc zaczynamy.
Do gry w golfa wykorzystałem zmienne parametry i niejawne zwroty. Zmienne parametry, zgodnie z dokumentacją, są mniej wydajne w stosie. Osobiście uważam, że ukryte zwroty są trudniejsze do odczytania i prawdopodobnie użyłbym ich tylko w trywialnych procedurach.
Jeśli chodzi o algorytmy, są one dość proste. Dla wszystkich operacji oprócz NIE porównujemy każdy bit i ręcznie porównujemy je z naszą oczekiwaną tabelą prawdy. Ustaw każdy bit zgodnie z potrzebami po drodze w naszej zmiennej wyjściowej. W Nim wynikiem jest niejawna wartość zwracana.
Nie byłem pewien, czy wolno nam używać wbudowanego OR i AND do zapewnienia dwóch warunków boolowskich, więc na ich miejsce została zastosowana procedura notZero.Wciąż szukam lepszej metody ...
Oto nieskomplikowana wersja plus pełna uprząż testowa do uruchomienia na własnej maszynie.
Jeśli chcesz po prostu uruchomić kilka wejść, oto lite przypadku testowego .
źródło
CJam, 71 bajtów
Wyjaśnienie
Zestaw testowy
Ten kod testuje 100-krotnie każdą z moich funkcji i, lub nie, i xor z równomiernie rozmieszczonymi 64-bitowymi niepodpisanymi wejściami i porównuje wynik z wynikiem wygenerowanym przez wbudowanego operatora. Z powodu nieuzasadnionego korzystania z operatora eval jest on dość wolny i może zająć około minuty z tłumaczem online. Ale jeśli wszystko pójdzie dobrze, wykonanie powinno zakończyć się bez wyjścia, ponieważ drukowane są wszelkie znalezione rozbieżności.
źródło
JavaScript
294267Był w stanie zgolić jeszcze kilka bajtów dzięki sugestiom @ AlexA. i @ kennytm.
Funkcje:
przykład:
wynik:
źródło
for
i zastąpićfunction B(n,m,t)
zB=(n,m,t)=>
. Podobnie w przypadku innych funkcji.4*(1<<30)
dla 4294967296 i-1>>>0
dla 4294967295. ② jestvar
naprawdę konieczne tutaj?(n,m)=>B(n,m,'a')
(n,m)=>{return B(n,m,'a')}