Na cześć ilu przedstawicieli miałem kilka godzin temu, kiedy po raz pierwszy pomyślałem o tym wyzwaniu:
Takie liczby, jak te składające się z jednej cyfry, nazywane są powtórkami . Repdigity są fajne! Każde ciało będzie bardziej szczęśliwy, jeśli kwota rep mieli był repdigit ¹ , ale jestem niecierpliwy, więc musisz mi pomóc dowiedzieć się, najszybszy sposób, aby dostać się do repdigit.
Oto twoje wyzwanie:
Biorąc pod uwagę dodatnie liczby całkowite reprezentujące reputację, wypisz minimalną liczbę powtórzeń, jaką muszą uzyskać, aby przejść do rekonstrukcji. Na przykład w momencie pisania tego wyzwania użytkownik Martin Ender miał 102 856 powtórzeń. Najbliższa cyfra powtórzenia to 111 111, więc musiałby zyskać: 8255 powtórzeń, żeby być na reprodukcji.
Ponieważ ludzie nie lubią tracić przedstawiciela, rozważymy tylko zmiany nieujemne. Oznacza to, że na przykład, jeśli ktoś ma 12 powtórzeń, zamiast stracić 1 powtórzenie, rozwiązaniem jest uzyskanie 10 powtórzeń. Dzięki temu „0” może być prawidłowym wyjściem, ponieważ każdy, kto ma 111 powtórzeń, jest już w trakcie repdigit.
Dane wejściowe i wyjściowe mogą mieć dowolny rozsądny format , a ponieważ nie można mieć mniej niż 1 powtórzenia w dowolnej witrynie Stack Exchange, można założyć, że żadne dane wejściowe nie będą mniejsze niż 1.
Jedna walizka do odnotowania:
Jeśli użytkownik ma mniej niż 10 powtórzeń, jest już na repdigit, więc potrzebuje również „0”.
Test IO:
#Input #Ouput
8 0
100 11
113 109
87654321 1234567
42 2
20000 2222
11132 11090
Obowiązują standardowe luki, a najkrótsze rozwiązanie w bajtach wygrywa!
110
powinienem dać1
, nawet jeśli nie ma sposobu na uzyskanie jednego powtórzenia.Odpowiedzi:
Galaretka , 6 bajtów
Dane wyjściowe to tablica singletonów.
Wypróbuj online! lub zweryfikuj większość przypadków testowych . Przypadek testowy 87654321 jest zbyt wolny dla TIO.
Jak to działa
źródło
Haskell, 39 bajtów
Wypróbuj online
źródło
Brachylog , 9 bajtów
Wypróbuj online!
Jest to dość skuteczne, ponieważ wykorzystuje arytmetykę ograniczeń.
Wyjaśnienie
źródło
This is the answer you're looking for. Figure it out for me
:)call_reside_vars/2
, pobierz zmienne CLP (FD) i oznacz je etykietą. Na przykład:call_residue_vars(Program, Vs0), include(fd_var, Vs0, Vs), label(Vs)
. Co myślisz?Python 2,
4140 bajtówNie najkrótsze podejście, ale bardzo wydajne. Przetestuj na Ideone .
Jak to działa
Dla
10**len(`n`)
zaokrągleń wejściowych n do najbliższej potęgi 10 . Następnie dzielimy wynik przez 9 . Zwraca to reprodukcję 1… 1, która ma tyle cyfr, ile n . Zapisujemy wynik w r . Na przykład, jeśli n = 87654321 , to r = 11111111 .Pożądana repdigit będzie wielokrotnością lub r . Aby zdecydować, wykonujemy podział sufitu n przez r . Ponieważ
/
piętra operatora podziału Pythona 2 można to osiągnąć za pomocą-n/r
, która da poprawną wartość bezwzględną ze znakiem ujemnym. Na przykład, jeśli n = 87654321 , to zwróci -8 .Wreszcie, należy pomnożyć przez iloraz obliczona -r powtórzyć iloraz raz dla każdej cyfry n . Na przykład, jeśli n = 87654321 , zwraca 88888888 , co jest pożądanym powtórzeniem.
Na koniec, aby obliczyć wymagany przyrost, odejmujemy n od poprzedniego wyniku. W naszym przykładzie n = 87654321 zwraca 1234567 , zgodnie z potrzebą .
źródło
lambda n:10**len(`n`)/9*-~int(`n*9`[0])-n
. To prawie działalambda n:int(`n*9`[0]*len(`n`))-n
, ale cyfra jest o jedną za małą i nie widzę dobrego sposobu, aby to naprawić.O(1)
.O(1)
, ale myślę, że ma to sens.Python 2, 37 bajtów
Przetestuj na Ideone . Należy zauważyć, że takie podejście jest zbyt nieefektywne w przypadku testowym 87654321 .
Jak to działa
Jeśli n jest już powtórką,
1-len(set(`n`))
zwróci 0, ponieważ długość zestawu cyfr n w bazie 10 będzie wynosić 1 . W takim przypadku f zwraca 0 .Jeśli n nie jest powtórzeniem,
f(n+1)
rekurencyjnie wywołuje f z następną możliwą wartością n .-~
zwiększa wartość zwracaną f ( 0 po znalezieniu repdigit) o 1 za każdym razem, gdy f jest wywoływana rekurencyjnie, więc końcowa wartość zwrotna jest równa liczbie wywołań f , tj. liczbie razy, do których n trzeba było zwiększyć uzyskać reprogramowanie.źródło
L
trzeba sobie radzić z długimi.-~
Pozwala funkcję policzyć liczbę połączeń to wykonane.Perl 6 , 23 bajtów
Lambda, która przyjmuje liczbę wejściową jako argument i zwraca wynik.
Wyjaśnienie:
...
operatora sekwencji do zwiększania liczby wejściowej, dopóki nie osiągnie repdigit (testowane przez podzielenie reprezentacji ciągu znaków na znaki i sprawdzenie, czy wszystkie są równe) .źródło
/(.)$0*/
Java 7,
11676 bajtówZastosowano niesamowite podejście @Dennis do obniżenia liczby bajtów o 40 bajtów.
Przypadki bez golfa i testy:
Wypróbuj tutaj.
Wydajność:
źródło
2222
a czwarte wyjście12345678
?2222
zamiast222
. Naprawiłem błąd w kodzie, ale przez przypadek nadal użyłem tutaj starego wyjścia. Teraz jest naprawione. Jeśli chodzi o czwarte, nie, powinno być123467
(jak widać na pytanie OP).Pyth,
987 bajtów1 bajt dzięki @FryAmTheEggman.
Wypróbuj online.
Bardzo nieefektywny, przechodzi przez wszystkie liczby od wejścia do następnego repdigit.
źródło
Brain-Flak
690358 bajtówOto mój wybór
Wypróbuj online
Wyjaśnienie
Zacznij od wykonania drugiej kopii danych wejściowych, która jest o jeden mniejsza niż oryginał. Kopię wykorzystamy do wyszukania następnej repdigit. Odejmujemy jeden w przypadku, gdy sam numer był redygitem
Naciśnij jeden, aby zaspokoić nadchodzącą pętlę. (nie musi to być jeden, a nie zero)
Ta pętla będzie działać, dopóki na stosie nie pojawi się repdigit
Pop bzdury. Ich „boolean” na górze, który napędza pętlę, ponieważ nie jest już potrzebny, pop go.
Dodaj jeden i zduplikuj górę. Kopia zostanie rozłożona na cyfry.
Podczas gdy kopia nie jest zerem ...
Skopiuj ponownie
Mod 10 i przejdź na drugi stos
Podziel przez 10 (dzielenie całkowite)
Podaj zero, które było naszą kopią
Teraz zdekomponowaliśmy liczbę do jej 10 cyfr, więc zamieniliśmy wszystkie cyfry na stos.
Podczas gdy cyfra wiodąca nie jest zerem
Odbieramy kopię wysokości stosu (tj. Liczby cyfr) ...
Po cichu odejmij jeden z każdej liczby na stosie
Umieść wysokość stosu, którą podnieśliśmy. (i zamień na inny stos)
Używamy wysokości stosu, aby wyciągnąć wszystkie cyfry umieszczone na drugim stosie z powrotem na odpowiedni stos.
Podaj zero, które było naszą wysokością stosu
Zamień z powrotem na stos cyframi (lub jakie były cyfry)
Koniec pętli
Teraz odjęliśmy górną cyfrę od wszystkich pozostałych cyfr. Jeśli wszystkie cyfry są zerowe, liczba początkowa (nie liczba wejściowa, ale liczba, którą sprawdzamy) była powtórką.[potrzebne źródło] . Musimy więc sprawdzić niezerowe.
Podczas gdy wysokość stosu nie jest równa zero
Jeśli cyfra nie jest równa zero, przenieś ją na drugi stos i zastąp ją zerem.
Pop to (teraz jest zero)
Koniec pętli
Zamień na drugi stos (duh ..)
Chwyć za siebie kopię wysokości stosu minus dwa
Podczas gdy wysokość stosu nie jest równa dwóm (oryginał i akumulator)
Pop top
Zakończ chwilę
Odłóż naszą kopię wysokości stosu minus dwa. Ostatecznie jest to liczba cyfr, które nie są takie same jak pierwsza cyfra. Innymi słowy, jeśli wynosi zero, jest to zmiana.
Jeśli ta pętla się skończy, znaleźliśmy repdigit
Pop „boolean”
Odejmij oryginał z repdigit
źródło
Python 2, 52 bajty
Python 2 ma kilka sztuczek, dzięki którym jest to krótsze. Na przykład dane wejściowe są numeryczne, więc nie musimy rzutować na int. (-5 bajtów) Nie musimy również umieszczać nawiasów wokół
a-b
(-1 bajtów)Użyj tego skryptu, aby zweryfikować wszystkie przypadki testowe:
Możesz także spróbować online!
źródło
GNU sed, 223 + 1 (flaga r) = 224 bajty
Biegać:
Wydajność:
Jest to czyste rozwiązanie sed , arytmetyka jest symulowana przy użyciu tylko wyrażeń regularnych. Algorytm działa w następujący sposób:
^current_reputation:needed_reputation%$
a)
%:
stosuje przyrost do potrzebnej_reputacjib)
:%
stosuje przyrost do bieżącej_reputacjiźródło
Jawa,
7472 bajty(Jeśli inny wpis Java ma 76 bajtów, ten jest
7472, ponieważ to jestdwacztery bajty krótsze).W każdym razie, po prostu zwiększaj dane wejściowe, aż będzie to zmiana, jednocześnie zwiększając licznik. Zwróć licznik.
Tak, są to trzy plusy z rzędu, dwa do zwiększenia danych wejściowych, jeden do konkatenacji pustego łańcucha w celu utworzenia łańcucha.
Nie, nie sądziłem, że byłoby to legalne bez odstępu między nimi, ale proszę bardzo. To właśnie zrobi literówka: jeden bajt krótszy.
Użycie pętli for zamiast chwil zajmuje dokładnie tyle bajtów:
Edytować:
Wcześniejsza wersja musiała
matches("^(\\d)\\1*$")
sprawdzać poprawność, ale ponieważ właśnie przekonwertowaliśmy int na ciąg,.
wystarczy użyć dopasowania.Przypadki bez golfa i testy:
Wypróbuj tutaj.
}
Wydajność:
źródło
R,
1029891 bajtówNie golfowany:
Bałagan z formatem (
) dodaje kilka bajtów, ale R nie jest tak naprawdę elastyczny!as.numeric
ias.character
źródło
Perl, 40 + 1 (
-n
) = 41 bajtówJeśli
0
akceptowalne jest drukowanie niczego zamiast gdy liczba jest już powtórna, to 37 bajtów wystarczy:Uruchom z
-n
(1 bajtem) i-E
lub-M5.010
(za darmo):Objaśnienia : kod składa się z dwóch głównych części:
/^(.)\1*$/&&say$v
i$_++&&++$v&&redo
. Pierwszy sprawdza, czy$_
jest to redigit; jeśli tak, wypisuje liczbę dodaną do pierwotnego numeru, aby uczynić go repdigit ($v
), a jeśli nie, mieliśmy 1 do obu$_
i$v
, i zaczynamy od nowa.źródło
perl -pe '@x=sort/./g;//;$_=(($x[-1]>$&)+$&)x+@x-$_'
JavaScript (ES6), 42 bajty
Objaśnienie: Rekurencyjnie oblicza się
p
jako następną potęgę10
pon
. Cyfra, która ma zostać powtórzona, jest następnie obliczana jako1+floor(9n/p)
, a ponowne łączenie jest po prostu(p-1)/9
, z którego wynika wynik.źródło
05AB1E ,
106 bajtówWypróbuj online!
Wyjaśnienie
źródło
§
i zmień¹-
naα
. A tutaj dość podobna 8-bajtowa alternatywa:∞+.ΔÙg}α
Pyke,
1311 bajtówWypróbuj tutaj!
źródło
Właściwie 15 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Meduza , 20 bajtów
Wypróbuj online! TIO nie może obsługiwać dłuższych przypadków testowych, ale biorąc pod uwagę wystarczającą ilość czasu i pamięci, one również powinny działać.
Wyjaśnienie
i
jest wejściem, i<
zmniejsza go. Ta wartość jest podawana do funkcji po lewej stronie.\>
zwiększa wartość (przynajmniej raz), dopóki funkcja po prawej stronie nie da prawdziwej wartości.&
-ami) czterech funkcji.0~j
konwertuje na ciąg.u
usuwa zduplikowane cyfry.>
usuwa nagłówek powstałego ciągu.N
jest logiczną negacją: daje1
pusty ciąg i0
niepuste. W ten sposób funkcja sprawdza cyfrę powtórzenia, a wynikiem\
jest kolejne liczenie powtórzeń od<i
.)-
odejmuje wynik od funkcji wejściowej, to znaczy<i
.<
zmniejszona o jeden, więc zmniejsza się. Na koniecp
drukuje wynik.źródło
PowerShell v2 +, 66 bajtów
Zwykle dobry do gry w golfa bardzo luźny rzut PowerShell jest tutaj poważnym minusem.
Pobiera dane wejściowe
$n
jako ciąg znaków i wchodzi wfor
pętlę. W kroku konfiguracji wyodrębniamy pierwszy znak$n[0]
, ale musimy go przekonwertować z powrotem na ciąg"$(...)"
przed rzutowaniem jako int+
i zapisaniem w$x
. W przeciwnym razie późniejsza arytmetyka będzie używać wartości ASCII kodu char.Warunkowe sprawdza, czy łańcuch skonstruowany z
$n.length
"$x"
s, tymczasowo przechowywany w$y
, jest mniejszy niż$n
. Dopóki tak nie jest, zwiększamy$x++
, ustawiając warunek dla następnej pętli.Na przykład dla danych wejściowych
123
wartość$y
pierwszego sprawdzenia stanu warunkowego będzie111
mniejsza niż$n
, więc pętla będzie kontynuowana. W ciele pętli nie ma nic, więc następuje krok przyrostu$x++
, a następnie warunek jest ponownie sprawdzany. Ten czas$y
jest równy222
, która jest większa niż$n
, więc w wygaśnięciem pętli. Jeśli dane wejściowe są już repdigit, warunek nie jest spełniony, ponieważ w tym momencie$y
jest równy$n
.Po wyjściu z pętli rzucamy
$y
na liczbę całkowitą+
, a następnie odejmujemy$n
. Ten wynik pozostaje w potoku, a dane wyjściowe są niejawne.źródło
PHP 5.6,
59535150 bajtówZaoszczędź
68 bajtów dzięki @manatwork.Testuj z:
count_chars()
Funkcja z 3, a drugi parametr zwraca łańcuch znaków wyróżniających znaków łańcucha. Gdy ten łańcuch ma 1 znak ([1]
zwróci false, gdy ma długość 1), następnie wykonaj echo$b
, w przeciwnym razie zwiększ$b
i zapętl ponownie.źródło
count_chars()
. Co powiesz na 3 jako parametr trybu $? Więc będzie towhile
warunek:count_chars($argv[1]+$b,3)[1]
.count
astrlen
przynajmniej okazało się, że jest tej samej długości.echo$b?:0;
MATL , 10 bajtów
Wypróbuj online!
To zwiększa wartość wejściową, dopóki wszystkie cyfry nie będą równe, więc będzie wolno. Przypadek testowy dla limitów wejściowych
87654321
w kompilatorze online.źródło
Ruby, 42 znaki
Oczekuje wprowadzenia ciągu.
Przykładowy przebieg:
Ruby, 39 znaków
Wywołanie rekurencyjne, działa na „SystemStackError: poziom stosu zbyt głęboki” przy większych wynikach.
Przykładowy przebieg:
źródło
Matlab,
6564 bajtówZ powodu pętli while jest raczej powolna ...
Wyjaśnienie
Oszczędność jednego bajtu dzięki @Luis Mendo .
źródło
+0
?diff
automatycznie rzuca znaki na liczbydiff
traktuje ciąg znaków jako sym i próbuje różnicować.Przewyższać,
8579 bajtówUmieść następującą formułę w dowolnej komórce oprócz komórki,
N
ponieważ jest to nazwa referencyjnej komórki wejściowej:Wyjaśnienie:
N
jest wejściem, a także nazwą komórki odniesienia .LEFT(N)
weź pierwszą cyfrę wartości wejściowej.LEN(N)
zwraca długość wartości wejściowej.REPT(LEFT(N),LEN(N))
powtórz pierwszą cyfręLEN(N)
razy wartość wejściową i pomnóż ją przez 1, aby przekonwertować format tekstu na format liczb, abyśmy mogli go użyć do porównania liczb.źródło
Num_chars
wLEFT
i zapisać 4 bajty:LEFT(N)
IF
warunek do1
lub0
używając,--
więc nie musisz powtarzać się tylko, aby+1
:=REPT(LEFT(N)+(--1*(REPT(LEFT(N),LEN(N)))<N),LEN(N))-N
=REPT(LEFT(N)+(1*(REPT(LEFT(N),LEN(N)))<N),LEN(N))-N
Brachylog v2, 6 bajtów
Wypróbuj online!
5-bajtowi
+↙.=∧
pomija się pomijanie,ℕ
ponieważ w ogóle nie wypróbowuje wyników dodatnich, ale kończy się niepowodzeniem, gdy podano liczbę, która jest już powtórką, ponieważ w ogóle nie wypróbowuje wyników dodatnich.źródło
Java, 59 bajtów
(Nadal nie jestem pewien, jak liczyć wpisy Java, ale zgodnie ze standardowym zestawem pierwszego wpisu Java , ten wpis ma 59 bajtów, ponieważ jest 17 bajtów krótszy).
W każdym razie, jeśli mamy powtórkę, zwróć 0, w przeciwnym razie dodaj 1 do wejścia, wywołaj siebie i dodaj 1 do wyniku.
Przypadki bez golfa i testy:
Wypróbuj tutaj.
Wydajność:
Jak widać, ostatni wpis zabraknie pamięci, zanim będzie mógł się zakończyć. (Bardzo właściwe)
StackOverflowError
jest wyrzucany zjava.util.regex.Pattern.sequence(Pattern.java:2134)
, ale jestem przekonany, nie ma nic złego w samej regex, ponieważ jest to ten sam użyłem w moim poprzednim wpisie .źródło
C #, 82 bajty
źródło
C, 84 bajtów
Test główny:
źródło
Prolog, 120 bajtów
Wypróbuj online!
źródło