Pracujesz nad kodem do generowania numerów identyfikacyjnych. Zasady wymagają, aby żadne numery identyfikacyjne nie zawierały sekwencji cyfr 666 .
Utwórz funkcję (lub odpowiednik twojego języka), która przyjmuje dodatni parametr liczby całkowitej i zwraca następną liczbę całkowitą, która nie zawiera 666, gdy liczba ta jest wyrażona w postaci dziesiętnej. (60606 jest w porządku, 66600 nie.)
Twój kod nie może używać pętli, która ją dodaje, dopóki nie znajdzie wyniku zgodnego z regułami.
f(1) returns 2.
f(665) returns 667.
f(665999999) returns 667000000 without having looped a million times.
(Following examples added since the question was first posed.)
f(666666666) also returns 667000000.
f(66600) returns 66700.
f(456667) returns 456670.
AKTUALIZACJA:
Zastąpienie 666 667 nie będzie działać, jeśli na wejściu jest więcej niż jeden 666.
66700
.Odpowiedzi:
Python, bez manipulacji ciągami
Prace znalezienie moce 10,
p
gdzie pojawia się 666, a dodającp - n % p
don
którego zastępuje666xxxxx
się66700000
.źródło
m /= 10
nam //= 10
. Jeśli tego nie zrobisz, m stanie się liczbą zmiennoprzecinkową, a warunekm % 1000 == 666
będzie stale fałszywy, a pozostałe „666” in pozostaną niezmienione.JavaScript (zaktualizowany do pracy ze wszystkimi testami)
Mało znaną prawdą jest to, że w rzeczywistości są cztery
6
, ale jedna zdradziła pozostałych i zamieniła się w formę kodu, aby usunąć je zeświatowychcyfr liczb. Oto ta zdradziecka szóstka:Oto wyjaśnienie. Najpierw upiększ kod i usuń niepotrzebne rzeczy, takie jak
''+'string'
i((code))
:Konwertuj dziwne notacje (jak
~indexOf
i['replace']
) na bardziej popularne:A teraz po prostu zrozum, że algorytm wygląda następująco:
Jeśli na wejściu jest już 666,
jeszcze,
Stara wersja (nie działa
666666666
) :Aby to zrozumieć, najpierw upiększmy to:
Teraz usuńmy niepotrzebne rzeczy, takie jak
'' + string
i'str' + 'ing'
, usuń niepotrzebnąs
zmienną i zmień dziwność jak-~![]
na1
:'l ength'['replace'](/ /g,'')
jest po prostu"length"
:I
"undefined"[0]
jest"u"
i"u".length
jest1
:Teraz skończone! Teraz powinno być dość łatwo to zrozumieć.
źródło
666666666
666666666
, a czcionka6
jest bardziej wyszukana;)~1
do!= -1
jest całkiem fajne.~a.indexOf('b')
generuje poprawny JS, wypróbuj go na livescript.net!Jabłkowy
Ta strona nie ma wystarczającej liczby odpowiedzi na Applescript. Wyrzućmy demony!
Dane wyjściowe dziennika:
Chciałem zamieścić w tym niektóre z mocniejszych cytatów z Egzorcysty , ale to zdecydowanie sprawiłoby, że ten post został opublikowany jako NSFW. Zamiast tego możesz przeczytać stronę IMDB.
źródło
Perl
Powiedziałeś, że nie wolno inkrementować w pętli. W ogóle nie używam żadnych operatorów matematycznych! Oto podejście polegające na zastępowaniu wyrażeń regularnych (nie ma gwarancji, że jest bezpieczne dla twojego zdrowia psychicznego).
Pierwsze trzy podstawienia zwiększają liczbę o jeden. Raz sam rozwiązałem ten problem, ale obejmował on zamianę, która musiała być zapętlona, aż nie będzie więcej podstawień, więc zamiast tego zastosowałem podejście Andrew Cheonga .
Czwarte podstawienie zamienia wszystkie cyfry następujące po
666
zerach. Ostateczne zastąpienie zamienia pozostałe666
w667
.Jako bonus będzie to działać z wieloma liczbami całkowitymi na wejściu, o ile są one oddzielone znakami niecyfrowymi.
źródło
LiveScript
To nagina zasady. Widzisz, powiedziałeś, że nie wolno mi używać pętli, która dodaje jedną, dopóki nie znajdzie poprawnego wyniku. Więc odjąć minus jeden zamiast!
Wersja golfowa dla
534845 bajtów dla zabawy:Dziękujemy użytkownikowi1737909 za dalszą pomoc w grze w golfa.
Testy
Wymaga Node.js z
LiveScript
modułem npm lub kompatybilną biblioteką asercji.źródło
Rubin
To (jak sądzę) pierwsza odpowiedź, która działa dla 666666666. (Z wyjątkiem oszukańczego odejmowania odpowiedzi -1;))
Spieszy mi się teraz; wyjaśnienie zostanie dodane później.
Aktualizacja : znacznie bardziej wydajna wersja (uważam, że prawie stały czas pracy):
źródło
PowerShell
źródło
jot
Wreszcie dobre zastosowanie
E.
!Zasadniczo znajdujemy pierwszą pozycję, w której argument jest pełny
666
, i zastępujemy to podciąg i wszystko po nim66700000...
do końca.Szczegółowo wyjaśnione:
":@>:
- Przyrost o jeden i konwersja na ciąg.'666'&E.
- Zrób wektor boolanów, prawdziwy w każdym miejscu, w którym ciąg „666” zaczyna się w ciągu.i.1:
- Znajdź indeks pierwszej prawdy w wektorze, w przeciwnym razie zwróć długość wektora.#@[-]
- Długość łańcucha (która jest również długością wektora) minus wyniki.
.'667'{.!.'0'~
- Weź podciąg „667” o długości tego wyniku, w razie potrzeby dopełnij po prawej stronie „0”.{.~
- Weź podciąg o długości oryginalnego wynikui.
.,
- Dołącz dwa razem.W użyciu:
A ponieważ nie jest to golf kodowy, nie trzeba go grać w piekło z szalonymi optymalizacjami. Wszyscy wygrywają!
źródło
DO#
148137 znakówBył w stanie zgolić kilka znaków dzięki @recursive
Nie golfowany:
Fiddle: http://dotnetfiddle.net/XB83bf
źródło
Int32
można je zastąpićint
.Pyton
źródło
Perl
Wbudowany kod, który zmienia zawartość w środku
$_
, dość standardowa ideologia w perlu. Może być używany w połączeniu z-p
taką flagą:źródło
jot
Bez ciągów, pętli lub warunków warunkowych:
Podobnie jak w rozwiązaniu karton_boks, dzieli to liczbę na grupy po trzy cyfry, dzieląc przez potęgi dziesięciu. Wykorzystuje wskaźnik pierwszego wystąpienia 666, aby odpowiednio zaokrąglić liczbę w górę.
źródło
Haskell (70 znaków)
Oto prosta implementacja w Haskell.
map digitToInt . show
do konwersji potencjalnie złego identyfikatora na listę cyfr.purge
dopasowuje wzór zła i zastępuje go dobrym odpowiednikiem.foldl' ((+).(*10)) 0
zmniejsza listę cyfr do jednejInteger
.Zobaczmy, czy to działa!
Wygląda dobrze. I dla zabawy wersja golfowa.
źródło
Jawa
Czy to nie wystarczy?
źródło
String.valueOf(currentId + 1)
.return Integer.parseInt(String.valueOf(currentId + 1).replace("666", "667"));
R
Zastąpienie 666 działaniem 667.
Wyniki
źródło
3 różne odpowiedzi JavaScript:
1. JavaScript (ECMAScript 6)
Konwertuje liczbę na ciąg znaków, a następnie iteruje każdy znak, dopóki nie znajdzie,
666
a następnie zmienia ostatni6
na a7
i wyprowadza0
dla wszystkich kolejnych znaków.2. JavaScript (wersja robocza ECMAScript 6)
Funkcja rekurencyjna bez manipulacji ciągiem:
Lub bardziej szczegółowo:
Testy:
3. JavaScript
Używanie wyrażeń regularnych:
Lub (to samo, ale przy użyciu ECMAScript 6)
źródło
6.667
tak technicznie, że nadal tam jest. Nie sądzę, że można temu zaradzić.1e20
jest o największym rzędzie wielkości, który JavaScript (przynajmniej w FireFox) wydrukuje jako liczbę całkowitą bez uciekania się do notacji naukowej.AWK
daje
edycja: 2. rozwiązanie
plony
źródło
awk
indeksuje łańcuchy na podstawie 1.f(665) returns 667
ponieważ prosi o „następną liczbę całkowitą, która nie zawiera 666”awk
ish ib) minimalizuje użycie funkcji string.Pyton:
Lub:
źródło
666666
w667667
zamiast667000
?Jawa
Za pomocą funkcji rekurencyjnej znajdź skrajnie lewy 666 i oblicz, ile należy zmienić, gdy ponownie pojawi się stos wywołań.
źródło
f(666666666) -> 667000000
popularity-contest
nie jestcode-golf
.Partia
Prosta iterowana manipulacja ciągiem.
Zaczyna się od pierwszych trzech znaków liczby (jako łańcucha) i przechodzi do końca, aż znajdzie 666, następnie zamienia 666 na 667 i zapętla długość łańcucha dodając zera.
Wszystkie przypadki testowe dają prawidłowe wyniki.
źródło
perl, 45 bajtów
Pojedynczy regex z flagą / e wykonuje całą pracę tutaj:
źródło
SQL
Mówiąc ściślej, SQL Server 2012 Transact-SQL.
źródło
Pyton
źródło
Julia
Wyniki REPL
źródło
DO#
Czy robię to dobrze
źródło
vba
W akcji:
wynik:
źródło
C ++
Wiem, że to nie jest kod-golf, ale (a) niektórzy sugerowali, że jest to dobre wyzwanie w golfa, i (b) to jest moje pierwsze wyzwanie / odpowiedź na golfa, pomyślałem, że będzie fajnie, a jeśli to zrobię tutaj nie pokazuję się w prawdziwym wyzwaniu golfowym za bycie okropnym golfistą. X)
Zasadniczo zastąpione „666” przez „667” działa, jeśli zrobisz to dla pierwszego wystąpienia liczby, a następnie wypiszesz końcowe zera.
Gra w golfa (
175155 znaków):Nie golfowany:
źródło
x+=c=='6'?1:0
, możesz uciecx+=c=='6'
. Jednak nie próbowałem tego.std::
wcześniejstringstream
. Bez tego się nie kompiluje.x+=c=='6'
zmniejszyć, a także spojrzeć na to z cyframi int, a nie na znaki sstream ...Rubin
źródło
perl, 36 tylko sub, bez bajtów
Krótsza wersja niż moje ostatnie rozwiązanie, wykorzystująca połączenie operacji arytmetycznych i wyrażeń regularnych.
źródło
do
OK - bez sprawdzania granic i zdecydowanie za dużo białych znaków, ale to nie golf. Również zabawne trochę formatowania w „while (d -> 0)”.
źródło