Niech f
będzie funkcją, która mapuje bitfield ( {0 1}
) o rozmiarze n+1
na pole bitowe o wielkości n
poprzez zastosowanie XOR
do i
th i i+1
th bitu i zapisanie wyniku w nowym polu bitowym.
Przykład: f("0101") = "111"
Nieformalne obliczenia:
0 XOR 1 = 1
1 XOR 0 = 1
0 XOR 1 = 1
Niech f_inverse
będzie funkcją odwrotną do f
. Ponieważ odwrotność nie jest unikalna, f_inverse
zwraca jedno prawidłowe rozwiązanie.
Dane wejściowe: pole bitowe jako ciąg znaków (tj. "0101111101011"
) I podana liczba naturalnak
Dane wyjściowe: pole bitowe jako ciąg, dzięki czemu ciąg zawiera wynik, jeśli f_inverse
zostanie zastosowany k
czas na wejściowym polu bitowym. (tj. f_inverse(f_inverse(f_inverse(input)))
)
Kryteria wygranej: najmniej znaków
Premia:
-25
Znaki, jeśli f_inverse
nie są stosowane rekurencyjnie / iteracyjnie, zamiast tego łańcuch wyjściowy jest obliczany bezpośrednio
Skrypt testowy:
a = "011001"
k = 3
def f(a):
k = len(a)
r = ""
for i in xrange(k-1):
r += str(int(a[i]) ^ int(a[i+1]))
return r
def iterate_f(a, k):
print "Input ", a
for i in xrange(k):
a = f(a)
print "Step " + str(i+1), a
iterate_f(a, k)
Możesz go wkleić na przykład tutaj, a następnie wypróbować.
{0-1}
-Bitfields? Nie rozumiem też definicjif
, skądi
pochodzi? Jaki jest drugi argument XOR? skąd111
pochodzimy0101
?i
?"0 XOR 1" = 1 "1 XOR 0" = 1 "0 XOR 1" = 1
nic nie wyjaśnia: wiem, jak działa XOR, ale czym dokładnie jesteśmy XORing i gdzie przechowujemy wynik?f([a,b,c,d]) = [a^b, b^c, c^d]
. I chce odwrotność tej funkcji, to znaczyf'([x,y,z]) = [a,b,c,d]
takie, żea^b=x
,b^c=y
,c^d=z
.Odpowiedzi:
Pyth
3330-25 = 5 bajtówUruchom go przez wejście takie jak stdin (interpreter online: https://pyth.herokuapp.com/ ):
a wynik zostanie zapisany na standardowe wyjście.
To jest bezpośrednie tłumaczenie:
Python 2,
12711879 - 25 = 54 bajtyNazwij to tak
i("111", 3)
, a wynik zostanie zapisany na standardowe wyjście.Zauważ, że spodziewamy się, że k nie będzie zbyt duży, ponieważ dla celów gry w golfa wewnętrzna pętla będzie działać przez O (2 k ) razy.
Myślę, że zwykle nazywamy tę operację „xorshift” lub coś w tym rodzaju. Jeśli wyrażamy dane wejściowe jako liczby całkowite big-endian, to funkcja f jest po prostu:
Jeśli zastosujemy dwukrotnie f , otrzymamy:
Jednak zastosowanie 3 razy będzie miało inny wzór:
4 razy wróć do podstawowej formy:
I tak dalej:
Zauważ, że jeśli wybierzemy wystarczająco duże 2 k , to (x ≫ 2 k ) = 0, co oznacza f 2 k (x) = x, a odwrotność jest trywialnie funkcją tożsamości!
Więc strategii znalezienia f -k (x) bez wywoływania f -1 (x) w ogóle jest:
Znajdź K taki, że:
Wyraźne f -k (x) = f -K + (KK), (x) = f -K (F KK (X)) = f Kk (x)
Zatem wynik
f
nazywa się czasami Kk25 znaków zysku: p
Aktualizacja 1 : Użyto reprezentacji ósemkowej zamiast binarnej, abyśmy mogli użyć
%
formatowania do zapisania dużej ilości bajtów.Aktualizacja 2 : Wykorzystaj okresową strukturę
f
. Wycofano wersję iteracyjną, ponieważ wersja nie iteracyjna jest krótsza nawet bez premii -25 bajtów.Aktualizacja 3 : Zredukowano 3 bajty z Pyth, dzięki isaacg!
źródło
Jiz8K+lzQ%"%0*o",KuxG/G8rQ^2KJ
CJam,
1514 bajtówPrzyjmuje dane wejściowe jak
Sprawdź to tutaj.
Wyjaśnienie
Wynik jest automatycznie drukowany na końcu programu.
Mówię „ciąg / tablica”, ponieważ zaczynam od łańcucha (który jest tylko tablicą znaków), ale wciąż biorę XOR między nimi i między liczbami.
Character Character ^
podaje liczbę całkowitą (na podstawie XOR punktów kodowych)Character Integer ^
iInteger Character ^
daje znak (na podstawie XOR liczby z punktem kodowym - interpretowane jako punkt kodowy). IInteger Integer ^
oczywiście podaje tylko liczbę całkowitą.Więc rodzaje lecą wszędzie, ale na szczęście, kiedy mam całkowitą to albo
0
czy1
i kiedy mam postać to albo'0
a'1
, a wynik jest zawsze pożądana jeden (w obu typów). Ponieważ ciągi znaków to tylko tablice znaków, mieszanie znaków z cyframi nie stanowi żadnego problemu. Na koniec, gdy wszystko jest drukowane, znaki nie mają specjalnych separatorów, więc na wynik nie ma wpływu, który bit jest reprezentowany jako liczba lub znak.źródło
J, 17 znaków
Zawsze używaj 0 jako cyfry wiodącej.
Zaczynając od stanu 128 1 w górnym rzędzie (po lewej) i losowego (po prawej), pokazując ostatnie 128 cyfr przez pierwszą iterację 129.
źródło
APL 11
Wyjaśnienie:
Spróbuj na tryapl.org
źródło
≠\
zamiast tego nie działa2|+\
?((0,≠\)⍣⎕)⎕
, otrzymam nieprawidłowy token. Tryapl nie może obsłużyć danych wejściowych?CJam, 25-25 = 0 bajtów
To tylko prosty port CJam odpowiedzi GolfScript poniżej, ponieważ po przeczytaniu odpowiedzi Martina Büttnera zdałem sobie sprawę, że mogę zaoszczędzić jeden bajt ze względu na obsługę przez CJam liczb całkowitych i typów znaków. (Zasadniczo CJam nie wymaga
1&
użycia siły do wymuszenia znaków ASCII na bity w kodzie GolfScript, ale wymaga wcześniejszegoq
odczytania danych wejściowych.) Zwykle uważam taki trywialny port za tani trick, ale osiągnięcie zerowego wyniku sprawia, że warto IMO.W każdym razie ten program działa dokładnie tak, jak oryginalny program GolfScript poniżej, więc zapoznaj się z jego opisem i instrukcjami użytkowania. Jak zwykle możesz przetestować wersję CJam za pomocą tego internetowego tłumacza .
GolfScript, 26-25 = 1 bajt
To rozwiązanie iteruje ciąg wejściowy tylko raz, więc uważam, że kwalifikuje się do premii -25 bajtów. Działa poprzez wewnętrzne utrzymanie tablicy k- elementów, która przechowuje bieżący bit każdej z k -iteracji.
Dane wejściowe należy podawać za pomocą stdin, w formacie
"1111111" 3
, tj. Jako cytowany ciąg znaków0
i1
znaki, po których następuje liczba k . Wyjście będzie na standardowe wyjście, jako ciąg bitów bez cudzysłowów.Przetestuj ten kod online. (Jeśli program przekroczy limit czasu, spróbuj uruchomić go ponownie; serwer Web GolfScript jest znany z przypadkowych przekroczeń limitu czasu).
Oto rozszerzona wersja tego programu z komentarzami:
Zasadniczo, podobnie jak większość iteracyjnych rozwiązań, kod ten można rozumieć jako zastosowanie powtarzania
b i , j : = b i , ( j −1) ⊕ b ( i −1), ( j −1) ,
gdzie b 0, j jest j -ty bit wejściowy (na j ≥ 1), b k , j jest j -tego bitu wyjściowego, a b I , 0 = 0 założenia. Różnica polega na tym, że podczas gdy rozwiązania iteracyjne w rzeczywistości obliczają rekurencję „wiersz po rzędzie” (tj. Najpierw b 1, j dla wszystkich j , a następnie b 2, j itd.), To rozwiązanie to oblicza kolumnę według kolumna „(lub dokładniej„ przekątna po przekątnej ”), pierwsze obliczenia b i , i dla 1 ≤ i≤ k , następnie b i , i +1 , następnie b i , i +2 itd.
Jedną (teoretyczną) zaletą tego podejścia jest to, że w zasadzie ta metoda może przetwarzać dowolnie długi ciąg wejściowy przy użyciu tylko pamięci O ( k ). Oczywiście interpreter GolfScript automatycznie czyta wszystkie dane wejściowe do pamięci przed uruchomieniem programu, w większości negując tę zaletę.
źródło
Python,
9478Zostanie wykonany przynajmniej raz, a tym samym daje ten sam wynik dla
n=0
in=1
Stara wersja, która konwertuje ciąg na tablicę numeryczną i „integruje” moduł 2
źródło
Python 2, 68
Całkowicie zwrotne rozwiązanie. Łatwiej to zrozumieć, jeśli jest podzielony na dwie funkcje
gdzie
f
oblicza kolejne różnice ig
komponuje sięf
ze sobą n razy.Funkcja
f
oblicza skumulowane sumy XORl
, które są operacją odwrotną do kolejnych różnic XOR. Ponieważ dane wejściowe są podawane jako ciąg, musimy wyodrębnićint(l[0])
, ale zrób to krócej w porównaniu z ciągieml>='1'
.Python 2, 69
Iteracyjne rozwiązanie wykorzystujące
exec
pętlę okazało się 1 znak dłużej.Może istnieje krótszy sposób radzenia sobie ze sznurkiem. Gdybyśmy mogli mieć wejścia / wyjścia jako listy liczb, zaoszczędziłoby to 5 znaków
źródło
Perl 5, 34
Parametry podane na standardowym wejściu oddzielone spacją.
źródło
JavaScript ES6, 47 znaków
Nawiasem mówiąc, nie ma efektów ubocznych :)
źródło
C # -
178161115 znakówNie golfowany z uprzężą
źródło
CJam, 20 bajtów
Dane wejściowe są jak
"111" 3
Wypróbuj online tutaj
źródło