FizzBuzz jest tak prosty, że możesz to zrobić wstecz. W tym wyzwaniu otrzymasz długość ciągu FizzBuzz i musisz podać dodatnią liczbę całkowitą, która wytworzyła ten ciąg.
Opis
Aby to rozbić, ciąg FizzBuzz dla n
jest generowany przez następujący algorytm.
Zacznij od pustego ciągu i dla każdego i=1..n
(włącznie):
- Jeśli
i
jest podzielna przez3
i5
dołączFizzBuzz
do łańcucha. - Jeśli
i
jest podzielne przez3
appendFizz
. - Jeśli
i
jest podzielne przez5
appendBuzz
. - Jeśli nie
i
można podzielić przez żadną, dołącz dziesiętną reprezentacjęi
.
Na przykład FizzBuzz(15)
:
12Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzz
Otrzymasz Length(FizzBuzz(n))
i musisz ustalić n
. Możesz założyć, że dane wejściowe są dodatnie i zawsze będą miały długość niektórych ciągów FizzBuzz.
Zasady
Twoje rozwiązanie może zawierać pełną definicję programu lub funkcji w dowolnym standardowym języku. Twój program / funkcja może przyjmować argumenty i zwracać odpowiedzi w dowolny standardowy sposób . Standardowe luki są zabronione.
Możesz założyć, że dane wejściowe są dodatnie i prawidłowe (opisuje długość niektórych ciągów FizzBuzz) i są mniejsze niż największa liczba całkowita reprezentatywna dla twojego języka.
To jest golf golfowy, więc wygrywa najkrótsza liczba bajtów.
Przykłady
Oto kilka przykładowych przypadków
Length(FizzBuzz(n)) -> n
1 -> 1
6 -> 3
15 -> 6
313 -> 100
3677 -> 1001
Edytować
Naprawiono ostatni przypadek testowy. Dzięki @SteadyBox.
Odpowiedzi:
Galaretka ,
1614 bajtów2 bajty zapisane przy użyciu nowszych funkcji językowych
)
dlaµ€
iÄ
dla+\
Wypróbuj online! lub zobacz przypadki testowe .
W jaki sposób?
Tworzy listę długości każdego elementu od
1
wejścia, zmniejsza przez dodanie, a następnie znajduje na liście indeks oparty na jednym wejściu. (Oznacza to również, że nieprawidłowe dane wejściowe powodują0
„brak na liście”).źródło
C,
8178 bajtów68 bajtów, jeśli nie masz nic przeciwko konwersji do
double
i z powrotem:źródło
return i;
to potrzebne, ponieważ jest to powszechnie akceptowany sposób wyświetlania kodu w golfie, podczas gdy modyfikowanie tylko zmiennej globalnej nie jest. Zastanawiałem się nad użyciemlog10(i)+1
, ale pomyślałem, że może to powodować pewne problemy z powodu konwersji na podwójne i wstecz (np.pow(i)
Nie jest wiarygodny z liczbami całkowitymi). Wydaje się jednak, że teraz działa dobrze dla wszystkich dodatnich wartości, któreint
może reprezentować, więc prawdopodobnie mógłbym go użyć. (Przy wartościach większych niż zwykłaint
może wytrzymać, czasami się nie udaje, ale to nie ma znaczenia tutaj.)n
wskaźnik jako wskaźnik, a następnie po prostu zmodyfikować wartość, na którą wskazuje na końcu, ale to wymagałoby więcej kodu w witrynie wywoływania, aby móc wydrukować wartość, więc czuję się trochę jak dla mnie oszustwo.MATL ,
312827 bajtówWypróbuj online!
Wyjaśnienie
źródło
Mathematica, 67 bajtów
Jest to zarówno szybsze, jak i krótsze niż moje początkowe rozwiązanie:
lub moja desperacka próba skrócenia:
Wyjaśnienie
Standardowa
For
pętla, której wartość rośnien
dos := Length(FizzBuzz(n))
co najmniej równej wartości wejściowej#
. Jedynym interesującym bitem jest sposób, w jaki obliczam długość(n+1)
-tego składnika sekwencji FizzBuzzźródło
MATL,
31 3028 bajtówUżywa tego samego pomysłu, co rozwiązanie galaretki Jonathana Allena.
Wypróbuj na matl.suever.net !
źródło
Java 8,
10097 bajtówGra w golfa:
Nie golfowany:
Wydajność:
źródło
JavaScript (ES6),
6257 bajtówPrzypadki testowe
Pokaż fragment kodu
źródło
(!(++k%3)+!(k%5)<<2||`${k}`.length)
.JavaScript (ES6), 56 bajtów
źródło
Python 3, 78 bajtów
Funkcja rekurencyjna. Będzie wymagał zwiększenia limitu rekurencji dla każdego wyniku powyżej 1000.
Wyjaśnienie:
źródło
Python, 93 bajty
źródło
k, 33 bajtów
Krótkie wyjaśnienie (python-ish):
Przykład użycia kmac 2016.06.28:
źródło
dc ,
7670 bajtówWypróbuj online!
źródło
Rubinowy,
6966 bajtówPoczątkowo unikałem potworności zagnieżdżonego operatora potrójnego i zszedłem do 69 bajtów:
źródło
Java 8,
9593 bajtówTo jest zoptymalizowana wersja odpowiedzi @ Snowman
źródło
Groovy, 76 bajtów
def f(n){i=0;for(s='';s.size()<n;)s+=++i%15<1?"1"*8:i%5<1||i%3<1?"1"*4:i;i;}
Przeważnie to samo co odpowiedź @ Snowman , ale wykorzystuje trochę Groovy magii / różnic, aby zmniejszyć liczbę bajtów.
źródło
Perl 6 ,
5552 bajtówWypróbuj online!
Jak to działa
źródło
Japt , 20 bajtów
Spróbuj
źródło
Perl 5
-p
, 48 bajtówWypróbuj online!
źródło
C (gcc) , 68 bajtów,
stdout
spamowanieWypróbuj online!
C (gcc) , 74 bajty
Wypróbuj online!
źródło
05AB1E , 17 bajtów
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło