Rozważ następującą sekwencję numerów:
Wymienia wszystkie ułamki binarne w przedziale jednostkowym .
(Aby ułatwić to wyzwanie, pierwszy element jest opcjonalny: Możesz go pominąć i rozważyć, że sekwencja zaczyna się od 1/2).
Zadanie
Napisz program (pełny program lub funkcję), który ...
Wybierz jedno z tych zachowań:
- Wejście n, wyjście n-ty element sekwencji (indeksowane 0 lub indeksowane 1);
- Wprowadź n, wyślij pierwsze n elementów sekwencji;
- Nic nie wpisuj, wypisz nieskończoną sekwencję liczb, którą możesz brać jeden po drugim;
Reguła
- Twój program powinien co najmniej wspierać pierwsze 1000 pozycji;
- Możesz wybrać wyświetlanie liczb dziesiętnych lub ułamków (wbudowane, pary całkowite, łańcuchy) według własnego uznania;
- Wejście / Wyjście jako cyfry binarne nie jest dozwolone w tym pytaniu;
- To jest golf-golf , wygrywanie najkrótszych kodów;
- Standardowe luki zabronione.
Przypadki testowe
input output
1 1/2 0.5
2 1/4 0.25
3 3/4 0.75
4 1/8 0.125
10 5/16 0.3125
100 73/128 0.5703125
511 511/512 0.998046875
512 1/1024 0.0009765625
Przykłady te oparte są na sekwencji z indeksowaniem 0, w tym z wiodącym 0. Konieczne będzie dostosowanie danych wejściowych w celu dopasowania rozwiązania.
Czytaj więcej
- OEIS A006257
- Problem z Józefem Flawiuszem: . (Poprzednio M2216)
- 0, 1, 1, 3, 1, 3, 5, 7, 1, 3, 5, 7, 9, 11, 13, 15, 1, 3, 5, ...
- OEIS A062383
- n > 0 a n = 2 ⌊ l o g 2 n + 1 ⌋ a n = 2 a ⌊ n : dla , lub .
- 1, 2, 4, 4, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 32, 32, 32, ...
A006257 (n) / A062383 (n) = (0, 0,1, 0,01, 0,11, 0,001, ...) wylicza wszystkie ułamki binarne w przedziale jednostkowym [0, 1). - Fredrik Johansson, 14 sierpnia 2006 r
"1/2" "1/4" "1/8"...
take
później możesz n elementów z niej.int
s, lubdouble
w języku / implementacji, w którejdouble
używany jest format binarny IEEE ? Mam nadzieję, że nie masz na myśli, że musiałeś parsować ciąg ASCII, jeśli chcemy wziąć liczbę całkowitą? Normalne typy liczb całkowitych są binarne w językach takich jak C. Czy masz na myśli, że wejście / wyjście nie może być tablicą lub ciągiem liczb całkowitych lub zer / jedynek ASCII?Odpowiedzi:
Haskell , 25 bajtów
Wypróbuj online!
Generuje dziesiętne, zindeksowane bez początkowego terminu zerowego.
Dodaje 0,5 do danych wejściowych, następnie zmniejsza o połowę, aż wyniki będą niższe niż 2, a następnie odejmuje 1. Użycie wyrażenia bezcelowego oszczędza 1 bajt
źródło
Java 10,
6864 bajtówNajpierw spróbuj golfa code!
Opcja 1: znajdź n- ty element (1-indeksowany)
-4 bajty dzięki @Kevin Cruijssen
Jest to anonimowa metoda, która znajduje n- ty składnik, usuwając najbardziej znaczący bit z n , podwajając go i dodając jeden, a następnie dzieląc przez następną najwyższą potęgę 2.
Wypróbuj online!
Przewodnik po kodzie:
Dokonuje edycji, jeśli konieczne jest wydrukowanie końcowej wartości zamiast jej zwracania.
źródło
{}
Pętla po może być;
zamiast tego; możesz usunąć spację poreturn
;2.0
może być2.
; I zmianęn>>x!=1;x++
,1<<x
i1<<x+1
don>>x++!=1;
,1<<x-1
,1<<x
odpowiednio również oszczędza bajt. Wypróbuj online: 64 bajty . Miłego pobytu!MathGolf ,
54 bajtówWypróbuj online!
Jak by to wyglądało, gdy operator działa poprawnie
Wypróbuj online!
Wyjaśnienie
Inspirację czerpałem z tego pytania, aby rozwiązać problem. Myślę, że moje „własne” rozwiązanie miało około 10-12 bajtów.
Zamierzałem, aby zaokrąglenie w górę do najbliższej potęgi 2 zwróciło samą liczbę, jeśli była to liczba dwa, ale z powodu błędu zaokrągla ona do następnej potęgi dwóch (np. 4 -> 8 zamiast 4 -> 4 ). To trzeba będzie naprawić później, ale teraz oszczędza mi to jeden bajt.
źródło
]
nie służy to żadnemu innemu celowi niż sformatowanie danych wyjściowych, powiedziałbym, że nie trzeba uwzględniać ich w liczbie bajtów.Java 10,
8985706968 bajtówPort odpowiedzi 05AB1E @Emigma , więc wypisuje również dziesiętne w nieskończoność.
-15 bajtów dzięki @Arnauld .
Wypróbuj online.
Wyjaśnienie:
źródło
Perl 6 , 19 bajtów
Wypróbuj online!
źródło
Python 3 , 33 bajty
Wypróbuj online!
Generuje dziesiętne, zindeksowane bez początkowego terminu zerowego.
źródło
Java (JDK 10) , 30 bajtów
Wypróbuj online!
Zwraca nty element w sekwencji.
Ta odpowiedź jest pierwotnie następstwem golfa odpowiedzi Java firmy TCFP . Ostatecznie golfy nie wyglądały już jak oryginalne odpowiedzi (choć zastosowana matematyka jest taka sama), więc postanowiłem opublikować golfa jako osobną odpowiedź zamiast po prostu komentować odpowiedź TCFP. Jeśli więc podoba ci się ta odpowiedź, idź głosować odpowiedź TCFP ! ;-)
Pośrednie pola golfowe to:
źródło
05AB1E ,
118 bajtówZaoszczędził 3 bajty dzięki Kevin Cruijssen .
Wypróbuj online!
Wyjaśnienie
źródło
∞
(nieskończona lista od 1):∞oεDÅÉs/}˜
[1,2,4,4,8,8,8,8,16,16,...,2**n]
poprawnych liczb pierwszych indeksowanych, a następnie o/
… Ale to nie działało tak dobrze. No ale nie za8-bytes
dobrze. Coś jak9LoDÅP)ζ
.Galaretka , 9 bajtów
Wypróbuj online!
źródło
PowerShell , 40 bajtów
Wypróbuj online!
Zwraca nieskończoną sekwencję jako wartości dziesiętne. Biorąc pod uwagę ograniczenia językowe, w końcu wystąpią problemy z precyzją, ale z łatwością poradzi sobie z pierwszymi 1000 wpisami.
Zaczyna od ustawienia
$i=2
, a następnie wchodzi wfor
pętlę. Przy każdej iteracji konstruujemy zakres1..$i
i wyciągamy wartości nieparzyste za pomocą|?{$_%2}
. Są one wprowadzane do ich własnej wewnętrznej pętli, gdzie dzielimy każdą z nich, aby uzyskać liczbę dziesiętną|%{$_/$i}
. Zostają one pozostawione w potoku i wyprowadzane, gdy potok jest opróżniany po każdejfor
iteracji. Każdą iterację zwiększamy$i
,$i*=2
aby uzyskać kolejną rundę.źródło
Haskell,
3532 bajtówEdycja: -3 bajty dzięki @ Delfad0r.
To nieskończona lista par liczb całkowitych.
Wypróbuj online!
źródło
Haskell , 40 bajtów
Wypróbuj online!
Nieskończona sekwencja jako pary liczb całkowitych (zaczynając od
(1,2)
).Trochę dłużej niż odpowiedź @ nimi , ale podejście jest zupełnie inne, więc i tak zdecydowałem się opublikować.
To rozwiązanie opiera się na poniższej obserwacji.
Zauważ, jak wróciłeś do sekwencji, którą zacząłeś!
Rozwiązanie wykorzystuje ten fakt (wraz z lenistwem Haskella) do obliczenia sekwencji
s
.źródło
Python 2 -
6866 bajtów-2 bajty dzięki Kevinowi
Wypróbuj online!
źródło
return 2*(n-a)
nareturn(n-a)*2
. I możesz zapisać dodatkowy bajt, używając Pythona 2 zamiast 3, więcreturn
możesz to zrobićprint
(z nawiasami).len
ibin
zamiastlog
.Python 3 ,
5351 bajtówn
.Wypróbuj online!
źródło
def f(m=2,n=1):n<m and print(n/m)&f(m,n+2)or f(m+m)
R , 42 bajty
Wypróbuj online!
Denominator,Numerator
źródło
Rakieta ,
9291 bajtówWypróbuj online!
źródło
MATL , 8 bajtów
Wypróbuj online!
Zwraca licznik, a następnie mianownik. Używa tej samej metody, co moja odpowiedź R. Jednak jest ona nieco bardziej wydajna.
Objaśnienie, z wejściem
5
:źródło
Język programowania Szekspira , 426 bajtów
Wypróbuj online!
Generuje sekwencję nieskończenie, ponieważ obie liczby są oddzielone spacją, a każdy element jest oddzielony znakiem nowej linii.
źródło
You be twice the sum of a cat
Python 2 , 44 bajty
Wypróbuj online!
Funkcja zwraca krotkę (licznik, mianownik). Wejście 0 nie jest obsługiwane (było opcjonalne).
źródło
return 2*n-m+1,m
możnaprint-~n+n-m,m
zapisać 2 bajty.Excel
4828 bajtówZaoszczędzono 20 bajtów (!) Dzięki tsh
= MOD (A1 + 0,5,2 ^ (INT (LOG (A1,2)))) / 2 ^ INT (LOG (A1,2))Przyjmuje wartość w A1, dane wyjściowe są dziesiętne. Jeśli chcesz, aby dane wyjściowe były ułamkowe, możesz utworzyć niestandardowy format dla komórki wyjściowej jako „0 / ### 0” i wyświetli się jako ułamek.
Objaśnienie: Trudne do wyjaśnienia, ponieważ zastosowano skrót, aby dostać się do tej formuły. Zasadniczo licznik jest nieco przesunięty w lewo od wejścia, a mianownik jest następną siłą o 2 wyższą niż wprowadzona liczba.
Pierwotnie zacząłem od wbudowanych funkcji Excela dla BITLSHIFT i BITRSHIFT, ale przesuną one całe 48 bitów, co nie jest tym, czego chcesz. Funkcje DEC2BIN (i BIN2DEC) mają limit od -512 do 511 (10 bitów), więc to nie zadziała. Zamiast tego musiałem odbudować liczbę z modułem oryginalnej liczby, następnie dwa razy, a następnie dodać 1 (ponieważ lewa cyfra zawsze będzie miała wartość 1 przed zmianą).
Przykłady:
źródło
=(A1+0.5)/2^INT(LOG(A1,2))-1
?C ++,
977571 bajtów-26 bajtów dzięki tsh, ceilingcat, Zacharý
Kod testowy:
źródło
if(!i)return 0;
ponieważ 0 nie jest wymagane w wyzwaniu.while
ale spróbujfor
.for(;exp;)
jest taki sam,while(exp)
ale można do niego napisać jeszcze dwie inne instrukcje. Wolę?:
zamiastif else
, co w większości przypadków byłoby krótsze.(...)
dookoład-n-1
.C (gcc) , 63 bajty
Brak danych wejściowych, drukuje nieskończoną sekwencję:
Wypróbuj online!
źródło
JavaScript (ES6), 44 bajty
Wypróbuj online!
źródło
Rubin , 42 bajty
Wypróbuj online!
Wyświetla nieskończone pary liczb całkowitych, zaczynając od 1/2.
źródło
JavaScript (Node.js) , 30 bajtów
źródło
Ruby , 31 bajtów
Wypróbuj online!
źródło
> <> ,
1918 bajtówUżywając pomysłu xnora , naprawionego przez Jo Kinga, -1 bajt przez lepsze wykorzystanie kopii lustrzanych i kolejnych -2 bajtów przez Jo Kinga, ponieważ
!
był zbędny i;
nie jest wymagany.Wypróbuj online!
źródło
-0.25
. Napraw tę samą liczbę bajtówWolfram Language (Mathematica) , 22 bajty
Wypróbuj online!
źródło
APL (Dyalog Unicode) , 15 bajtów
Wypróbuj online!
Anonimowy przedrostek lambda.
Dzięki Adámowi za 4 bajty i kwakowi Krowy za 2 bajty.
W jaki sposób:
źródło
C # (.NET Core) , 69 bajtów
Wypróbuj online!
Nie golfowany:
źródło