„Dopasuj liczby”
Sam ma „genialny” pomysł na kompresję! Możesz pomóc?
Oto podsumowanie schematu kompresji Sama. Najpierw weź podstawową reprezentację 10 dowolnej liczby naturalnej ściśle mniejszej niż 2 ^ 16 i zapisz jako ciąg binarny bez zer wiodących.
1 -> 1 9 -> 1001 15 -> 1111 13 -> 1101 16 -> 10000 17 -> 10001 65535 -> 111111111111111
Teraz zamień dowolną grupę jednego lub więcej zer na pojedyncze zero. Wynika to z faktu, że liczba się zmniejszyła. Twój ciąg binarny będzie teraz wyglądał tak.
1 -> 1 -> 1 9 -> 1001 -> 101 15 -> 1111 -> 1111 13 -> 1101 -> 1101 16 -> 10000 -> 10 17 -> 10001 -> 101 65535 -> 111111111111111 -> 111111111111111
Teraz konwertujesz ciąg binarny z powrotem do reprezentacji podstawowej 10 i wyprowadzasz go w dowolnym akceptowalnym formacie. Oto twoje przypadki testowe. Pierwsza liczba całkowita reprezentuje dane wejściowe, a ostatnia liczba całkowita reprezentuje dane wyjściowe. Pamiętaj, że niektóre liczby się nie zmieniają, dlatego można je nazwać „dopasowanym”
1 -> 1 -> 1 -> 1 9 -> 1001 -> 101 -> 5 15 -> 1111 -> 1111 -> 15 13 -> 1101 -> 1101 -> 13 16 -> 10000 -> 10 -> 2 17 -> 10001 -> 101 -> 5 65535 -> 1111111111111111 -> 1111111111111111 -> 65535 65000 -> 1111110111101000 -> 11111101111010 -> 16250
Możesz używać dowolnego języka, ale pamiętaj, że Sam nienawidzi standardowych luk. To jest kod golfowy, więc kod może być tak krótki, jak to możliwe, aby zrobić miejsce dla „skompresowanych” liczb.
Uwaga: To NIE jest akceptowalny schemat kompresji. Korzystanie z tego spowoduje natychmiastowe zwolnienie.
Potrzebne cytowanie: Nie przypisuję sobie tej koncepcji. Pochodzi z bloga @Conor O 'Brien tutaj zobacz ten OEIS pasujących numerów. https://oeis.org/A090078
10000
?Odpowiedzi:
05AB1E ,
86 bajtówWyjaśnienie
Wypróbuj online
Zaoszczędzono 2 bajty dzięki Adnan
źródło
„00'0
przez00¬
:).Narzędzia Bash + GNU, 27
Wejście odczytane ze STDIN.
źródło
dc
:)JavaScript (ES6), 41 bajtów
źródło
Meduza , 20 bajtów
Wypróbuj online!
Wyjaśnienie
i
jest wejściem.b
konwertuje go na binarny (lista cyfr)\d
z argumentami,2
a lista cyfr ma zastosowanied
(cyfry binarne do liczby) do każdego podłańcucha o długości 2 na liście cyfr.*
przyjmuje podpis wyników: 00 idzie do 0, wszystko inne do 1.,1
odmierza 1 do końca, więc ostatnia cyfra nie jest tracona.# S
wybiera zbi
cyfr, które mają 1 na powyższej liście: te, które nie są lewymi połówkami 00.d
konwertuje z powrotem na liczbę ip
drukuje wynik.źródło
Python 2, 36 bajtów
Bezpośrednia rekurencyjna implementacja bez wbudowanych konwersji bazowych ani operacji łańcuchowych. Mniej golfa:
Kiedy
n
jest wielokrotnością 4, kończy się na dwóch zerach w postaci binarnej, więc przecinamy jeden przez dzielenie podłogi przez 2. W przeciwnym razie dzielimy sięn
na(n%2) + 2*(n/2)
, zostawiamy ostatnią cyfrę binarną wn%2
spokoju i powtarzamy na pozostałych cyfrachn/2
.źródło
n%2
zbędny?|n
daje złe wyniki.(n%4>0)|n%2
z(n%4>0)
.(f(n/2)<<(n%4>0)) | n%2
.Bash (sed + bc),
605543 bajtówedytować:
sed -E 's/0+
nased 's/00*
i zmieniono echo i potok używane do przekazania wartości do bc za pomocą<<<
.przykład:
źródło
echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bc
jest o 2 bajty krótszyecho $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]
. Aledc
itr
uczyń to znacznie krótszym .bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
tr -s 0
zamiast sed, możesz zejść do 36 bajtówPerl 6 ,
3127 bajtówWyjaśnienie:
Przykład:
źródło
MATL,
1198 bajtówTa wersja działa tylko w MATLAB, ponieważ
strrep
w MATLAB może obsługiwać dane logiczne. Oto wersja, która będzie działać w Octave (9 bajtów) (a tym samym interpreter online), który jawnie przekazuje logiczne dane wejściowe do pisaniadouble
.Wypróbuj online
Wyjaśnienie
źródło
Python 3,
55, 50 bajtów.Zaoszczędzono 4 bajty dzięki Sp3000.
Całkiem proste rozwiązanie.
źródło
0b
ieval
zamiast tego?lambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import re
JavaScript (ES6), 40 bajtów
źródło
console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0)))
.N=>
co uczyniłoby ją poprawnym przesłaniem funkcji.Właściwie 14 bajtów (niekonkurujące)
Wypróbuj online!
To zgłoszenie nie jest konkurencyjne, ponieważ
Æ
po opublikowaniu tego wyzwania dokonano poprawki błędu .Wyjaśnienie:
źródło
Rubinowy,
3531 bajtów-2 bajty dzięki @Doorknob
Zobacz na repl.it: https://repl.it/CnnQ/2
źródło
Galaretka ,
137 bajtów6 bajtów dzięki Zgarbowi za jego algorytm .
Wypróbuj online!
źródło
PHP,
5351 bajtówPobiera argument z konsoli.
Dzięki:
@manatwork zamień „0” na 0
źródło
"0"
i0
są obsługiwane w ten sam sposób.Perl, 38 + 1 (
-p
) = 39 bajtówPotrzebuje
-p
flagi do uruchomienia (dodałem-l
flagę, aby była bardziej czytelna, ale inaczej nie jest potrzebna):Zauważ wiele do powiedzenia na temat kodu: konwertuje liczbę na binarną (
sprintf"%b"
), a następnie zastępuje bloki zer tylko jednym zerem i konwertuje wynik na dziesiętny (oct"0b".
).źródło
C #,
11291 bajtów-8 bajtów dzięki TuukkaX
źródło
int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}
- 94 bajty przy użyciu wyrażenia regularnego. Widziałem wiele rozwiązań C #, które nie obejmują,System.Text.RegularExpressions
więc może to tutaj jest dozwolone ...?int f(int x){return Convert.ToInt32(Regex.Replace(Convert.ToString(x,2),"0+","0"),2);}
86 bajtów.Java, 75
Program testowy:
źródło
PARI / GP ,
5443 bajtyźródło
PowerShell v2 +, 69 bajtów
( żądanie funkcji Krótszy sposób konwersji do / z pliku binarnego w PowerShell )
Pobiera dane wejściowe
$args[0]
, wykorzystuje wbudowany .NET[convert]::ToString(int,base)
do konwersji wejściowej liczby całkowitej na binarny ciąg podstawowy. To jest filtrowane przez,-replace
aby usunąć wszystkie ciągi jednego lub więcej zer do po prostu0
. Ten wynikowy ciąg jest wysyłany z powrotem w drugą stronę,[convert]::ToInt32(string,base)
aby przekształcić plik binarny z powrotem na liczbę całkowitą. Ta liczba całkowita pozostawia się w potoku, a dane wyjściowe są niejawne.Przypadki testowe
źródło
Odwołanie do implementacji w SILOS „tylko” 417 bajtów
Grał w golfa
Oto implementacja referencyjna całkowicie nie golfowa. Jako funkcja dodatkowa generuje kroki potrzebne do uzyskania odpowiedzi.
Na żądanie transpozycja została usunięta. Zapoznaj się z historią edycji, aby ją odzyskać, w przeciwnym razie przejdź do tego repozytorium dla tłumacza.
Próbka wyjściowa dla 65000
źródło
Pyth, 12
Online.
źródło
Siatkówka , 30 bajtów
Wypróbuj online!
I tutaj myślałem, że Retina będzie jedną z pierwszych odpowiedzi ...
źródło
Java,
152143138 bajtówźródło
Integer i;
część jest prosta i fantastyczna!Dyalog APL , 19 bajtów
Wypróbuj APL online!
Ta funkcja jest naprawdę „na szczycie” dwóch funkcji, pierwszą funkcją jest:
2∘⊥⍣¯1
odwrotny od binary- do -decimal konwersji, tj binary- z -decimal konwersjidwóch
2
wiąże∘
się -to-dziesiętnej⊥
powtórzyć operację
⍣
jeden ujemny czasu¯1
(to znaczy jednocześnie, lecz odwrócone)W drugiej funkcji powyższy wynik binarny jest reprezentowany przez
⍵
:{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵
Wartość logiczna dla miejsca, w którym {0, 0} zaczyna się od ool~
Negacja logiczna, więc teraz mamy but wszędzie, ale przy zerowych zerach w zerowych biegach⍵/⍨
używamy tego do filtrowania ⍵, więc to usuwa nasze niechciane zera2⊥
konwertowane z binarnego na dziesiętnyźródło
TSQL, 143 bajty
Nieużywanie wbudowanych poleceń do konwersji zi na pliki binarne.
Gra w golfa:
Nie golfowany:
Skrzypce
źródło
CJam, 16 lat
Wypróbuj online
Jest dość długi z powodu braku wyrażenia regularnego.
Wyjaśnienie:
źródło
Java, 64 bajty
Program testowy
źródło
CJam , 23 bajty
Wypróbuj online!
Wyjaśnienie
źródło
Rubinowy,
3735 bajtówZaoszczędzono dwa bajty dzięki manatwork.
Naiwne podejście. (:
źródło
"0"
, patrz punkt 2. sepp2k jest końcówki . Jeśli chodzi o to.to_i(2)
, że nie ma dwuznaczności co do tego, gdzie należy parametr, nawiasy są opcjonalne.C, 37 bajtów
źródło