Czy ten numer to reedycja?

33

Wyzwanie

Repdigit jest liczbą całkowitą nieujemną których cyfry są równe.

Utwórz funkcję lub pełny program, który pobiera jedną liczbę całkowitą jako dane wejściowe i wyświetla prawdziwą wartość, jeśli liczba wejściowa to powtórka w bazie 10, a w przeciwnym razie wartość fałsz.

Dane wejściowe mają być dodatnią liczbą całkowitą.

Możesz bezkarnie pobierać i wykorzystywać dane wejściowe jako ciąg znaków w bazie 10.

Przypadki testowe

Są to wszystkie reprodukcje poniżej 1000.

1
2
3
4
5
6
7
8
9
11
22
33
44
55
66
77
88
99
111
222
333
444
555
666
777
888
999

Większą listę można znaleźć w OEIS .

Zwycięski

Najkrótszy kod w bajtach wygrywa. Nie oznacza to, że sprytne odpowiedzi w pełnych językach nie będą mile widziane.

Aidan F. Pierce
źródło
2
Związane .
Leaky Nun
@ AidanF.Pierce Jaka będzie największa liczba?
stevefestl

Odpowiedzi:

21

Brachylog , 1 bajt

=

Wypróbuj online!

Działa to na liczbach całkowitych.

Od src/predicates.pl#L1151:

brachylog_equal('integer':0, 'integer':0, 'integer':0).
brachylog_equal('integer':0, 'integer':I, 'integer':I) :-
    H #\= 0,
    integer_value('integer':_:[H|T], I),
    brachylog_equal('integer':0, [H|T], [H|T]).
Leaky Nun
źródło
Zdecydowałem się zaakceptować ten, ponieważ jest to najwcześniejsze przesłanie 1-bajtowe.
Aidan F. Pierce
19

C (gcc) , 33 30 29 bajtów

f(n){n=n%100%11?9/n:f(n/10);}

Wypróbuj online!

Dennis
źródło
Bardzo fajna sztuczka z rekurencją i przydziałem zamiast return(myślę, że ukradnę to drugie dla mojej odpowiedzi :)).
Klamka
@Doorknob Śmiało. :) Musisz jednak podać kompilator; Spodziewam się, że będzie to tylko gcc / tcc.
Dennis
Czy wiesz wcześniej, że gcc z -O0zapisze ndokładnie wynik końcowy z eax, aby uczynić go wartością zwracaną? Czy mógłbyś wyjaśnić logikę, dlaczego wiedziałeś, że to zadziała?
Ruslan
@ Ruslan Nie jestem pewien, dlaczego gcc tak się zachowuje, ale ostatnie przypisanie zmiennej w funkcji kończy się częściej w eax. Gdybym musiał zgadywać, powiedziałbym, że to dlatego, że pozwala return nbyć nop i nie ma powodu, aby przypisywać zmienną lokalną na końcu funkcji, jeśli nie zamierzasz zwrócić wyniku.
Dennis
9

COBOL , 139 BYTÓW

Wydaje mi się, że COBOL nie kocha się w golfa kodowego (prawdopodobnie dlatego, że nie ma szans, by wygrał), ale oto:

IF A = ALL '1' OR ALL '2' OR ALL '3' OR ALL '4' OR ALL '5' OR
ALL '6' OR ALL '7' OR ALL '8' OR ALL '9' DISPLAY "TRUE" ELSE   
DISPLAY "FALSE".

A jest zdefiniowane jako PIC 9 (4).

SaggingRufus
źródło
2
Można golf to przez zmianę TRUEi FALSEaby odpowiednio 1 i 0
Caird coinheringaahing
6

Python 3, 25, 24 19 bajtów.

len({*input()})>1>t

Wariant stdin => kod błędu.

Zwraca kod błędu 0, jeśli jest to repdigit - lub błąd w przypadku niepowodzenia.

Dzięki Dennisowi za pomoc w komentarzach.

