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.



@ 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]).

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!


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).


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.


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.


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]

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!


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.


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

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.



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 .


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.


4

C #, 42 33 28 byte

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

i harus berupa string.

Banyak dicukur berkat @LethalCoder


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.



3

JavaScript (ES6), 23 21 byte

Disimpan 2 byte berkat Neil

Mengambil input sebagai integer atau string. Mengembalikan boolean.

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

Demo


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?

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!


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.


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}

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


@Deadcode Whoops saya lupa memasukkan itu, terima kasih!
Grimmy


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!


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");
}

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.

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])

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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.