To był inspirowany przez Problem 13 - Non-Powtarzanie Binary z niedawnym konkursie HP CodeWars.
Powiedzmy, że weźmy losową liczbę dziesiętną
727429805944311
i spójrz na jego reprezentację binarną:
10100101011001011111110011001011101010110111110111
Teraz podziel binarną reprezentację na podsekwencje, gdzie cyfry 0
i 1
naprzemiennie.
1010 010101 10 0101 1 1 1 1 1 10 01 10 0101 1 1010101 101 1 1 1 101 1 1
I zamień każdą podsekwencję z powrotem na dziesiętną.
10 21 2 5 1 1 1 1 1 2 1 2 5 1 85 5 1 1 1 5 1 1
Zadanie
Weź jedną dodatnią liczbę całkowitą jako dane wejściowe i wyjściowe, a następnie wyślij sekwencję liczb całkowitych dodatnich uzyskanych w powyższym procesie.
Detale
- Dane wejściowe i wyjściowe muszą być dziesiętne lub jednostkowe.
- Liczby na wyjściu muszą być rozdzielone w rozsądny, czytelny dla człowieka sposób, i muszą być w postaci dziesiętnej lub jedności. Brak ograniczeń białych znaków. Prawidłowe style wyjściowe:
[1,2,3]
,1 2 3
,1\n2\n3
gdzie\n
są literalne znaki nowej linii, itp
Przypadki testowe
Input | Output
0 | 0
1 | 1
2 | 2
3 | 1 1
4 | 2 0
5 | 5
6 | 1 2
7 | 1 1 1
8 | 2 0 0
9 | 2 1
10 | 10
50 | 1 2 2
100 | 1 2 2 0
1000 | 1 1 1 1 10 0 0
10000 | 2 1 1 2 0 2 0 0 0
12914 | 1 2 2 1 1 2 2
371017 | 5 42 10 2 1
Uwaga dodatkowa: wszystkie liczby na wyjściu powinny mieć postać (2^k-1)/3
lub 2*(2^k-1)/3
. Oznacza to, że w OEIS 0 1 2 5 10 21, 42, 85, 170, ...
jest A000975 .
code-golf
sequence
base-conversion
binary
subsequence
El'endia Starman
źródło
źródło
|tac
pozostanie w mojej odpowiedzi :)Odpowiedzi:
Pyth,
1716 bajtów1 bajt dzięki Jakube
Demonstracja
Ładne, sprytne rozwiązanie. Używa mniej znanych funkcji Pytha, takich jak
x<int><list>
ic<str><list>
.źródło
tJ
przez+dJ
można usunąćhM
.Mathematica, 47 bajtów
Nie golfowany:
Split[list,f]
dzieli listę na wiele list, łamanie w pozycji międzya
ib
ifff[a,b]
nie zwracaTrue
.FromDigits[n,2] => Fold[#+##&,n]
to zgrabna wskazówka od alephalpha.źródło
Python, 86 bajtów
Ponieważ zostałem okropnie wystrzelony w Pyth, zróbmy to jeszcze raz w Pythonie.
Wypróbuj tutaj!
Wyjaśnienie
Zaczynamy od konwersji liczby wejściowej
n
na ciąg binarny.bin(n)[2:]
zajmuje się tym. Musimy odrzucić pierwsze 2 znaki tego ciągu, ponieważbin()
zwraca ciąg w formacie0b10101
.Następnie musimy zidentyfikować granice podsekwencji. Można to zrobić za pomocą wyrażenia regularnego,
(?<=(.))(?=\1)
które pasuje do pozycji zerowej długości w łańcuchu, które mają tę samą liczbę po lewej i prawej stronie.Oczywistym sposobem na uzyskanie listy wszystkich podsekwencji byłoby użycie,
re.split()
które dzieli ciąg znaków na określone wyrażenie regularne. Niestety ta funkcja nie działa dla dopasowań o zerowej długości. Ale na szczęściere.sub()
tak jest, więc po prostu zamieniamy te dopasowania zerowej długości spacjami i dzielimy ciąg znaków na te później.Następnie musimy tylko parsować każdy z tych podsekwencji z powrotem do liczby dziesiętnej za pomocą
int(s,2)
i gotowe.źródło
Galaretka, 12 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Narzędzia Bash + GNU, 51
Dane pobrane z STDIN.
dc -e2o?p
odczytuje wejściową liczbę całkowitą ze STDIN i wyprowadza ciąg 2 bazowysed -r ':;s/(.)\1/\1 \1/;t'
dzieli ciąg znaków base 2 spacją wszędzie tam, gdzie są takie same kolejne cyfrydc -e2i?f
odczytuje podzielony plik binarny za jednym razem, umieszczając każdą część na stosie, a następnief
zrzuca całydc
stos (liczby wyjściowe w odwrotnej kolejności) ...tac
.źródło
JavaScript (ES6) 58
62 63Edytuj 1 bajt zapisany thx @ETHproductions
Edytuj 4 bajty zapisane thx @Neil
źródło
/(01)*0?|(10)*1?/g
, czy może to coś zepsuło?x=>'0b'+x-0+' '
aby zapisać bajt./((.)(?!\2))*./g
oszczędza ci fajne 4 bajty.Pyth, 26 bajtów
Wypróbuj tutaj!
Wyjaśnienie
Ponieważ funkcja split () Pythona nie dzieli się na dopasowania o zerowej długości, muszę zamienić te dopasowania spacją i podzielić wynik na tym.
źródło
Pyth,
2221 bajtówWypróbuj online: demonstracja
Naprawdę żmudne zadanie w Pyth.
Wyjaśnienie:
źródło
05AB1E , 18 bajtów
Kod:
Wyjaśnienie:
Wypróbuj online!
Wykorzystuje kodowanie CP-1252 .
źródło
MATL ,
1817 bajtówWypróbuj online!
źródło
zsh,
676355 bajtówNie wiem dlaczego, ale to nie działa w Bash.
Dzięki Dennis za 8 bajtów!
źródło
for
składnia. ... Czekaj, nie mafor
?for i in `grep -oP '1?(01)*0?'<<<$[[##2]$1]`;<<<$[2#$i]
.PHP,
Widok rozstrzelony171168162160158121120131124118116113112 112 bajtówUżyj
d(int)
i jesteś wyłączony, wynik jestecho
ciągiem edint
oddzielonym spacją.Edycje:
-3: Przeniesiono
$b
definicję dostrlen()
wywołania.-6: Usunięto
$c
instancję.-2: W końcu naprawiono problem konkatenacji.
-2: Brak nawiasów pojedynczej linii
for()
.-37: Całkowity przegląd. Iść z
Array
kawałkami zamiast powtarzanychArray
->String
->Array
połączeń.-1: Podstępny
$c
reset.+11: Bugfix. Brakowało ostatniego kawałka. Już nie.
-7: Nie musisz
$d
w ogóle tworzyć instancji ? Miły.-6:
return
->echo
.-2: Chrupanie
$c
.-3:Ternary, moja pierwsza miłość.
-1: Podstępny podstępny
$u
.źródło
function d($i){for(;$d<$l=strlen($b=decbin($i));print$u==$b[++$d]||$d==$l?bindec($c).$c=" ":"")$c.=$u=$b[$d];}
.Wypukły 0,2+, 25 bajtów
Convex to nowy język, który rozwijam, oparty w dużej mierze na CJam i Golfscript. Tłumacz i IDE można znaleźć tutaj . Dane wejściowe to liczba całkowita w argumentach wiersza poleceń. Wykorzystuje to kodowanie CP-1252 .
Wyjaśnienie:
źródło
Java 8,
127119 bajtówPrawdopodobnie istnieje lepsze wyrażenie regularne do podziału łańcucha. Nie jestem biegły w wyrażeniach regularnych, ale będę eksperymentował.
-8 bajtów dzięki @FryAmTheEggman
źródło
APL (APL) ,
2125 bajtówTeraz obsługuje również 0.
Wypróbuj online!
2⊥⍣¯1⊢
przekonwertować na base-2, używając tyle bitów, ile potrzeba (lit. odwrócona konwersja z base-2){
…}
Zastosuj następującą anonimową funkcję0::
jeśli wystąpi jakikolwiek błąd:0
zwróć 0⋄
Spróbuj teraz:2=/⍵
parowa równość argumentu (zawiedzie jedną binarną reprezentację 0 o długości 0)1,
prepend 1⍵⊂⍨
użyj tego do podzielenia argumentu (zaczyna nową sekcję na każdym 1)2⊥¨
przekonwertować każdy z base-2źródło
⊂
jest tu naprawdę przydatny. Powinienem dodać to do Galaretki.R←X⊂Y
: Z⎕ML<3
(tj. Stylem Dyalog), nowa partycja jest uruchamiana w wyniku odpowiadającym każdemu 1 w X aż do pozycji przed następną 1 w X (lub ostatnim elementem X) kolejne elementy R. Z⎕ML=3
(tj. stylem IBM) nowa partycja jest uruchamiana w wyniku, gdy odpowiedni element w X jest większy niż poprzedni. Pozycje w Y odpowiadające 0 w X nie są uwzględniane w wyniku.⎕ML←1 ⋄ 1 0 0 1 0 1 1 ⊂ ⍳7
Jest to więc odpowiednik⎕ML←3
⋄ 4 3 2 4 4 5 7 ⊂ ⍳7`Japt , 7 bajtów
Sprawdź to
Wyjaśnienie
źródło
Python 3, 115 bajtów
Wyjaśnienie
Wyniki
poprzednie rozwiązanie (118 bajtów)
źródło
Haskell,
147, 145 bajtówmap(sum.zipWith((*).(2^))[0..]).([]%).b
to nienazwana funkcja, która oblicza listę.Mniej golfa:
źródło
Perl, 53 bajty
Obejmuje +1 dla
-p
Uruchom z numerem na STDIN
alterbits.pl
:źródło
PowerShell, 103 bajty
Ponieważ jestem okropny w wyrażeniach regularnych, używam tego samego wyrażenia, co odpowiedź edc65 .
Całkowicie zniszczone przez długie wywołania .NET w celu wykonania konwersji do / z pliku binarnego oraz wywołanie .NET w celu uzyskania dopasowania wyrażeń regularnych. W przeciwnym razie całkiem proste. Pobiera dane wejściowe
$args[0]
,convert
s do pliku binarnego, wprowadza je doMatches
, pobiera wynikowe.Value
s, przepuszcza je przez pętlę|%{...}
iconvert
przywraca te wartościint
. Dane wyjściowe są pozostawione w potoku i domyślnie drukowane z nowymi liniami.Dla dodatkowego kredytu - (przeważnie) wersja nieregexowa o wielkości 126 bajtów
Ponownie przyjmujemy dane wejściowe
$args[0]
i sąconvert
one binarne. Przerzucamy ponownie jako tablicę znaków, przechowując pierwszy znak w,$l
a pozostałe znaki w$r
. Następnie wysyłamy$r
przez pętlę, w|%{...}
której każda iteracja, którą wybieramy, od znaku poprzedzonego spacją lub po prostu od znaku, w zależności od wyniku binarnego xor z$l
, a następnie ustawiana na wartość$l
równą znakowi. To skutecznie zapewnia, że jeśli mamy ten sam znak dwa razy z rzędu, wstawiamy odstęp między nimi.Wyjście pętli jest
-join
edytowane razem i dołączane do pierwszego znaku$l
, a następnie-split
do spacji (co jest technicznie wyrażeniem regularnym, ale nie zamierzam tego liczyć). Następnie wykonujemy tę samą pętlę, co wyrażenie regularne odpowiedziconvert
i wyjściowe liczby całkowite.źródło
Java 345 bajtów
Test
Wydajność
źródło
package
iclass
i usuwanie zbędnych spacji. Daj mi znać, jeśli masz jakieś pytania!Julia,
7057 bajtówJest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca tablicę liczb całkowitych. Aby go wywołać, przypisz go do zmiennej.
Podejście tutaj jest podobne do ładnej odpowiedzi Pythona na DenkerAffe . Otrzymujemy binarną reprezentację
n
użyciabin(n)
i dzielimy wynikowy ciąg przy wszystkich dopasowaniach wyrażenia regularnego(?<=(.))(?=\1)
. To właściwie mecz o zerowej długości;(?<=(.))
jest pozytywnym wyglądem, który znajduje dowolny pojedynczy znak, i(?=\1)
jest pozytywnym spojrzeniem w przód, który znajduje dopasowaną postać w spojrzeniu. Lokalizuje to miejsca, w których liczba występuje po niej w reprezentacji binarnej. Tylkoparse
każdy jako liczba całkowita w bazie 2 za pomocąmap
i voila!źródło
C,
137129 bajtówWejścia i wyjścia są na standardowych strumieniach.
źródło
puts
, chociaż jego użycie byłoby nieprzyjemne, specyfikacja nie wymaga końca nowej linii.J , 16 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
q / kdb +, 52 bajty
Rozwiązanie:
Przykłady:
Wyjaśnienie:
q
jest interpretowany od prawej do lewej.Przesyłaj dane wejściowe na binarne, usuwaj początkowe zera, znajduj indeksy tam, gdzie są różne, odwróć, aby uzyskać indeksy tam, gdzie ta sama, podziel listę na tych indeksach, konwertuj z powrotem na base-10. Wygląda trochę ciężko w porównaniu do rozwiązania APL ...
źródło
PHP, 147
Muszą w końcu dodać dodatkowe miejsce na wyjściu, ponieważ nie stanowią ograniczenia. Powiadomienia są wyświetlane dla krótkiego kodowania.
Wersja bez golfa
źródło
Retina, 60
Wypróbuj online! Lub wypróbuj nieco zmodyfikowaną wersję dla wszystkich przypadków testowych (z dziesiętnym We / Wy).
Niestety dopasowania o zerowej długości wydają się mieć dwie „strony”, co powoduje duplikację, gdy używane jest z wyrażeniem regularnym z trzeciego etapu. Jednak kosztuje tylko jeden bajt.
Pobiera dane wejściowe jako jednoargumentowe, dane wyjściowe jako jedne. Nie jestem do końca pewien, czy użyjemy różnych wartości jednoargumentowych we / wy, ale zaoszczędziłoby to 4 bajty.
źródło
Galaretka , 9 bajtów (niekonkuruje?)
Wypróbuj online!
źródło