Wydaje się, że to niemożliwe zadanie, prawda? Cóż, to wcale nie jest takie trudne. Jeśli napiszemy to słowo Infinity
jako 8-bitowy binarny kod ASCII, otrzymamy:
01001001 01101110 01100110 01101001 01101110 01101001 01110100 01111001
Można to połączyć i przekonwertować na wartość dziesiętną 5291279215216915577
. To liczba, z którą możemy pracować ...
Sposób, w jaki odliczasz to:
- Wyprowadza oryginalny ciąg jako liczbę dziesiętną (jak pokazano powyżej)
- Usuń wiodące zera z reprezentacji binarnej (jeśli istnieje)
- Przełącz bity w reprezentacji binarnej (1-> 0, 0-> 1)
- Podaj liczbę dziesiętną
- Powtarzaj kroki 2–4, dopóki nie osiągniesz 0.
Wyzwanie:
Utwórz program lub funkcję, która pobiera ciąg znaków jako dane wejściowe i wyświetla (w dowolnym odpowiednim formacie) liczby, które otrzymasz podczas wykonywania powyższej procedury.
Przypadek testowy:
Myślę, że wyzwanie będzie dość łatwe do zrozumienia, nawet jeśli jest to tylko jeden przypadek testowy. Użyję Inf
zamiast tego, Infinity
aby to dość krótko.
Inf
4812390 (10010010110111001100110)
3576217 ( 1101101001000110011001)
618086 ( 10010110111001100110)
430489 ( 1101001000110011001)
93798 ( 10110111001100110)
37273 ( 1001000110011001)
28262 ( 110111001100110)
4505 ( 1000110011001)
3686 ( 111001100110)
409 ( 110011001)
102 ( 1100110)
25 ( 11001)
6 ( 110)
1 ( 1)
0 ( 0)
Input: Inf
Output:
4812390, 3576217, 618086, 430489, 93798, 37273, 28262, 4505, 3686, 409, 102, 25, 6, 1, 0
Input: Infinity
Output:
5291279215216915577, 3932092821637860230, 679593196789527673, 473328307817319302, 103132444486104185, 40982743589751686, 31074850448176249, 4953946570787718, 4053252683953273, 450346943417222, 112603010004089, 28134478351238, 7049893737593, 1746199284614, 452823970937, 96931842950, 40507110521, 28212366214, 6147372153, 2442562438, 1852404857, 295078790, 241792121, 26643334, 6911097, 1477510, 619641, 428934, 95353, 35718, 29817, 2950, 1145, 902, 121, 6, 1, 0
Twój kod musi obsługiwać ciągi znaków, które mogą być reprezentowane jako liczba binarna do limitu Twojego języka. Wszystkie ciągi będą zawierać tylko drukowalne znaki ASCII od 32-126 (spacja do tyldy).
Tabela liderów
var QUESTION_ID=98274,OVERRIDE_USER=31516;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Inf:-1:0
∞..0
Odpowiedzi:
Galaretka ,
1510 bajtów-5 bajtów dzięki @Dennis (konwersja bezpośrednio z bazy 256 po rzucie porządkowym)
TryItOnline!
W jaki sposób?
źródło
Oḅ⁹
.Python 2,
8982777675 bajtówPrzetestuj na Ideone .
Jak to działa
Po zainicjowaniu n na 0 , drugi wiersz wykonuje konwersję ciągu na liczbę całkowitą określoną w wyzwaniach w następujący sposób.
W każdym kroku n przesuwa się o 8 jednostek w lewo, a następnie bitowo LUB - z kodem następnego znaku c . W przypadku wejścia Inf wygląda to następująco.
Teraz jesteśmy gotowi do wygenerowania wyniku. Aby odwrócić bity n , postępujemy w następujący sposób.
Najpierw obliczamy bity w reprezentacji binarnej n bez zer wiodących. Nazwijmy wynik k . Następnie obliczamy moc k k 2 , która ma k + 1 cyfr binarnych: pojedynczą 1 , po której następuje k 0 . Odejmujemy 1 od wyniku, otrzymując liczbę złożoną z k jedynek, którą następnie XOR z n, aby odwrócić jego bity. Dla wejścia inf wygląda to następująco.
Dodatkową przeszkodą we wdrożeniu jest to, że musimy wydrukować n przed pierwszym krokiem, po ostatnim kroku i we wszystkich krokach pomiędzy. Python nie ma pętli „do while”, a pojedyncza instrukcja drukowania kosztuje 8 bajtów, dlatego zamiast tego wykonujemy następujące czynności.
W prostej realizacji kroku aktualizacji, tj.
zamieniamy pętlę na nieskończoną (
while 1
) i obliczamy1
w pętli jakon/n
. Jest to równoważne, gdy n> 0 .Gdy n = 0 , pozostajemy w pętli, drukujemy stan jeszcze raz, a następnie próbujemy go zaktualizować. Jednakże
0/0
wyzwala ZeroDivisionError , zrywając z pętli oraz wychodzenia z błędem. Zauważ, że powoduje to rozproszenie danych wyjściowych do STDERR, co jest domyślnie dozwolone .źródło
-n/n
sztuczkę :-)n/n
podstęp? Prawdopodobnie zostało to wyjaśnione gdzieś w innej odpowiedzi, ale jej nie znalazłem. Co on tu robi?JavaScript, 82 bajty
Zapisano bajt dzięki @Arnuald
Jeden z niewielu razy, kiedy pełny program przewyższa funkcję (a ES6 nie przewyższa ES5) ...
Powyższe obsługuje do 4 liter. Dodaj 4 bajty, aby obsługiwać do 6 liter:
źródło
g=a=>a[0]?a.pop().charCodeAt()+g(a)*256:0
(-1)n<<8|y.charCodeAt()
powinien zapisać bajt.for(;n;)for(i=!alert(n);i<=n;i*=2)n^=i
uratuje kolejny bajt, ale nie wyświetlisz0
, co prawdopodobnie jest wymagane.n<<8
wcześniej, ale zdecydowałem, że to nie zadziała, ponieważ złamie się dla n z więcej niż 31 bitami. Wydaje mi się, że teraz nie ma znaczenia, że podzieliłem go już na wersję 31-bitową i 53-bitową ... I niestety, nie sądzę, żebym mógł zapisać cokolwiek na ostrzeżeniu, alarmując jednocześnie pierwszą iteracja i ostatnia.Właściwie 14 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
05AB1E , 18 bajtów
Wykorzystuje kodowanie CP-1252 .
Wypróbuj online!
Wyjaśnienie
źródło
MATL , 13 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Mathematica, 99 bajtów
Funkcja anonimowa. Pobiera ciąg znaków jako dane wejściowe i zwraca listę liczb jako dane wyjściowe.
źródło
Haskell,
10912311810297 bajtówDzięki @nimi za uratowanie 5 bajtów!
Stosowanie:
(++[0]).fst.span(>0).iterate c.foldl((+).(256*))0.map fromEnum $ "Infinity"
Gwarantowane działanie na liczbach do 29 bitów według języka, zwykle działa na liczbach 63-bitowych w systemach 64-bitowych.
map(fromIntegral.fromEnum)
Zamiast tego użyj (+14 bajtów) do obsługi dowolnie dużych liczb.Działa dla zakresu Unicode
[0..255]
. Rekurencyjnie odwraca bity.źródło
takeWhile(>0)
zfst.span(>0)
. Jeśli przejdziesz bez celu, możesz usunąć nazwęf
, więc twoją główną funkcją jest(++[0]) ... map fromEnum
.f
.fromIntegral
? Z wyzwania: „musi obsługiwać ... do 63 bitów ... lub limit twojego języka”, więcInt
powinno być w porządku. Jeśli chcesz go zachować, przenieś go domap
, tj. Do starej wersjifoldl1
imap(fromIntegral.fromEnum)
.PHP,
132126123120108107 bajtówunpack
zamiaststr_split
renderujeord()
przestarzałe -> -3 bajty_
gdy separator zapisuje 3.bindec
zamiastltrim
usunąć wiodące zera: -12echo
w korpusie pętli oszczędza 1 bajtprint
w głowicy pętli.źródło
$n=$n*256+$i;for(print$n;$n;)
można zapisać jakofor(print$n=$n*256+$i;$n;)
? Ponieważ część przypisania zostanie wykonana raz, powinno to działać. I zamiast tegoecho _.$n=[...]
powinieneś użyćecho _,$n=[...]
zamiast tego. Nie uratuje żadnego bajtu, ale przyspieszy kod malutki malutki drobiazg i rozdzieli instrukcje. Oznacza to, że można na przykładecho _,$a?5:6;
napisać zamiastecho _.($a?5:6);
. Może to być pomocne w przyszłości.print
w tym przypadku jest to pozostałość . Sam nie wart edycji; ale dzięki.foreach(unpack("C*",$argv[1])as$i)
... Głupia ja ... I tak, zmiana okresu, aby przecinek miał taki sam efekt, nie jest warta kłopotów.Perl, 65 bajtów
Kod 53 bajty + 12 dla
-Mbigint -p
.Dzięki @ Dada za uratowanie mnie 13 bajtów!
Dość proste podejście, różniące się tylko od większości z nich, jest to, że liczba jest przechowywana jako binarna i drukowana w systemie dziesiętnym. Jestem pewien, że można to poprawić, być może dzięki przechowywaniu szczegółów w tablicy.
-Mbigint
jest nieco niewygodny, ale konieczny.Stosowanie
źródło
perl -Mbigint -lpE'$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0'
(Nie mam pojęcia, jak zwykle korzystać z rozpakowywania , po prostu miałem szczęście, kiedy googlowałem, jak przekonwertować ciąg na binarny ;-))unpack
składni, zawsze miażdżę umysł! Zaktualizuję, dziękuję!echo -n
to jedyna inna zmiana.Pyth, 12 bajtów
Program, który pobiera ciąg cytowanego ciągu i wypisuje wynik jako listę liczb całkowitych.
Sprawdź wszystkie przypadki testowe
Jak to działa
źródło
Python 3,
9995 bajtówGłówną ideą jest konwersja ciągu znaków na bajty na liczbę. Każda iteracja wypisuje wynik i XOR ze wszystkimi 1, aby przejść do zera.
źródło
2**x.bit_length()-1
. Kolejność operacji dla mocy i odejmowania jest wyższa niż xor.while
Może to również znajdować się w jednej linii.P=print
a następnie użyjP()
zamiastprint()
Python 2,
117115 bajtówOszczędność 2 bajtów dzięki Cyoce.
Zakłada dane wejściowe ujęte w cudzysłów, np
"Inf"
m
liczy się do najwyższej cyfry, podobniem-1
jak maska XOR do wykonania żądanej operacji. Najdłuższą częścią jest konwersja danych wejściowych na początkową sekwencję bitów.Przykład:
źródło
-i-1
z~i
Rubinowy,
104101100818065 bajtów19 bajtów zapisanych dzięki @WayneConrad!
15 bajtów zapisanych dzięki @philomory!
1 bajt zapisany dzięki @LeeW!
Pobiera dane wejściowe za pomocą argumentów wiersza poleceń.
Zainspirowany odpowiedzią Pythona na JimmyJohnson
źródło
i.to_s(2).rjust 8,'0'
je"%08b"%i
inject(:+)
można go zastąpićjoin
unpack
opcję „[0]
zamiast, a nie na bałagan”gsub
pozwoli zaoszczędzić 11 bajtów. Przełączenie na$*[0]
zamiastgets.chop
(użycie argumentu wiersza poleceń zamiast danych wejściowych konsoli) spowoduje zapisanie kolejnych 9, pierwszy wiersz staje sięp n=$*[0].unpack('B*')[0].to_i(2)
.Labirynt ,
104103 bajtyWypróbuj online!
Wyjaśnienie:
Wskaźnik instrukcji zaczyna się od lewego górnego znaku, który nie jest ścianą (ściany zawierają spacje i dowolną literę z wyjątkiem
v
).Pomarańczowy:
Ta pętla pobiera jeden znak na raz jako kod ASCII, dodając go do bieżącej wartości i mnożąc bieżącą wartość przez 256.
'
Brak operacji,
Wciśnij kod ascii następnego znaku wejściowego na górę stosu lub -1, jeśli EOF. W tym momencie, jeśli otrzymano dane wejściowe, kod skręci w prawo (przesuwa się w dół), ponieważ górna część stosu jest potencjalna. W przeciwnym razie skręci w lewo, ponieważ górna część stosu jest ujemna.|
Zdejmij dwa górne przedmioty ze stosu i wciśnij wynik bitowego LUB._
Naciśnij zero256
Każda cyfra wyskakujex
i popychax*10+digit
. Tak więc w połączeniu z poprzednim zepchnięciem zerowym push 256 na szczyt stosu.*
Popy
, popx
, pushx*y
. W tym momencie, ponieważ górna część stosu jest dodatnia, kod skręci w prawo, aby kontynuować wokół pętli.Niebieski:
)
Zwiększ górną część stosu. Po osiągnięciu końca wejścia kod skręci w lewo, aby dostać się do tego punktu z -1 na stosie, który zostanie zwiększony do zera.256
Posiadanie góry stosu 0 pozwala nam przesunąć tę 256./
Popy
, popx
pushx/y
(podział na liczby całkowite). Ponieważ mnożymy dane wejściowe przez 256 w każdej pętli, musimy cofnąć ostatnie mnożenie.:
Zduplikuj górę stosu, abyśmy mieli kopię bieżącej wartości na później.!
Pop u góry stosu i wydrukuj wartość całkowitą na STDOUT.\
Wydrukuj nową linię._2
Wciśnij dwa na wierzch stosu.}
Przenieś górę stosu na górę stosu pomocniczego.Czerwony:
Ta pętla odwraca bity bieżącej wartości o XOR o określoną wartość obliczoną w wewnętrznej (zielonej) pętli. Następnie wysyła aktualną wartość i wychodzi z programu, jeśli bieżąca wartość wynosi zero.
_
Naciśnij zero (przepływ kontrolny).;
Odrzuć górę stosu (przepływ kontrolny).:
Zduplikuj bieżącą wartość. Kopia zostanie wykorzystana do obliczenia XOR._
Naciśnij zero (przepływ kontrolny).$
Popy
, popx
, pushx XOR y
.:!
Zduplikuj bieżącą wartość i wydrukuj reprezentację liczb całkowitych.@
i kończymy .\
Wydrukuj nową linię._2}
Naciśnij 2 i przejdź do stosu Aux._1
Naciśnij 1 (kontrola przepływu).Zielony:
Ta pętla oblicza wartość, o którą potrzebujemy XOR bieżącej wartości. Odbywa się to poprzez wielokrotne podwojenie górnej części stosu pomocniczego przy jednoczesnym zmniejszeniu o połowę kopii bieżącej wartości na końcu głównego stosu aż do osiągnięcia wartości 0.
_
Naciśnij zero (przepływ kontrolny).;
Odrzuć bieżącą wartość, która jest używana tylko do wymuszenia przepływu kontroli._2
Naciśnij 2, aby zmniejszyć o połowę bieżącą wartość./
Podzielić{
Przenieś górę stosu Aux na górę głównego stosu._2*
Podwój górną część stosu}
Przenieś górę głównego stosu z powrotem na stos pomocniczy._1
Naciśnij jeden, aby uzyskać kontrolę przepływu.;
Odrzuć lewą ponad zero od obliczenia XOR.{
Przenieś obliczony XOR na główny stos.(
Odejmij jeden od wartości XOR.źródło
PowerShell v2 +, 158 bajtów
Tak, więc konwersja baz w PowerShell jest naprawdę cholerna . I zrobimy to tutaj dwa razy.
OK, więc jest to tylko
for
pętla włączona$a
- tzn. Pętla trwa tak długo, jak$a
istnieje. W końcu dojdziemy do pustej struny (która jest falsey), więc w ten sposób zakończymy.Konfiguracja pętli,
$a=-join([char[]]$args[0]|%{([int][convert]::ToString(+$_,2)).ToString('0'*8)})
pobiera dane wejściowe$args[0]
,char
rzutuje je na- tablicę i zapętla każdą postać. Używamy .NET[convert]::ToString(int,base)
do konwersji każdego z nich na ciąg binarny. Nie obejmuje to jednak zer wiodących, dlatego musimy ponownie rzucić ten ciąg jako[int]
i wywołać jego.ToString()
metodę z8
zerami jako maską. Następnie te ciągi znaków są zamykane w pareny i edytowane-join
razem, a następnie zapisywane w$a
.Wewnątrz pętli
[convert]::ToInt64(string,base)
przekształcamy liczbę binarną na liczbę dziesiętną. Pozostaje on w potoku, a następnie jest przepłukiwany, gdy pętla resetuje się (a zatem niejawnie drukuje). Następna sekcja wykonuje obliczenia - my.TrimStart()
usuwamy wszystkie wiodące zera, dzielimy-split0
na zera i otrzymujemystring
tablicę1
s,-replace
te z zerami, a na końcu-join
tablicę z powrotem razem z1
s. Następnie pętla zaczyna się od nowa.źródło
CJam ,
171618 bajtówWypróbuj online!
UWAGA: Stara 16-bajtowa wersja nie działała poprawnie z pustymi ciągami:
Ponadto, dzięki Dennisowi za sugestię,
p
która pozwala zaoszczędzić 1 bajt przedN\
wstawieniem nowych linii do stosu.źródło
_p2b:!2b
zapisuje bajt. Powinieneś także użyćl
;r
zakończy się niepowodzeniem, jeśli dane wejściowe zawierają spacje.q
będzie działać poprawnie z pustymi ciągami.J, 24 bajty
Wyjaśnienie nastąpi później!
źródło
Siatkówka, 116 bajtów
Liczba bajtów zakłada kodowanie ISO 8859-1. Wiersz 5 zawiera bajty niedrukowalne. Jest
T`\x00-\xFF
.Wypróbuj online
Nie próbuj tego przy wprowadzaniu dłuższych niż dwa znaki. (Upływa limit czasu przy użyciu interpretera internetowego.) Musimy przekonwertować plik binarny na jednoargumentowy przed przecinkiem. :RE
Niestety jest końcowe zero i podawanie wiersza, ale postanowiłem założyć, że było w porządku, ponieważ dane wyjściowe są nadal poprawne.
Wyjaśnienie
źródło
Rubinowy - 70 bajtów
Program kończy działanie z wyjątkiem po zakończeniu, ale rozumiem, że jest w porządku, dopóki wyjście błędu przechodzi do STDERR, a nie STDOUT (co robi).
źródło
C,
147135133125122121117115103 bajtówZaoszczędź 5 bajtów dzięki @Cyoce!
Zaoszczędź 2 bajty dzięki @Cyoce i @cleblanc!
Zaoszczędzono 12 bajtów dzięki @ceilingcat
Nie golfowany:
źródło
int
deklaracjewhile
pętlę wfor
pętlęwhile(1)
nafor(;;)
int
deklaracje wszędzie i dostałemgcc -std=89
błędy. Ale dziękuję zafor(;;)
wskazówkę. Będę próbował usunąćint
deklaracje :)))i;main(c,v)char**v;{...}
). Na telefonie komórkowym, więc nie mogę być pewienC,
129120117110107105 bajtówTestowane z
wynik
źródło
i=0
do deklaracjii
i pozostawić sekcję inicjalizacjifor
pętli pustąi
jest domyślną int globalną, należy ją inicjować za każdym razem, gdy wywoływane jest f (...).i
ponownie nie wyzeruje, więc można ją ponownie wykorzystać.C #,
360359 bajtówPełny program:
źródło
var t="";var f="";
byćvar t="",f=""
zamiast? Oszczędza 5 bajtów.