Tło :
Otrzymałeś zadanie konwersji liczb podstawowych 10 na bazę 2 bez korzystania z wcześniej przygotowanych funkcji konwersji bazy. Nie można również używać żadnych importowanych bibliotek.
Problem :
Konwertuj ciąg wejściowy z podstawy 10 (dziesiętnie) na podstawę 2 (binarnie). Nie możesz używać żadnego wcześniej przygotowanego podstawowego kodu konwersji / funkcji / metod ani importowanych bibliotek. Ponieważ jest to kod-golf , wygra najkrótsza odpowiedź w bajtach.
Dane wejściowe będą mieć wartość od -32768 do 32767 (obejmują obsługę bajtów znaków w kodzie)
the MSB of signed variables controls if they are negative
- Brzmi to trochę jak znak, jednak, jak-32768..32767
sugeruje zakres , chcesz uzupełnienia 2. Więc czego chcesz? ..Odpowiedzi:
GolfScript - 17 bajtów
Nie za dużo bardziej gadatliwy niż wbudowany
~2base
.źródło
~
"37"
, na przykład operacja"37" & 1
(infiks) jest operacją ustawioną. Z~
przodu konwertuje dane wejściowe na liczbę całkowitą.10
na stos, nie trzeba jej oceniać. Jednak po odczytaniu zstdin
danych wejściowych będzie ciąg znaków ( przetestuj tutaj ). Opis problemu również wyraźnie stwierdza, że dane wejściowe są ciągiem.JavaScript, 46
źródło
>>>=
)! +1 (Ponadto, jeśli uruchomisz go w konsoli, możesz zapisać 9 ostatnich znaków.)x=8; x>>>=1; x;
ix=8; x>>>1; x;
- w pierwszym przypadku wartość x uległa zmianie; po drugie nie.>>>=
jest pojedynczym operatorem .Brainf * ck,
9877Oczywiście nie ma to na celu wygrania, ale czym byłaby konkurencja, gdyby nie miała rozwiązania dla mózgu
Ponieważ brainfk może obsłużyć tylko 8-bitowe liczby całkowite i żadnych negatywów, myślę, że nie w pełni przestrzega zasad, ale hej, nigdy nie byłem w stanie go wygrać.
To faktycznie działa dla 16-bitowego wejścia, jeśli twój interpreter obsługuje
Mam go nawet na wyjście w wartościach ascii
Oto kod z adnotacjami:
Krótszy algorytm (77):
Ten obsługuje tylko liczby całkowite 8bit.
Algorytm działa przy użyciu licznika binarnego, który jest w rzeczywistości bardzo krótki (jest to jeden przyrost,
>[->]++[-<+]-<-
który następnie określa bity. Problem polega na tym, że trudno jest wydrukować wszystkie bityTen ostatni algorytm można dostosować do dowolnej liczby bitów kosztem bajtów. Aby móc poradzić sobie z N bitami całkowitymi, wymaga 53 + 3 * N bajtów do zakodowania.
przykłady:
źródło
Obowiązkowa odpowiedź APL - 21
22Przykłady:
źródło
⎕IO←0
, i powrót tablicę bitów zamiast ciąg:2|⌊⎕÷2*⊖⍳16
.Kod maszynowy Turinga, 272 bajty
Jak zwykle używam zdefiniowanej tutaj składni tabeli reguł . Możesz to przetestować na tej stronie lub, alternatywnie, za pomocą tej implementacji Java.
Dużo kodu jest tutaj kopiowane z mojego konwertera dziesiętnego na szesnastkowy .
Odlicza od wejścia w bazie 10, odliczając w górę od 0 w bazie 2. Po zmniejszeniu zera kasuje blok wejściowy i kończy się.
źródło
JavaScript 59
źródło
+x
zamiastparseInt(x)
Perl, 44
To jest mój pierwszy program w języku Perl, więc wybacz mi, jeśli można go dalej zagrać w golfa. Edycja: Dziękuję @primo za usunięcie 7 znaków z mojej odpowiedzi.
Logika jest zasadniczo taka sama jak w moim poprzednim rozwiązaniu C.
Ponadto używa 64 bitów.
źródło
reverse
konstruując kierunku do tyłu tablicy:@s=($x&1,@s)
.$\=$_%2 .$\while$_=$_>>1||<>;print
. Lub, jeśli opcje wiersza poleceń liczą po jednym bajcie, 27:1while$\=$_%2 .$\,$_>>=1}{
używając-p
.JavaScript -
5648 i3628 znakówDzięki @Blender za golenie 8 znaków.
Ten formularz pobiera dane wejściowe i wyświetla dane wyjściowe, 48 znaków:
Jeśli potrzebna jest tylko instrukcja, która umieszcza zmienną,
a
binarna postać zmiennejx
(i nie zawracasz sobie głowy niszczeniemx
wartości jako efektem ubocznym), oto 28 znaków:źródło
Math.floor
z~~
, gdyż zakres numerów jest niewielka.a=x%2+a
można to skrócića+=x%2
? Działa we wszystkich językach, które znam.a=a+x%2
, ale+
dotyczy łączenia łańcuchów. Tj. Twoja sugestia skutkuje cyframi w kolejności wstecznej.Python -
6160 znakówźródło
print
i""
.print
na bok, ponieważ automatycznie zwraca wynikC, 55 znaków
Wyświetla dodatkowe wiodące zero (ze względu na 2 bajty).
Rekurencja wewnątrz
printf
odwraca kolejność drukowania, więc algorytm wyodrębnia bity od prawej do lewej, ale drukuje od lewej do prawej.EDYCJA : Zapisano znak, używając
putchar
zamiastprintf
.źródło
Dyalog APL , 11 bajtów
2|
Pozostała część podziału po podzieleniu o połowę⌊
zaokrąglonej wartości⎕
wejściowej÷
podzielonej przez każde z2*
dwóch do potęgi każdego z nich⍳16
{0, 1, 2, ..., 15}Wymaga
⎕IO←0
ustawienia domyślnego w wielu systemach.Wypróbuj APL online!
źródło
C, 81
Dane wyjściowe mają ściśle 16 bitów (łącznie z zerami wypełniającymi)
źródło
Aplikacje Script + Arkusze Google,
147144121 bajtówScenariusz
Arkusz
Zmodyfikowana wersja tego skryptu autorstwa ZygD.
źródło
Haskell, 66 bajtów
Zadzwoń
b "-1023"
, dodajmain=interact b
kompletny program lub wypróbuj go w Ideon.c
wykonuje konwersję dla dodatnich liczb całkowitych.b r=show.c.read$r
konwertuje ciąg na liczbę, stosujec
i konwertuje z powrotem na ciąg.b('-':r)='-':b r
usuwa ewentualne prowadzenie-
i ponownie dołącza je do wyniku.źródło
PowerShell,
59878270 bajtów+28 bajtów do obsługi liczb ujemnych.
-12 bajtów dzięki tylko @ ASCII
Wypróbuj online!
Zaadaptowano z tego kodu . Pobiera dane wejściowe za pomocą parametru wiersza polecenia
-d
.źródło
APL (NARS), 17 znaków, 34 bajty
Jest to kopia i modyfikacja odpowiedzi Adama /codegolf//a/90107 w sposób, w jaki można dodać parametr dla długości bitów, a ⎕IO dla tej funkcji (tutaj jest ⎕IO = 1) powinien nie mają znaczenia ...
wydaje się, że łatwo jest obsługiwać liczbę bitów w ten sposób (sprawdziłem, że ostatni wynik powinien być prawidłowy)
źródło
Smalltalk (Smalltalk / X), 63/78
pierwsza wersja tworzy łańcuch pośredni (78):
w rzeczywistości nie ma potrzeby tworzenia łańcucha; po prostu wypisz znaki (63):
mhmh - czy istnieje krótszy sposób na odczytanie liczby?
źródło
Python 3.x: 65 znaków
źródło
Bash, 44
Przekaż wartość wejściową do skryptu za pomocą zmiennej środowiskowej
n
. Reprezentacja dziesiętna wyniku binarnego nie może przekraczaćLONG_MAX
.To powinno być również zgodne z
ksh93
azsh
jeślib
ie
są inicjowane0
i właściwe rozszerzenie arytmetyka jest używany.źródło
n
jest już zdefiniowane, co czyni go fragmentem. Można to naprawić, przyjmując dane wejściowe jako argument wiersza poleceń i ustawiającn
je w skrypcie.n=127 sh -c '...'
niżsh -c 'n=$1 ...' _ 127
. W tym przypadku nie ma powodu, aby preferować jeden od drugiego, ponieważ oba są idealnie typowym sposobem przekazywania wartości.C # - 104
Ta metoda konwertuje liczbę dziesiętną na binarną do
64
bity.Po wykonaniu powyższej metody w Linqpad - rr = p (-32768); rr.Dump ();
Wynik:
01111111111111111111111111111111111111111111111111000000000000000
źródło
int
.Java 8,
8071 bajtów-9 bajtów z powodu reguły w komentarzach. Ujemne dane wejściowe base-10 mogą zwracać dodatnią / bezwzględną wartość base-2 jako dane wyjściowe.
Wyjaśnienie:
Wypróbuj online.
źródło
Kotlin, 82 bytes
Try it online!
źródło
Small Basic, 133 bytes
A script that inputs from and outputs to the
TextWindow
console.Try it at SmallBasic.com Requires Silverlight and thus must be run in IE.
I/O is taken/given from the black console.
-22 bytes thanks to @Neil
źródło
For i=0To c-1
?MATL,
1517 bytesTry it on MATL Online
TIO
(+2 bytes removing leading 0 for negative numbers, sign bit should be the first bit.)
Output on MATL Online should be read bottom-up (MSB is at the bottom).
The main part is pretty simple:
`2&\t
= while the value is greater than 0, divide by 2 and accumulate the remainders.Handling negative numbers and giving them 2's complement representation was the tricky part. In the end I went with the "subtract from2N " method of getting a number's two's complement. Since we're only required to handle values upto -32768, for negative numbers the code creates 216=65536 with
16W
, adds the input to that (eg. 65536 + (-42)), which gives something MATLAB sees as a positive number but represents the input's signed binary representation in 16-bit form.źródło
C (gcc),
5043 bytes-7 bytes thanks to ceilingcat.
Try it online!
źródło
PowerShell, 43 bytes
Try it online!
źródło
><>,
3433 bytesTry it online!
źródło