Wyzwanie
Biorąc pod uwagę liczbę binarną wprowadzaną dowolnymi środkami, „uprość” liczbę, używając pełnego programu lub funkcji.
Wejście
[binary]
binary
jest liczbą dwójkową, która jest większa od 0.
Wynik
Weź dane wejściowe, przekonwertuj je na bazę 10 bez użycia wbudowanego, a następnie jeśli ta liczba zawiera tylko 1 i 0, przekonwertuj ją na liczbę podstawową 10, jakby to była kolejna liczba binarna. Powtarzaj ten proces, dopóki numer nie będzie mógł zostać odczytany w trybie binarnym i wyślij go.
Inne informacje
Jeśli wejście wynosi 1, po prostu wyślij
1
. Twój program nie powinien w nieskończoność upraszczać 1.To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach do wtorku (17 listopada).
Jeśli coś jest mylące, zostaw komentarz określający, co muszę wyjaśnić, i odpowiednio go zmodyfikuję.
Wbudowane konwersje podstawowe są niedozwolone.
Przykłady
Input | Output
1 | 1
1010 | 2
1011 | 3
1100100 | 4
1100101 | 5
1111110011 | 3
źródło
Odpowiedzi:
Pyth,
2016 bajtów4 bajty dzięki Jakube
Połowa kodu (
u+yNsTG0
) to po prostu podstawowy kod konwersji.Pakiet testowy
Dane wejściowe
1
są obsługiwane przez fakt, żeu
wartość przestała się zmieniać.źródło
CJam,
2423 bajtyWypróbuj online w interpretatorze CJam .
Jak to działa
źródło
"10"
ciąg znakówlength-1
, czy możesz pominąć dekrement?"10"
w,""
jeśli liczba całkowita ma jedną cyfrę. Dzięki temu kod nie dostanie się w nieskończoną pętlę.Pip,
2827 bajtówPobiera dane wejściowe jako argument wiersza polecenia. Chcemy pętli aż
a=1
luba
zawiera jakiś znak (ów) oprócz 0 i 1 roku. Ten ostatni warunek jest testowany przezRM
wpisanie wszystkich znaków wt
=10
za
. Jeśli coś pozostało, warunek jest prawdziwy.Wewnątrz pętli konwersja działa w następujący sposób:
Po umieszczeniu
a
na końcu drukuje się automatycznie.Rozwiązanie rekurencyjne w 28 bajtach:
źródło
Python 2, 52
Łatwiej jest myśleć o tym jako o dwóch funkcjach rekurencyjnych:
Funkcja
g
konwertuje wartość dziesiętną na binarną, a funkcjaf
stosowanag
wielokrotnie jest długa, dopóki jej argument składa się z cyfr 0 i 1 ('2'>max(`n`)
) i nie jest1
. Golfed kod wali ich w jednej funkcji przez wprowadzenie definicjig(n)
dlaf(n)
zastępując rekurencyjne wywołanieg
zf
. Sprawa podstawowan=0
zg
automatycznie obsługiwane przez czekiemn>1
.źródło
L
repr
Prolog,
220212 bajtówWyjaśnienie
p jest główną funkcją i wykonuje następujące kroki (z pomocą b, x, y):
Edycja: Zapisano 8 bajtów poprzez ujednolicenie klauzul p z OR.
źródło
Mathematica
107106Z bajtem zapisanym przez DLosc.
Podziel dane wejściowe na cyfry. Jeśli wejście to 1, wyjście 1.
Jeśli wejście jest liczbą składającą się z zer i jedynek, przekonwertuj to na dziesiętne i ponownie uruchom.
W przeciwnym razie zwróć dane wejściowe.
Pierwszy krok daje 1011, co z kolei daje 3.
Tutaj testujemy zaczynając od 1011.
źródło
JavaScript,
132, 123 bajtówCóż, to nie jest najlepsza odpowiedź, ale ...
FYI, jeśli podano nieprawidłowe dane wejściowe, wyświetla to samo użytkownikowi.
źródło
for
zamiastwhile
i ustawiając wartości bezpośrednio w instrukcji (to również zmniejsza niektóre{}
), odrzucając niektóre;
, używając opisu funkcji ES6, zwiększaji
inline. Będzie to wyglądać tak:c=x=>{for(r=0;x&&!/[2-9]/.test(x);x=r)for(i=0;x>0;r+=x%10*Math.pow(2,i++),x=parseInt(x/10));alert(x)};c(prompt())
.function c(x){while(x^0&&!/[2-9]/.test(x)){for(i=r=0;x;i++)r+=x%10*Math.pow(2,i),x=0|x/10;x=r}alert(x)}c(prompt())
c=x=>
na początku nie zrozumiałem, nie działałem na konsoli Chrome ani Firefox. :( @ ן nɟuɐɯɹɐ ן oɯ, nie mogłem owinąć głowy wokół warunku XOR, ax=0|x/10
zamiast tegoparseInt
wprowadziłem resztę zmian. Dzięki ..c=x=>{for(r=0;x!=0&&!/[2-9]/.test(x);x=r)for(i=r=0;x;)r+=x%10*Math.pow(2,i++),x=parseInt(x/10);alert(x)};c(prompt())
. Na pewno działa w Firefox 42, spróbuj tego skrzypka . Pamiętaj, że ta bardziej golfowa wersja, a także oryginalny kod nie działają1
i będą działać w nieskończonej pętli.c=x=>
jest jakfunction c(x){}
patrz „ Funkcje strzałek ”.JavaScript ES6, 52
Jako funkcja. Argument funkcji musi być ciągiem cyfr binarnych lub liczbą, której reprezentacja dziesiętna zawiera tylko 1 i 0.
Przetestuj poniższy fragment kodu w przeglądarce zgodnej z EcmaScript 6 - implementując funkcje strzałek, ciągi szablonów i operator rozkładania (używam Firefox)
źródło
n+=+c+n
się konwersja binarna. Tak elegancko ...Mathematica,
62595548 bajtówZaoszczędzono 7 bajtów dzięki Martinowi Büttnerowi.
źródło
JavaScript (ES7)
8780787774 bajtówWersja demonstracyjna fragmentu do obsługi przeglądarek (obecnie tylko Firefox co noc obsługuje operatora wykładniczego)
JavaScript (ES6) 81 bajtów
Prezentacja Snippet do obsługi przeglądarek
źródło
𝔼𝕊𝕄𝕚𝕟, 37 znaków / 54 bajtów
Try it here (Firefox only).
Nie jestem pewien, czy
+
operator liczy się jako wbudowany do konwersji binarnej ...źródło
Perl 6 , 67 bajtów
źródło
PHP,
210204 bajtówTo mój pierwszy post tutaj, więc mam nadzieję, że wam się spodoba! Nawet jeśli to oczywiście nie jest najlepszy sposób na napisanie tego, nadal cieszę się, że mogę to tutaj pokazać!
Kod
Zrobiłem funkcję rekurencyjną „j”, która najpierw sprawdzi, czy wartość wejściowa jest równa 1. Jeśli tak, funkcja zwraca 1 zgodnie z oczekiwaniami, w przeciwnym razie podzieli liczbę w tablicy, aby obliczyć wartość dziesiętną, ale tylko jeśli liczba jest liczbą binarną. Jeśli nie, zwróci liczbę w niezmienionej postaci.
Nieskluczony kod
Użyłem wyrażenia „foreach” zamiast początkowego „for”, co pozwala mi zyskać 6 bajtów, ale jestem prawie pewien, że jest o wiele więcej do zrobienia.
źródło
PHP,
114112 bajtówdziała również dla
0
. Uruchom z-r
.count_chars($s,3)
zwraca ciąg zawierający wszystkie znaki z ciągu (podobnie jak warray_unique
przypadku tablic). Dla liczb binarnych, to będzie0
,1
albo01
. W przypadku innych liczb będzie zawierała cyfrę większą niż1
, więc<2
zwróci prawdę tylko dla liczb binarnych.&$s>1
jest potrzebny w specjalnym przypadku1
.Reszta jest prosta: zapętlaj bity, przesuwając wartość i dodając bieżący bit, w końcu skopiuj liczbę (rzut na ciąg) do $ s dla testu zewnętrznej pętli.
źródło
CoffeeScript,
9289 bajtówJavaScript (ES6),
10510190 bajtówPróbny
Działa tylko w przeglądarkach zgodnych z ES6, takich jak Firefox i Microsoft Edge
źródło
1
. ponieważ nie wchodzi w pętlę, którą zakładamScala, 128 bajtów
źródło
Matlab (115)
bin2dec
)źródło