Apakah nomor ini repdigit?

33

Tantangan

Sebuah repdigit adalah bilangan bulat non-negatif yang digit semua sama.

Buat fungsi atau program lengkap yang mengambil integer tunggal sebagai input dan output nilai kebenaran jika nomor input adalah repdigit di basis 10 dan nilai falsy sebaliknya.

Input dijamin menjadi bilangan bulat positif .

Anda dapat mengambil dan menggunakan input sebagai representasi string di basis 10 dengan impunitas.

Uji kasus

Ini semua repdigits di bawah 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

Daftar yang lebih besar dapat ditemukan di OEIS .

Kemenangan

Kode terpendek dalam byte menang. Itu tidak berarti bahwa jawaban yang cerdas dalam bahasa verbal tidak akan diterima.

Aidan F. Pierce
sumber
2
Terkait .
Leaky Nun
@ AidanF.Pierce Berapa input terbesarnya?
stevefestl

Jawaban:

21

Brachylog , 1 byte

=

Cobalah online!

Ini bekerja pada bilangan bulat.

Dari 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]).
Biarawati Bocor
sumber
Saya telah memutuskan untuk menerima yang ini karena ini adalah pengiriman 1 byte paling awal.
Aidan F. Pierce
19

C (gcc) , 33 30 29 byte

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

Cobalah online!

Dennis
sumber
Trik yang sangat bagus dengan rekursi dan tugas bukannya return(pikir saya akan mencuri yang terakhir untuk jawaban saya :)).
Gagang Pintu
@ Doorknob Silakan. :) Anda harus menentukan kompiler; Saya berharap ini menjadi cukup banyak gcc / tcc saja.
Dennis
Tahukah Anda sebelumnya bahwa gcc dengan -O0akan menulis hasil akhir ndari tepat eax, sehingga menjadikannya nilai pengembalian? Bisakah Anda menguraikan logika mengapa Anda tahu itu akan berhasil?
Ruslan
@Ruslan Saya tidak yakin mengapa gcc berperilaku seperti ini, tetapi penugasan variabel terakhir dalam suatu fungsi berakhir pada eax lebih sering daripada tidak. Jika saya harus menebak, saya akan mengatakan itu karena itu memungkinkan return nuntuk menjadi nop, dan tidak ada alasan untuk menetapkan variabel lokal di akhir fungsi jika Anda tidak akan mengembalikan hasilnya.
Dennis
9

COBOL , 139 Byte

Saya merasa COBOL tidak suka bermain golf kode (mungkin karena tidak mungkin menang) tetapi begini:

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 didefinisikan sebagai PIC 9 (4).

SaggingRufus
sumber
2
Anda dapat golf ini dengan mengubah TRUEdan FALSEuntuk 1 dan 0 masing
Caird coinheringaahing
6

Python 3, 25, 24 19 byte.

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

Varian kode kesalahan stdin =>.

Mengembalikan kode kesalahan 0 jika itu adalah repdigit - atau kesalahan pada kegagalan.

Terima kasih untuk Dennis yang telah membantu saya dalam komentar.

Bayangan
sumber
Karena kode keluar 0 menunjukkan keberhasilan, saya pikir Anda harus menguji >1daripada <2. Memunculkan kesalahan aktual akan lebih pendek daripada menggunakan exitbtw.
Dennis
Saya bertanya-tanya tentang itu. Tantangannya mengatakan "nilai yang benar". Saya akan mengubahnya untuk memunculkan kesalahan.
Bayangan
1
Ya, if python3 repdigit.py; then echo truthy; else echo falsy; fiharus bekerja sesuai dengan definisi di luar, jadi 0 itu benar dan yang lainnya salah.
Dennis
Itu masuk akal. Ok, saya akan mengubahnya juga.
Bayangan
2
@ Arc676 Unary *membongkar iterable. Misalnya, {*'123'}menghasilkan set {'1','2','3'}.
Dennis
6

Mathematica, 27 byte

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

Itu tidak mengalahkan Equal@@IntegerDigits@#&, tetapi mengalahkan solusi Mathematica berbasis aritmatika lainnya.