Cień
źródło
Ponieważ kod zakończenia 0 oznacza sukces, myślę, że powinieneś >1raczej przetestować niż <2. Zgłoszenie rzeczywistego błędu byłoby krótsze niż użycie exitbtw.
Dennis
Zastanawiałem się nad tym. Wyzwanie mówi „prawdziwa wartość”. Zmienię to, aby zgłosić błąd.
Shadow
1
Tak, if python3 repdigit.py; then echo truthy; else echo falsy; fimusi działać zgodnie z naszą definicją, więc 0 to prawda, a wszystko inne to fałsz.
Dennis
To ma sens. Ok, ja też dokonam tej zmiany.
Shadow
2
@ Arc676 Unary *rozpakowuje iterowalny . Na przykład {*'123'}generuje zestaw {'1','2','3'}.
Dennis
6

Mathematica, 27 bajtów

AtomQ@Log10[9#/#~Mod~10+1]&

Nie bije Equal@@IntegerDigits@#&, ale bije inne rozwiązania matematyczne oparte na arytmetyce.

Repdigity mają postać n = d (10 m -1) / 9, gdzie m jest liczbą cyfr, a d jest cyfrą powtarzaną. Możemy odzyskać d od n , biorąc go modulo 10 (ponieważ jeśli jest to cyfra powtórzenia, to ostatnią cyfrą będzie d ). Możemy więc zmienić to na m = log 10 (9 n / (n% 10) + 1) i sprawdzić, czy m jest liczbą całkowitą.

Martin Ender
źródło
5

Haskell , 15 bajtów

all=<<(==).head

Wypróbuj online! Pobiera ciąg znaków.

Odpowiednik \s->all(==head s)s. Wąsko pokonuje alternatywy:

f s=all(==s!!0)s
f s=s==(s!!0<$s)
f(h:t)=all(==h)t
f(h:t)=(h<$t)==t
f s=(s<*s)==(s*>s)
f(h:t)=h:t==t++[h]
xnor
źródło
f s=(s<*s)==(s*>s)to bardzo ciekawy pomysł, wcześniej nie zdawałem sobie z tego sprawy <*.
Laikoni
5

C (gcc), 41 bajtów

f(char*s){s=!s[strspn(s,s+strlen(s)-1)];}

Jest to funkcja, która pobiera dane wejściowe jako ciąg znaków i zwraca, 1jeśli jest to repdigit i 0inaczej.

Robi to za pomocą strspnfunkcji, która pobiera dwa ciągi i zwraca długość najdłuższego prefiksu pierwszego ciągu składającego się tylko z znaków z drugiego ciągu. Tutaj pierwszy ciąg jest wejściem, a drugi ciąg jest ostatnią cyfrą wejścia, uzyskaną przez przekazanie wskaźnika do ostatniego znaku ciągu wejściowego.

Iff wejście jest repdigit, a następnie wynikiem połączenia strspnbędzie strlen(s). Następnie indeksowanie do szwróci bajt zerowy, jeśli tak jest ( str[strlen(str)]zawsze \0) lub pierwsza cyfra, która w innym przypadku nie pasuje do ostatniej cyfry. Negowanie tego !powoduje, że sreprezentuje repdigit.

Wypróbuj online!

Dzięki @Dennis za pośrednie przypomnienie mi sztuczki polegającej na przypisaniu zamiast powrotu za pomocą jego niesamowicie imponującej odpowiedzi , oszczędzając 4 bajty!

Klamka
źródło
Możesz to nieco skrócić, unikając strleni tworząc nowy ciąg z *s: c;f(char*s){c=*s;c=!s[strspn(s,&c)];}for 37.
hvd
5

PHP, 25 28 25

<?=!chop($argn,$argn[0]);

usuń wszystkie znaki z prawej strony, które są równe pierwszemu i wydrukuj, 1jeśli wszystkie znaki zostały usunięte.

Christoph
źródło
5

R, 31 bajtów

function(x)grepl("^(.)\\1*$",x)

Ta funkcja działa z wejściowymi ciągami znaków i używa wyrażenia regularnego do ustalenia, czy dane wejściowe są repdigit.

Przykład

> f <- function(x)grepl("^(.)\\1*$",x)
> x <- c("1", "2", "11", "12", "100", "121", "333")
> f(x)
[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE
Sven Hohenstein
źródło
28 bajtów, przełączając się z funkcji (x) na użycie skanowania (, '') tio.run/##K/r/P70otSBHQylOQ08zJsZQS0VJpzg5MU9DR11dU/O/paXlfwA
Sumner18
5

/// , 110 bajtów

/11/1//22/2//33/3//44/4//55/5//66/6//77/7//88/8//99/9//1/.//2/.//3/.//4/.//5/.//6/.//7/.//8/.//9/.//T..///.//T

Wypróbuj online!

Język /// nie ma pojęcia prawdy i falseya, więc to wypisuje „T”, jeśli wejście jest repdigit, i nie wypisuje żadnych znaków, jeśli wejście nie jest repdigit.

Tanner Swett
źródło
4

Oktawa , 11 bajtów

@(s)s==s(1)

Wypróbuj online!

Pobiera dane wejściowe jako ciąg.

Sprawdza równość wszystkich znaków z pierwszymi. Jeśli wszystkie są równe, wynikiem będzie wektor z tylko 1(prawda w oktawie), w przeciwnym razie będzie co najmniej jeden 0(fałsz w oktawie). Oto dowód .

Stewie Griffin
źródło
Czy nie musisz go owijać, all(...)aby uzyskać wynik wartości prawda / fałsz?
Tom Carpenter
Czy przetestowałeś dowód? Ten fragment kodu to definicja (meta consensus) true / false na ppcg.
Stewie Griffin,
4

grep, 17 bajtów

grep -xP '(.)\1*'

Dopasowuje dowolny ciąg znaków, który jest powtórzeniem jego pierwszego znaku.

Toby Speight
źródło
4

C #, 42 33 28 bajtów

i=>i.Replace(i[0]+"","")==""

i musi być ciągiem.

Dużo się ogoliłem dzięki @LethalCoder

LiefdeWen
źródło
2
i[0].ToString()można skrócić i[0]+"", <1jest krótszy niż ==0.
TheLethalCoder
1
Również .Length<1może być po prostu==""
TheLethalCoder
3

Braingolf , 6 bajtów

iul1-n

Wypróbuj online!

Niestety, niejawne dane wejściowe Braingolfa z argumentów wiersza poleceń nie mogą zaakceptować danych składających się z samych cyfr jako ciągów znaków, zawsze będą one rzutować je na liczby, więc zamiast tego rozwiązaniem jest przekazanie ich przez STDIN, który dodaje 1 bajt do odczytu STDIN ( i)

Wyjaśnienie:

iul1-n
i       Read from STDIN as string, push each codepoint to stack
 u      Remove duplicates from stack
  l     Push length of stack
   1-   Subtract 1
     n  Boolean negate, replace each item on stack with 1 if it is a python falsey value
        replace each item on stack with 0 if it is a python truthy value
        Implicit output of last item on stack

Po udługość stosu jest równa liczbie unikalnych znaków na wejściu, odjęcie 1 oznacza, to będzie 0wtedy i tylko wtedy, gdy istnieje dokładnie jeden wyjątkowy charakter na wejściu, 0to jedyna liczba falsey w Pythonie, więc nzastąpi 0z 1, i wszystko inne z 0.

Skidsdev
źródło
3

JavaScript (ES6), 23 21 bajtów

Zaoszczędzono 2 bajty dzięki Neilowi

Pobiera dane wejściowe jako liczbę całkowitą lub ciąg znaków. Zwraca wartość logiczną.

n=>/^(.)\1*$/.test(n)

Próbny

Arnauld
źródło
Nie używa testzamiast !!exec2 bajtów?
Neil
(Chociaż w przypadku danych wejściowych zawierających tylko łańcuch przesyłanie odpowiedzi PHP jest jeszcze krótsze.)
Neil
@ Neil Nie wiem o czym myślałem. Dzięki!
Arnauld
3

Ohm , 4 bajty

Ul2<

Wypróbuj online!

Wyjaśnienie

 Ul2<
 U    # Push uniquified input
  l   # Length
   2< # Is it smaller than 2?
Datboi
źródło
Myślę, że Ul≤powinien działać.
Christoph
@Christoph Tak, miałem to, ale nie byłem pewien, czy 0 liczy się jako prawdziwa wartość. (Całkiem nowa rzecz w tym codegolfie ^^)
Datboi
Ach cholera 0to falsey, a każda inna liczba jest prawdziwa. Właśnie zauważyłem, że do tego wyzwania potrzebujemy dokładnie odwrotności (często wolno nam się wymieniać, dopóki deklarujemy, który przypadek jest prawdziwy, a który falsey). Prawda jest zdefiniowana przez „wziąłby sukę”.
Christoph
Ul1Epowinien również działać (choć nie znam Ohma), ponieważ nie musi obsługiwać 0.
Esolanging Fruit
3

APL, 5 bajtów

2 bajty zapisane dzięki @KritixiLithos

⍕≡1⌽⍕

Wypróbuj online!

Uriel
źródło
Możesz zagrać w 7-bajtowe rozwiązanie do 5 bajtów pociągiem ⊢≡1⌽⊢.
Kritixi Lithos
@KritixiLithos dzięki!
Uriel
Wymień się obsługiwać oba ciągi i cyfry.
Adám
@ Adám dzięki! Nie myślałem o formatowaniu jako sposobie uzyskiwania szeregu cyfr.
Uriel
3

Java, 21 bajtów:

l->l.toSet().size()<2

lpochodzi MutableList<Character>z kolekcji Eclipse.

Nathan Merrill
źródło
1
lmoże być również CharAdapter.
Donald Raab,
@DonaldRaab oooh, nigdy nie widziałem tej klasy. Niezłe znalezisko.
Nathan Merrill,
Istnieje również CodePointAdapter i CodePointList.
Donald Raab,
1
@DonaldRaab Często używam kolekcji zaćmień, ale zawsze staram się znaleźć coś poza standardowymi kolekcjami List / Map / Set. Czy twoja wiedza oparta jest na rozwoju bibliotek, czy jest gdzieś (poza javadoc) mogę znaleźć lepsze odniesienie do wszystkiego, co zapewnia EC?
Nathan Merrill,
Miło to słyszeć. Jestem zwolennikiem frameworka ... Napisałem te konkretne klasy związane ze Sznurkiem jakiś rok temu. Istnieje Przewodnik, o którym wielu ludzi nie wie. Niedawno przygotowałem mapę myśli, aby pomóc ludziom uczyć się i poruszać po mnóstwie funkcji w bibliotece. To ostatni link w spisie treści ref. Przewodnik. github.com/eclipse/eclipse-collections/blob/master/docs/…
Donald Raab
3

Kotlin , 28 19 bajtów

{it.toSet().size<2}

Wypróbuj online!

Pobiera dane wejściowe jako Stringponieważ

Możesz bezkarnie pobierać i wykorzystywać dane wejściowe jako ciąg znaków w bazie 10.

Wyjaśnienie

{
    it.toSet()     // create a Set (collection with only unique entries)
                   // out of the characters of this string
        .size < 2  // not a repdigit if the set only has one entry
}

Jeśli nie podoba się fakt, że trwa String, można mieć jeden, który trwa Intdo 24 bajtów .

{(""+it).toSet().size<2}
ślimak_
źródło
3

Regex (ECMAScript), 31 bajtów

^(x{0,9})((x+)\3{8}(?=\3$)\1)*$

Wypróbuj online!

Pobiera dane wejściowe jednoargumentowe, jak zwykle w przypadku wyrażeń regularnych matematycznych (zwróć uwagę, że problem jest prosty w przypadku liczb dziesiętnych: po prostu ^(.)\1*$).

Wyjaśnienie:

^(x{0,9})           # \1 = candidate digit, N -= \1
(                   # Loop the following:
  (x+)\3{8}(?=\3$)  # N /= 10 (fails and backtracks if N isn’t a multiple of 10)
  \1                # N -= \1
)* $                # End loop, assert N = 0
Ponury
źródło
@Deadcode Ups, zapomniałem to włożyć, dzięki!
Grimmy,
2

PHP, 30 bajtów

<?=($a=$argn).$a[0]==$a[0].$a;
użytkownik63956
źródło
@Dada Nie. Będzie porównywał 4344 i 4434.
user63956
No tak, moje złe. dzięki
Dada,
2

Neim , 1 bajt

𝐐

Po prostu sprawdza, czy wszystkie elementy są równe.

Bez wbudowanego 2 bajty:

𝐮𝐥

Wyjaśnienie:

𝐮     Calculate unique digits
 𝐥    Get the length

To działa, ponieważ tylko 1 w Neim jest uważane za prawdziwe, a wszystko inne jest fałszem.

Alternatywnie, dla 4 bajtów:

𝐮𝐣μ𝕃

Wyjaśnienie:

𝐮      Calculate unique digits
 𝐣      Join list into an integer
   𝕃   Check that is is less than
  μ    Ten.

Spróbuj!

Okx
źródło
2

C, 38 bajtów

f(char*s){return*s^s[1]?!s[1]:f(s+1);}

Rekurencyjnie chodzi po sznurku. Jeśli pierwsze dwa znaki różnią się ( *s^s[1]), to odniesiemy sukces tylko wtedy, gdy znajdziemy się na końcu ciągu ( !s[1]), w przeciwnym razie powtórzymy test na następnej pozycji ( f(s+1)).

Program testowy

#include <stdio.h>
int main(int argc, char **argv)
{
    while (*++argv)
        printf("%s: %s\n", *argv, f(*argv)?"yes":"no");
}
Toby Speight
źródło
2

Java, 38 33 23 bajty

n->n.matches("(.)\\1*")

n jest String oczywiście.

Zauważ, że nie ma potrzeby ^...$wyrażenia regularnego, ponieważ jest ono automatycznie używane do dokładnego dopasowania (takiego jak matchmetoda), w porównaniu do znalezienia w ciągu.

Spróbuj!

Oszczędza

  • -5 bajtów: używane String ponieważ „Możesz bezkarnie pobierać i wykorzystywać dane wejściowe jako ciąg znaków”.
  • -10 bajtów: regex jest najwyraźniej dobrym dopasowaniem.
Olivier Grégoire
źródło
Już miał opublikować to dokładne rozwiązanie, w tym wyjaśnienie, że matchesnie jest wymagane, ^$ponieważ pasuje do całego ciągu. A więc zdecydowana +1 ode mnie. ;)
Kevin Cruijssen
2

R, 25 bajtów

grepl("^(.)\\1*$",scan())

Wypróbuj online

Najlepsze rozwiązanie nieregexowe, jakie mogłem wymyślić, to 36 bajtów:

is.na(unique(el(strsplit(x,"")))[2])
użytkownik2390246
źródło
1
dla innej opcji rle(charToRaw(scan(,'')))$v[2]<1
nieregex
2

Cubix , 15 bajtów

uOn@ii?-?;.$@<_

Wypróbuj online!

    u O
    n @
i i ? - ? ; . $
@ < _ . . . . .
    . .
    . .

Watch It Run

Wyjście 1 dla prawdy i nic dla falsey

Bardzo prosty odczyt czyta z wejścia po jednym znaku na raz. Odciąga obecną postać od poprzedniej. Jeżeli wynik jest niezerowy, natychmiast się zatrzymuje. W przeciwnym razie kontynuuje wprowadzanie i porównywanie do EOI. Na EOI (-1) zaneguj i wyjdź

MickyT
źródło
2

QBasic 4.5, 55 bajtów

INPUT a
FOR x=1TO LEN(STR$(a))
c=c*10+1
NEXT
?a MOD c=0

Dopasowałem to! Pętla FOR sprawdza liczbę cyfr na wejściu, a następnie tworzy c, która jest ciągiem 1 długości równej wejściowej. Liczba jest następnie reprodukowana, jeśli moduluje jeden ciąg == 0.

Wypróbuj online! Zauważ, że interpreter online jest nieco dziwaczny i musiałem napisać kilka stwierdzeń, że oparte na DOS QBasic IDE rozszerzy się automatycznie.

Steenbergh
źródło