Na 4chan popularna gra to get. Każdy post na stronie otrzymuje sekwencyjny identyfikator posta. Ponieważ nie możesz ich wpływać ani określać, ludzie próbują odgadnąć (przynajmniej część) własnego numeru postu, zwykle pierwszych kilku cyfr. Inna wersja gry nosi nazwę dubs, a jej celem jest uzyskanie powtarzających się cyfr na końcu numeru (tj. 1234555).
Twoim zadaniem, jeśli chcesz to zaakceptować, jest napisanie programu, który przyjmuje jako dane wejściowy identyfikator postu (standardowa liczba całkowita, możesz założyć poniżej 2 ^ 32) i zwraca liczbę powtarzających się cyfr na końcu.
Zasady
- Standardowe luki są niedozwolone .
- Program może być funkcją, pełnym programem, poleceniem REPL, cokolwiek działa, pod warunkiem, że do uruchomienia nie są potrzebne żadne niepoliczone kody / argumenty.
- Dane wejściowe mogą pochodzić z STDIN, argumentów funkcji, argumentu wiersza poleceń, pliku, co tylko Ci odpowiada.
Przypadki testowe
Input: 14892093
Output: 1
Input: 12344444
Output: 5
Input: 112311
Output: 2
Input: 888888
Output: 6
Input: 135866667 //Post number I got on /pol/ few days ago, rip
Output: 1
code-golf
number
number-theory
counting
sagiksp
źródło
źródło
Odpowiedzi:
Mathematica, 29 bajtów
Co powiesz na rozwiązanie arytmetyczne?
Bardzo się cieszę, że to przewyższa proste podejście Mathematica.
Wyjaśnienie
Sam kod oblicza 9 * n + n% 10, a następnie znajduje największą potęgę 10, która dzieli dane wejściowe, lub innymi słowy, zlicza zera końcowe. Musimy pokazać, jeśli n kończy się na k powtarzających się cyfr, że 9 * n + n% 10 ma k końcowych zer.
Cyfry powtórzeń najłatwiej jest wyrazić matematycznie, dzieląc liczbę taką jak 99999 (czyli 10 5 -1 ) przez 9, a następnie mnożąc przez powtórzoną cyfrę. Możemy więc napisać n = m * 10 k + d * (10 k -1) / 9 , gdzie m ≢ d (mod 10) , aby upewnić się, że n nie kończy się więcej niż k powtarzanymi cyframi. Zauważ, że d = n% 10 .
Podłączmy to do naszej formuły 9 * n + n% 10 . Otrzymujemy 9 * m * 10 k + d * (10 k -1) + d . D na końcu jest anulowane, przez to że pozostaje: 9 m * 10 * k + D * 10 k = (9 * M + d) * 10 k . Ale 9 ≡ -1 (mod 10) , więc 9 * m + d ≡ d - m (mod 10) . Ale stwierdziliśmy, że m ≢ d (mod 10), a zatem d - m ≢ 0 (mod 10) .
Innymi słowy, pokazaliśmy, że 9 * m + d nie jest podzielne przez 10, a zatem największa moc 10, która dzieli 9 * n + n% 10 = (9 * m + d) * 10 k to k , liczba końcowych powtarzających się cyfr.
Jako bonus, to rozwiązanie drukuje poprawny wynik
∞
, dla danych wejściowych0
.źródło
Siatkówka , 9 bajtów
Wypróbuj online!
Liczy liczbę nakładających się dopasowań,
(.)\1*$
których wyrażenie regularne pasuje do sufiksu identycznych znaków.źródło
(.)(?=\1*$)
.(?=(.)\1*$)
(w zasadzie taka sama jak twoja).Brachylog , 4 bajty
Wypróbuj online!
Wyjaśnienie
Gdyby
ḅ
działał bezpośrednio na liczbach całkowitych (i nie jestem pewien, dlaczego nie zaimplementowałem go w taki sposób, aby to zrobił), byłyby to tylko 3 bajty, ponieważẹ
nie byłyby potrzebne.źródło
Python 2 ,
4741 bajtówWypróbuj online!
36 bajtów - dla bardziej elastycznego wprowadzania
Wypróbuj online!
źródło
dir(object)
jest naszym przyjacielem c:JavaScript (ES6),
55523230 bajtówUżycie wyrażenia regularnego w celu dopasowania ostatniej grupy ostatniej cyfry
Uwaga: Pierwsze opublikowanie. Nie wahaj się czynić uwag.
źródło
/(.)\1*$/
f=
.C,
62564847 bajtówZapisano bajt dzięki @Steadybox!
Wypróbuj online!
źródło
PHP,
474540 bajtówBiegnij z
echo <n> | php -nR '<code>
wydaje się, że pętla jest wciąż mniejsza niż moja pierwsza odpowiedź. po prostu policz znaki, które są równe ostatnim. Używa to przesunięć ciągu ujemnego o wartości PHP 7.1 .
-5 bajtów Tytusa. Dzięki !
Stara odpowiedź:
usuwa z prawej każdy znak pasujący do znaku z prawej strony i oblicza różnicę długości.
źródło
-R
i$argn
może zaoszczędzić 5 bajtów.05AB1E , 4 bajty
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
CJam , 7 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Galaretka , 5 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Perl 5 , 22 bajtów
21 bajtów kodu +
-p
flaga.Wypróbuj online!
/(.)\1*$/
pobiera ostatnie identyczne liczby, a następnie$_=length$&
przypisuje swoją długość do$_
, która jest domyślnie drukowana dzięki-p
fladze.źródło
C (gcc) ,
3229 bajtówTo jest port mojej odpowiedzi w Pythonie .
Działa to z gcc, ale brak
return
instrukcji jest niezdefiniowanym zachowaniem.Wypróbuj online!
źródło
return
robi, to przechowywanie wartości zwracanej w EAX. W przypadku gcc przypisanie jej do zmiennej dzieje się tak samo. Jeśli chodzi o arytmetykę wskaźnika, po dodaniu 1 do wskaźnika int przenosi się do następnego int, a nie do następnego bajtu.Python 2, 51 bajtów
Pobiera na wejściu liczbę całkowitą. Wypróbuj online
48 bajtów dla ciągu jako danych wejściowych. Wypróbuj online
źródło
C # ,
6362 bajtówGrał w golfa
Bez golfa
Nieczytelny czytelny
Pełny kod
Prasowe
- 1 byte
- Dzięki komentarzowi Kevina .63 bytes
- Wstępne rozwiązanie.Notatki
Nic do dodania
źródło
i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}
Python 2 ,
3832 bajtyDzięki @xnor za zapisanie 6 bajtów!
Wypróbuj online!
źródło
MATL ,
65 bajtów1 bajt zapisany dzięki @Luis
Wypróbuj w MATL Online
Wyjaśnienie
źródło
&
zrobiło toY'
:-D Dlaczego nie wziąć wkładu jako ciągu ujętego w cytaty i się go pozbyćj
?Cubix,
2419 bajtówUwaga
Wypróbuj tutaj
Wyjaśnienie
Najpierw rozwińmy kostkę
Kroki wykonania można podzielić na trzy fazy:
Faza 1: Wejście
Pierwsze dwa znaki, które są wykonywane, to
A
iB
.A
odczytuje wszystkie dane wejściowe i wypycha je jako kody znaków na stos. Zauważ, że odbywa się to w odwrotnej kolejności, pierwsza postać kończy się na stosie, a ostatnia prawie na dole. Na samym dole znajduje się-1
(EOF
), który będzie używany jako licznik ilości kolejnych znaków na końcu ciągu. Ponieważ potrzebujemy, aby góra stosu zawierała dwa ostatnie znaki, odwracamy stos przed wejściem do pętli. Zauważ, że górna część stosu wygląda teraz:..., C[n-1], C[n], -1
.Miejsce IP na kostce jest tam, gdzie
E
jest i wskazuje w prawo. Wszystkie instrukcje, które nie zostały jeszcze wykonane, zostały zastąpione przez brak operacji (kropki).Faza 2: Porównanie postaci
Stos to
..., C[a-1], C[a], counter
, gdziecounter
jest licznik przyrostu, gdy dwa znaki do sprawdzenia (C[a]
iC[a-1]
) są równe. IP najpierw wchodzi w tę pętlę przyS
znaku, przesuwając się w prawo.E
Postać jest stanowisko, gdzie IP skończy się (wskazując prawo), gdyC[a]
iC[a-1]
nie mają tę samą wartość, co oznacza, że odjęcieC[a]
odC[a-1]
nie daje0
, w którym to przypadku instrukcji po!
zostanie pominięty (co jestw
).Oto instrukcje, które są wykonywane podczas pełnej pętli:
A potem się zapętla.
Faza 3: wydrukuj wynik
Ponieważ opuścił pętlę wcześnie, wygląd stos słuszne:
counter, ..., C[a-1]-C[a]
. Łatwo jest wydrukować licznik, ale musimy zwiększyć licznik raz, ponieważ nie zrobiliśmy tego w ostatniej iteracji pętli, i jeszcze raz, ponieważ-1
zamiast tego zaczęliśmy liczyć0
. Ścieżka na kostce wygląda tak, zaczynając odS
, wskazując w prawo. Dwie operacje „no-op” wykonywane przez adres IP są zastępowane strzałkami wskazującymi w kierunku adresu IP.Instrukcje są wykonywane w następującej kolejności. Zauważ, że
B)
instrukcje na końcu zmieniają stos, ale nie wpływają na program, ponieważ mamy zamiar go zakończyć i nie używamy już stosu.Alea iacta est.
źródło
Partia, 91 bajtów
W
-
zapobiega testy z zjechania początek łańcucha.źródło
JavaScript (ES6), 34 bajty
Nie krótszy niż rozwiązanie wyrażenia regularnego.
Funkcja rekurencyjna, która ocenia cyfry od prawej do lewej, zatrzymując się po napotkaniu innej cyfry. Wynikiem jest liczba iteracji.
p
jestundefined
na pierwszej iteracji, co oznaczan%10-p
zwrotyNaN
(fałsz). Następniep
równa się poprzedniej cyfrze zn%10
. Gdy bieżąca cyfra (n%10
) i poprzednia (p
) są różne, pętla kończy się.źródło
Röda , 12 bajtów
Wypróbuj online!
Jest to anonimowa funkcja, która oczekuje, że każdy znak ciągu wejściowego zostanie wypchnięty do strumienia (myślę, że jest to poprawne w duchu ostatniego pytania meta ).
Wykorzystuje dwa wbudowane:
count
itail
:count
odczytuje wartości ze strumienia i przekazuje liczbę kolejnych elementów do strumienia.tail
zwraca ostatnią wartość w strumieniu.źródło
T-SQL,
238214 bajtówLub:
źródło
Java 7, 78 bajtów
Wypróbuj tutaj.
Próbowałem pewnych rzeczy za pomocą rekurencji lub pętli, ale oba zakończyły się powyżej 100 bajtów ..
źródło
PowerShell, 41 bajtów
prosta pętla do tyłu, dopóki znak nie pasuje do ostatniego znaku w ciągu, zwróć indeks tego znaku -1.
-3 dzięki @AdmBorkBork - zamiast używać pętli for.
źródło
Mathematica,
3330 bajtówPodziękowania dla Grega Martina za uratowanie 3 bajtów.
Pobiera dane wejściowe jako ciąg.
Pobiera cyfry dziesiętne (w postaci znaków), dzieli je na przebiegi identycznych elementów, pobiera ostatni przebieg i oblicza długość standardową sztuczką polegającą na pobraniu sumy wektora
1^list
.źródło
Characters
zamiastIntegerDigits
?Narzędzia Bash + Unix, 34 bajty
Wypróbuj online!
źródło
JavaScript (ES6),
39383727 bajtówMoże nie mniej niż rozwiązanie oparte na wyrażeniach regularnych, ale nie mogłem się oprzeć napisaniu rozwiązania opartego całkowicie na arytmetyce. Techniką jest wielokrotne przyjmowanie
n % 100 % 11
i dzielenie przez 10, aż wynik będzie niezerowy, a następnie zliczanie iteracji. Działa to, ponieważ jeśli dwie ostatnie cyfry są takie same,n % 100 % 11
to będzie0
.źródło
f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)
Haskell , 33 bajty
Wypróbuj online!
Pobiera ciąg znaków. Wielokrotnie odcina pierwszy znak i dodaje 1, jeśli wszystkie znaki w sufiksie są równe pierwszemu.
źródło
R, 35 bajtów
Krótkie wyjaśnienie
źródło
Befunge-98 , 19 bajtów
Wypróbuj online!
Można by to skrócić, gdybym tylko użył stosu.
Jak to działa:
źródło
Python 3 -
5044 bajtyPełny program (w Pythonie 3
input()
zwraca ciąg, bez względu na dane wejściowe):źródło