Repdigits adalah dari bentuk n = d (10 m -1) / 9 di mana m adalah jumlah digit dan d adalah digit yang diulang. Kita dapat memulihkan d dari n dengan mengambilnya modulo 10 (karena jika itu adalah digit rep, itu digit terakhir akan menjadi d ). Jadi kita bisa mengatur ulang ini sebagai m = log 10 (9 n / (n% 10) + 1) dan memeriksa apakah m adalah bilangan bulat.

Martin Ender
sumber
5

Haskell , 15 byte

all=<<(==).head

Cobalah online! Mengambil input string.

Setara dengan \s->all(==head s)s. Mengalahkan alternatif:

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]
Tidak
sumber
f s=(s<*s)==(s*>s)adalah ide yang sangat menarik, saya tidak menyadari perilaku ini <*sebelumnya.
Laikoni
5

C (gcc), 41 byte

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

Ini adalah fungsi yang mengambil input sebagai string dan mengembalikan 1jika itu adalah repdigit dan 0sebaliknya.

Ini dilakukan dengan memanfaatkan strspnfungsi, yang mengambil dua string dan mengembalikan panjang awalan terpanjang dari string pertama yang hanya terdiri dari karakter dari string kedua. Di sini, string pertama adalah input, dan string kedua adalah digit terakhir dari input, diperoleh dengan melewatkan sebuah pointer ke karakter terakhir dari string input.

Jika inputnya adalah repdigit, maka hasil dari panggilan strspnitu adalah strlen(s). Kemudian, pengindeksan ke sakan mengembalikan byte nol jika hal ini terjadi ( str[strlen(str)]selalu \0) atau digit pertama yang tidak cocok dengan digit terakhir. Meniadakan ini dengan !hasil apakah smewakili repdigit.

Cobalah online!

Terima kasih kepada @Dennis karena secara tidak langsung mengingatkan saya pada trik assign-bukan-return melalui jawaban yang luar biasa mengesankan , menghemat 4 byte!

Gagang pintu
sumber
Anda dapat mempersingkat ini sedikit lebih jauh dengan menghindari strlendan membuat string baru dari *s: c;f(char*s){c=*s;c=!s[strspn(s,&c)];}for 37.
hvd
5

PHP, 25 28 25

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

hapus semua karakter dari kanan yang sama dengan karakter pertama dan cetak 1jika semua karakter dihapus.

Christoph
sumber
5

R, 31 byte

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

Fungsi ini bekerja dengan input string dan menggunakan ekspresi reguler untuk menentukan apakah input tersebut adalah repdigit.

Contoh

> 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
sumber
28 byte dengan beralih dari fungsi (x) ke menggunakan pemindaian (, '') tio.run/##K/r/P70otSBHQylOQ08zJsZQS0VJpzg5MU9DR11dU/O/paXlfwA
Sumner18
5

/// , 110 byte

/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

Cobalah online!

Bahasa /// tidak memiliki konsep truthy dan falsey, jadi ini menghasilkan "T" jika inputnya adalah repdigit, dan tidak menampilkan karakter apa pun jika inputnya bukan repdigit.

Tanner Swett
sumber
4

Oktaf , 11 byte

@(s)s==s(1)

Cobalah online!

Mengambil input sebagai string.

Ini memeriksa semua karakter untuk kesetaraan dengan karakter pertama. Jika semua sama, hasilnya akan menjadi vektor hanya 1(true in Octave), jika tidak akan ada setidaknya satu 0(false dalam Octave). Ini buktinya .

Stewie Griffin
sumber
Tidakkah Anda perlu membungkusnya all(...)untuk mendapatkan output nilai truthy / falsy?
Tom Carpenter
Apakah Anda menguji buktinya? Sepotong kode itu adalah definisi (konsensus meta) dari true / false pada ppcg.
Stewie Griffin
4

grep, 17 byte

grep -xP '(.)\1*'

Cocok dengan string apa pun yang merupakan pengulangan karakter pertama.

Toby Speight
sumber
4

C #, 42 33 28 byte

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

i harus berupa string.

Banyak dicukur berkat @LethalCoder

LiefdeWen
sumber
2
i[0].ToString()dapat disingkat menjadi i[0]+"", <1lebih pendek dari ==0.
TheLethalCoder
1
Juga .Length<1bisa saja==""
TheLethalCoder
3

Braingolf , 6 byte

iul1-n

Cobalah online!

Sayangnya, input implisit Braingolf dari commandline args tidak dapat menerima input semua digit sebagai string, itu akan selalu melemparkannya ke angka, jadi alih-alih solusinya adalah melewatinya melalui STDIN, yang menambahkan 1 byte untuk membaca STDIN ( i)

Penjelasan:

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

Setelah u, panjang tumpukan sama dengan jumlah karakter unik dalam input, kurangi 1 artinya akan menjadi 0dan jika hanya ada 1 karakter unik dalam input, 0adalah satu-satunya angka falsey dalam Python, jadi nakan diganti 0dengan 1, dan yang lainnya 0.

Skidsdev
sumber
3

JavaScript (ES6), 23 21 byte

Disimpan 2 byte berkat Neil

Mengambil input sebagai integer atau string. Mengembalikan boolean.

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

Demo

Arnauld
sumber
Tidak menggunakan testbukannya !!execmenyimpan 2 byte?
Neil
(Meskipun, untuk input string saja, porting jawaban PHP bahkan lebih pendek.)
Neil
@Neil Saya tidak tahu apa yang saya pikirkan. Terima kasih!
Arnauld
3

Ohm , 4 byte

Ul2<

Cobalah online!

Penjelasan

 Ul2<
 U    # Push uniquified input
  l   # Length
   2< # Is it smaller than 2?
Datboi
sumber
Saya pikir Ul≤harus bekerja.
Christoph
@Christoph Yee Saya punya itu tapi saya tidak yakin apakah 0 dianggap sebagai nilai yang sebenarnya. (Cukup baru dalam hal codegolf ini ^^)
Datboi
Ah sial 0itu palsu dan setiap angka lainnya adalah benar. Saya hanya memperhatikan bahwa kita membutuhkan hal yang sebaliknya untuk tantangan ini (seringkali kita diizinkan untuk bertukar selama kita menyatakan kasus mana yang benar dan mana yang palsu). Kebenaran didefinisikan oleh "akan mengambil brench".
Christoph
Ul1Ejuga harus bekerja (walaupun saya tidak tahu Ohm) karena tidak perlu menangani 0.
Buah Esolanging
3

APL, 5 byte

2 byte disimpan berkat @KritixiLithos

⍕≡1⌽⍕

Cobalah online!

Uriel
sumber
Anda dapat mengubah solusi 7-byte menjadi 5 byte dengan menggunakan kereta ⊢≡1⌽⊢.
Kritixi Lithos
@KritixiLithos terima kasih!
Uriel
Ganti dengan untuk menangani string dan angka.
Adm
@ Adam terima kasih! Saya tidak berpikir memformat sebagai cara mendapatkan berbagai digit.
Uriel
3

Java, 21 byte:

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

ladalah MutableList<Character>dari koleksi gerhana.

Nathan Merrill
sumber
1
lbisa juga menjadi CharAdapter.
Donald Raab
@DonaldRaab oooh, saya belum pernah melihat kelas itu. Temuan yang bagus.
Nathan Merrill
Ada CodePointAdapter dan CodePointList juga.
Donald Raab
1
@DonaldRaab Saya menggunakan sedikit koleksi gerhana, tapi saya selalu kesulitan menemukan apa pun di luar koleksi Daftar / Peta / Set standar. Apakah pengetahuan Anda didasarkan pada pengembangan perpustakaan, atau apakah ada di suatu tempat (selain javadoc) saya dapat menemukan referensi yang lebih baik untuk semua yang disediakan EC?
Nathan Merrill
Senang mendengarnya. Saya seorang committer untuk framework ... Saya menulis kelas terkait String ini sekitar setahun yang lalu. Ada Panduan Referensi yang tidak diketahui banyak orang. Ada peta pikiran yang baru-baru ini saya kumpulkan untuk membantu orang-orang belajar dan menavigasi sejumlah besar fitur di perpustakaan. Ini tautan terakhir dalam Daftar Isi referensi. Panduan. github.com/eclipse/eclipse-collections/blob/master/docs/…
Donald Raab
3

Kotlin , 28 19 byte

{it.toSet().size<2}

Cobalah online!

Mengambil input sebagai Stringkarena

Anda dapat mengambil dan menggunakan input sebagai representasi string di basis 10 dengan impunitas.

Penjelasan

{
    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
}

Jika Anda tidak suka fakta dibutuhkan String, Anda dapat memiliki satu yang mengambil Intuntuk 24 byte .

{(""+it).toSet().size<2}
siput_
sumber
3

Regex (ECMAScript), 31 byte

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

Cobalah online!

Mengambil input di unary, seperti biasa untuk regex matematika (perhatikan bahwa masalahnya sepele dengan input desimal: adil ^(.)\1*$).

Penjelasan:

^(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
Grimmy
sumber
@Deadcode Whoops saya lupa memasukkan itu, terima kasih!
Grimmy
2

PHP, 30 byte

<?=($a=$argn).$a[0]==$a[0].$a;
pengguna63956
sumber
@Dada No.. Ini akan membandingkan 4344 dan 4434.
user63956
Oh benar, salahku. terima kasih
Dada
2

Neim , 1 byte

𝐐

Cukup periksa bahwa semua elemen sama.

Tanpa builtin, 2 byte:

𝐮𝐥

Penjelasan:

𝐮     Calculate unique digits
 𝐥    Get the length

Ini bekerja karena hanya 1dianggap benar di Neim, dan yang lainnya salah.

Atau, untuk 4 byte:

𝐮𝐣μ𝕃

Penjelasan:

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

Cobalah!

Okx
sumber
2

C, 38 byte

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

Secara rekursif berjalan seutas tali. Jika dua karakter pertama berbeda ( *s^s[1]) maka kita berhasil hanya jika kita berada di akhir string ( !s[1]) kalau tidak kita ulangi tes di posisi berikutnya ( f(s+1)).

Program uji

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

Java, 38 33 23 byte

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

nadalah String, secara alami.

Perhatikan bahwa tidak perlu untuk ^...$dalam regex karena secara otomatis digunakan untuk pencocokan tepat (seperti matchmetode), dibandingkan dengan menemukan dalam string.

Cobalah!

Menghemat

  • -5 byte: digunakan String karena "Anda dapat mengambil dan menggunakan input sebagai string dengan impunitas."
  • -10 byte: regex tampaknya cocok.
Olivier Grégoire
sumber
Akan memposting solusi yang tepat ini, termasuk penjelasan tentang matchestidak memerlukan ^$karena cocok dengan seluruh String. Jadi +1 pasti dari saya. ;)
Kevin Cruijssen
2

R, 25 byte

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

Cobalah online

Solusi non-regex terbaik yang bisa saya buat adalah 36 byte:

is.na(unique(el(strsplit(x,"")))[2])
pengguna2390246
sumber
1
untuk opsi lain pada non-regexrle(charToRaw(scan(,'')))$v[2]<1
MickyT
2

Cubix , 15 byte

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

Cobalah online!

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

Tonton Jalankan

Keluaran 1 untuk kebenaran dan tidak ada untuk falsey

Sangat mudah dibaca membaca di input satu karakter sekaligus. Ini menghilangkan karakter saat ini dari sebelumnya. Jika bukan hasil nol maka segera berhenti. Kalau tidak, itu terus memasukkan dan membandingkan sampai EOI. Pada EOI (-1), negasikan dan keluar

MickyT
sumber
2

QBasic 4.5, 55 byte

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

Saya sudah menghitungnya! FOR-loop memeriksa jumlah digit pada input, lalu membuatc , yang merupakan serangkaian panjang 1 sama dengan input. Angka kemudian adalah repdigit jika ia memodulasi satu-string == 0.

Cobalah online! Perhatikan bahwa penerjemah online agak aneh dan saya harus menulis beberapa pernyataan bahwa IDE QBasic berbasis DOS akan berkembang secara otomatis.

steenbergh
sumber