Język kompilatora bez wyraźnego akronimu, w skrócie INTERCAL , jest bardzo unikalnym językiem programowania. Wśród jego niepowtarzalnych cech znajdują się operatory binarne.
Dwa operatory binarne INTERCAL są przeplatane (znane również jako mingle ) i select . Przeplot jest reprezentowany przez zmianę (¢), a wybór jest reprezentowany przez sqiggle (~).
Przeplot działa poprzez pobranie dwóch liczb z zakresu 0-65535 i naprzemiennie ich bitów. Na przykład:
234 ¢ 4321
234 = 0000011101010
4321 = 1000011100001
Result: 01000000001111110010001001
Output: 16841865
Wybierz prace, biorąc dwie liczby z zakresu 0-65535, biorąc bity w pierwszym operandzie, które są w tej samej pozycji co 1s w drugim operandzie, i odpowiednio upakuj te bity.
2345 ~ 7245
2345 = 0100100101001
7245 = 1110001001101
Taken : 010 0 10 1
Result: 0100101
Output: 37
W tym wyzwaniu otrzymasz wyrażenie binarne za pomocą operacji przeplotu lub wyboru. Musisz obliczyć wynik, używając jak najmniejszej liczby bajtów.
Wyrażenie będą jako przestrzeń oddziela ciąg znaków, składający się z liczby całkowitej w 0-65535, przestrzeni albo ¢
czy~
, przestrzeni i liczbę całkowitą 0-65535.
Wejście i wyjście może odbywać się za pośrednictwem dowolnego standardowego systemu (STDIN, funkcja, wiersz poleceń itp.). Standardowe luki zabronione.
Przykłady:
5 ¢ 6
54
5 ~ 6
2
51234 ¢ 60003
4106492941
51234 ~ 60003
422
To jest golf golfowy - wygrywa najmniej bajtów. Powodzenia.
EDYCJA: Ponieważ niektóre języki nie obsługują symbolu zmiany (¢) INTERCAL, możesz zamiast tego użyć symbolu dużych pieniędzy ($), z karą 5 bajtów.
$
.FIVE ONE TWO THREE FOUR
? I czy dane wyjściowe nie powinny być zapisane cyframi rzymskimi?Odpowiedzi:
Pyth,
323129 bajtówWypróbuj online: Regular Input / Test Suite
Dzięki @isaacg za grę w golfa na jednym bajcie.
Wyjaśnienie:
źródło
hMfeT
sięsmmFd
, a następnie przesuwając powielaćs
poza trójskładnikowej. Ponadto twój bieżący kod to 32 bajty, a nie 33.Python 2,
115112 bajtówŁańcuch w drugim wierszu zawiera pojedynczy niedrukowalny znak
\x7d
, następny znak po~
.Wszystkie nadzieje na ładną, pojedynczą lambdę zostają zmiażdżone przez format wejściowy. Prawdopodobnie jest lepszy sposób na odczyt danych wejściowych. Wprowadź jak
"51234 ¢ 60003"
przez STDIN.Ta funkcja
f
łączy dwie następujące funkcje rekurencyjne:(-3 bajty za pomocą @xnor)
źródło
(a%2*2+b%2)/3**d
zapisuje 3 znaki, ale używa uzupełnieniad=1-c
. Czy masz jakiś sposób-~(3*c|b%2)
na uzupełnienie? W najgorszym wypadku traci 2 znaki3-3*d
. Formatand-~x+y
może byćandy-~x
tak długi, jaky
zaczyna się od symbolu lub liczby.(b%2+5&4-d)
. Dzięki!CJam, 31 bajtów
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
JavaScript (ES6), 103
117 119 124Edytuj teraz pracując z liczbami zamiast ciągów
(nie licząc wiodących spacji, nowych linii i komentarzy)
Przetestuj uruchomienie tego fragmentu w dowolnej przeglądarce zgodnej z EcmaScript 6 (w szczególności nie Chrome, a nie MSIE. Testowałem na Firefox, Safari 9 mogłaby działać)
źródło
Matlab,
119113 bajtówNie golfowany:
Przykłady:
źródło
R, 145 bajtów
Niegolfowane + wyjaśnienie:
źródło
Python 3,
174166148126Całkiem proste operacje na łańcuchach, a następnie konwersja z powrotem na liczbę całkowitą.
Ograniczone do liczb, które w systemie binarnym mają 99 cyfr (maks. 2 ^ 99-1 = 633825300114114700748351602687).
Dzięki, Sp3000 i Vioz!
Lub 165 znaków bez ograniczeń:
Nie golfowany:
źródło
zfill
zamiastrjust
wypełniania zeramia,b
, wystarczy umieścić go wzip
z*
ikoną, 2)(i if j=='1'else'') -> i[:j>'0']
3) Można używać to wskazówka , aby zaoszczędzić na drugiejif/else
Pyth, 43 bajty
Część mnie czuje się zdenerwowana, publikując tak długą odpowiedź Pyth'a na pytanie Isaacga ...: oP
Wyjaśnienie:
źródło
C,
127123 bajtów + 5 kar = 128scanf
liczy symbol Unicode jako więcej niż jedną postać, co bardzo komplikuje sytuację, więc stosuję karę 5-bajtową za używanie$
.Zmiany w stosunku do oryginalnej wersji to:
- Test na $ lub ~ został zmieniony z
q&2
naq%7
. To odwraca wartości prawda / fałsz, umożliwiając operatorowi $ kod przejście przed znakiem:
co oznacza, że zbiór nawiasów można wyeliminować.-Pętla
i
odlicza teraz moc 2, która jest dłuższa, ale pozwala>>
na zastąpienie/
i zapisuje niektóre nawiasy.Oryginalna wersja 127 bajtów
Poszedłem z pojedynczą pętlą z warunkami w środku, aby uniknąć narzutu dwóch pętli. W obu przypadkach przesuwam bity operandów do bitu 1 i buduję wynik od najbardziej znaczącego do najmniej znaczącego bitu, przesuwając w lewo wynik (mnożenie przez 2 lub 4).
źródło
main
przyczynq
uszkodzenia na mojej maszynie, co jest dziwne. Oczekuję, że prawdziwy problem jest z tymscanf
, ale z tego powodu zostawiłem je jako zwykłe deklaracje.q
gwarantowane jest zero, ale przy deklaracji jako parametrze funkcjiq
zawiera śmieci 32-bitowe. Nie stanowiłoby to problemu, gdybym przypisał wartośćq
, alescanf
z"%c"
nadpisaniem tylko najmniej znaczących 8 bitów śmieci, pozostawiając pozostałe 24 niezdefiniowane. Mogę mieć szczęście na innym kompilatorze!K5,
5352 bajtyWersja 53-bajtowa:
Nadal potrzebuje trochę więcej gry w golfa.
źródło
CJam,
6150464134 bajtówDzięki @Dennis za wskazanie 4-bajtowego golfa.
Wypróbuj online .
źródło
]{}/
jest noop.Haskell, 77
dane wejściowe są podawane przez zastosowanie danych wejściowych do funkcji / operatorów
?
i¢
zdefiniowane w kodzie (Haskell nie może zdefiniować operatora~
z przyczyn technicznych).w zasadzie działa stare podejście rekurencyjne.
źródło
J 173
oczekuje jednego wiersza danych wejściowych
wejście ma się zakończyć po nowej linii z EOF
źródło
JavaScript ES6 (3 argumenty)
141138136121119 bajtówTest:
JavaScript ES6 (1 argument)
135133 bajtówTest:
PS: Nowa linia jest liczona jako 1 bajt, ponieważ można ją zastąpić
;
.źródło
Python 3, 157 bajtów
Pełna i objaśniająca wersja znajduje się na moim pastebin .
źródło
e
tylko raz, nie możesz tego po prostu wstawić?Mathematica, 155 bajtów
Ocenia anonimową funkcję, biorąc ciąg znaków jako dane wejściowe. Dodano podział linii dla zachowania przejrzystości.
f
ig
konwersja do / z bazy 2.Riffle
robi dokładnie to, co powinno się przeplatać . Chciałem użyćSelect
do wyboru, aleCases
niestety jest lepiej. Ostatnia linia to trochę oszustwo; spacje są zmieniane, na~
które jest operatorem matematycznym, a następnie ciąg znaków jest ewaluowany.źródło