Con số này có phải là chữ số không?


33

Thử thách

Một repdigit là một số nguyên không âm có các chữ số đều bằng nhau.

Tạo một hàm hoặc chương trình hoàn chỉnh lấy một số nguyên duy nhất làm đầu vào và xuất giá trị trung thực nếu số đầu vào là một chữ số trong cơ sở 10 và giá trị sai lệch khác.

Đầu vào là đảm bảo được một dương tính số nguyên.

Bạn có thể lấy và sử dụng đầu vào làm đại diện chuỗi trong cơ sở 10 với sự không trừng phạt.

Các trường hợp thử nghiệm

Đây là tất cả các chữ số dưới 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

Một danh sách lớn hơn có thể được tìm thấy trên OEIS .

Chiến thắng

Mã ngắn nhất tính bằng byte thắng. Điều đó không có nghĩa là câu trả lời thông minh trong các ngôn ngữ dài dòng sẽ không được hoan nghênh.



@ AidanF.Pierce Số lượng lớn nhất đầu vào sẽ là bao nhiêu?
stevefestl

Câu trả lời:



19

C (gcc) , 33 30 29 byte

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

Hãy thử trực tuyến!


Thủ thuật rất hay với đệ quy và bài tập thay vì return(nghĩ rằng tôi sẽ đánh cắp câu trả lời sau cho câu trả lời của mình :)).
Doorknob

@Doorknob Đi trước. :) Bạn sẽ phải chỉ định một trình biên dịch mặc dù; Tôi hy vọng điều này sẽ được khá nhiều gcc / tcc mà thôi.
Dennis

Bạn có biết trước rằng gcc với -O0sẽ viết kết quả cuối cùng nchính xác eax, để biến nó thành giá trị trả về không? Bạn có thể giải thích logic tại sao bạn biết nó sẽ hoạt động?
Ruslan

@Ruslan Tôi không chắc tại sao gcc lại hoạt động như vậy, nhưng việc gán biến cuối cùng bên trong một hàm sẽ xuất hiện thường xuyên hơn so với không. Nếu tôi phải đoán, tôi sẽ nói rằng vì nó cho phép return nlà một nop và không có lý do gì để gán cho một biến cục bộ ở cuối hàm nếu bạn sẽ không trả về kết quả.
Dennis

9

COBOL , 139 BYTES

Tôi cảm thấy như COBOL không có bất kỳ tình yêu nào trong việc chơi golf mã (có lẽ bởi vì không có cách nào nó có thể giành chiến thắng) nhưng ở đây:

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 được định nghĩa là PIC 9 (4).


2
Bạn có thể chơi golf này bằng cách thay đổi TRUEFALSEthành 1 và 0 tương ứng
caird coinheringaahing


6

Python 3, 25, 24 19 byte.

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

Một stdin => biến thể mã lỗi.

Trả về mã lỗi 0 nếu đó là một số kỹ thuật số - hoặc lỗi do lỗi.

Cảm ơn Dennis đã giúp tôi trong các ý kiến.


Vì mã thoát 0 biểu thị thành công, tôi nghĩ bạn nên kiểm tra >1chứ không phải <2. Tăng một lỗi thực tế sẽ ngắn hơn so với sử dụng exitbtw.
Dennis

Tôi đã tự hỏi về điều đó. Thách thức nói "một giá trị trung thực". Tôi sẽ thay đổi nó để đưa ra một lỗi.
Bóng tối

1
Vâng, if python3 repdigit.py; then echo truthy; else echo falsy; fiphải làm việc theo định nghĩa, vì vậy 0 là sự thật và mọi thứ khác là giả.
Dennis

Điều đó có ý nghĩa. Ok tôi cũng sẽ thay đổi.
Bóng tối

2
@ Arc676 Unary *giải nén một lần lặp. Ví dụ, {*'123'}tạo tập hợp {'1','2','3'}.
Dennis

6

Toán học, 27 byte

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

Nó không đánh bại Equal@@IntegerDigits@#&, nhưng nó đánh bại giải pháp Mathicala dựa trên số học khác.

Các chữ số có dạng n = d (10 m -1) / 9 trong đó m là số chữ số và d là chữ số lặp lại. Chúng ta có thể khôi phục d từ n bằng cách lấy modulo 10 (vì nếu là chữ số rep, chữ số cuối cùng sẽ là d ). Vì vậy, chúng ta có thể sắp xếp lại thứ này dưới dạng m = log 10 (9 n / (n% 10) + 1) và kiểm tra xem m có phải là số nguyên hay không.


5

Haskell , 15 byte

all=<<(==).head

Hãy thử trực tuyến! Đưa đầu vào chuỗi.

Tương đương với \s->all(==head s)s. Thu hẹp các lựa chọn thay thế:

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)là một ý tưởng rất thú vị, tôi đã không biết về hành vi này <*trước đây.
Laikoni

5

C (gcc), 41 byte

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

Đây là một hàm lấy đầu vào dưới dạng một chuỗi và trả về 1nếu nó là một chữ số và 0ngược lại.

Nó thực hiện điều này bằng cách sử dụng strspnhàm, lấy hai chuỗi và trả về độ dài của tiền tố dài nhất của chuỗi thứ nhất chỉ bao gồm các ký tự từ chuỗi thứ hai. Ở đây, chuỗi đầu tiên là đầu vào và chuỗi thứ hai là chữ số cuối cùng của đầu vào, thu được bằng cách chuyển một con trỏ đến ký tự cuối cùng của chuỗi đầu vào.

Nếu đầu vào là một chữ số, thì kết quả của cuộc gọi strspnsẽ là strlen(s). Sau đó, lập chỉ mục vào ssẽ trả về một byte null nếu đây là trường hợp ( str[strlen(str)]luôn luôn \0) hoặc chữ số đầu tiên không khớp với chữ số cuối cùng. Phủ định điều này với !kết quả trong việc sđại diện cho một chữ số.

Hãy thử trực tuyến!

Cảm ơn @Dennis đã gián tiếp nhắc nhở tôi về thủ thuật chuyển nhượng thay vì trả lại thông qua câu trả lời cực kỳ ấn tượng của anh ấy , tiết kiệm 4 byte!


Bạn có thể rút ngắn điều này thêm một chút bằng cách tránh strlenvà tạo một chuỗi mới từ *s: c;f(char*s){c=*s;c=!s[strspn(s,&c)];}cho 37.
hvd

5

PHP, 25 28 25

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

xóa tất cả các ký tự từ bên phải bằng với 1ký tự đầu tiên và in nếu tất cả các ký tự đã bị xóa.


5

R, 31 byte

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

Hàm này hoạt động với đầu vào chuỗi và sử dụng biểu thức chính quy để xác định xem đầu vào có phải là chữ số không.

Thí dụ

> 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 bằng cách chuyển từ chức năng (x) sang sử dụng quét (, '') 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

Hãy thử trực tuyến!

Ngôn ngữ /// không có bất kỳ khái niệm nào về sự thật và chim ưng, do đó, ngôn ngữ này xuất ra chữ "T" nếu đầu vào là một chữ số và không xuất bất kỳ ký tự nào nếu đầu vào không phải là chữ số.



4

Octave , 11 byte

@(s)s==s(1)

Hãy thử trực tuyến!

Lấy đầu vào là một chuỗi.

Nó kiểm tra tất cả các ký tự cho sự bình đẳng với các ký tự đầu tiên. Nếu tất cả đều bằng nhau, kết quả sẽ là một vectơ chỉ 1(đúng trong Octave), nếu không sẽ có ít nhất một 0(sai trong Octave). Đây là một bằng chứng .


Bạn sẽ không cần phải bọc nó all(...)để có được đầu ra giá trị trung thực / giả?
Tom Carpenter

Bạn đã kiểm tra bằng chứng? Đoạn mã đó là định nghĩa (đồng thuận meta) đúng / sai trên ppcg.
Stewie Griffin

4

grep, 17 byte

grep -xP '(.)\1*'

Khớp với bất kỳ chuỗi nào là sự lặp lại của ký tự đầu tiên của nó.


4

C #, 42 33 28 byte

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

i phải là một chuỗi.

Cạo râu rất nhiều nhờ @LethalCoder


2
i[0].ToString()có thể rút ngắn lại i[0]+"", <1ngắn hơn ==0.
TheLethalCoder

1
Cũng .Length<1có thể là==""
TheLethalCoder

3

Braingolf , 6 byte

iul1-n

Hãy thử trực tuyến!

Thật không may, đầu vào ẩn của Braingolf từ dòng lệnh không thể chấp nhận đầu vào tất cả các chữ số dưới dạng một chuỗi, nó sẽ luôn chuyển nó thành một số, vì vậy thay vào đó, giải pháp là chuyển nó qua STDIN, thêm 1 byte để đọc STDIN ( i)

Giải trình:

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

Sau đó u, độ dài của ngăn xếp bằng số lượng ký tự duy nhất trong đầu vào, trừ đi 1 có nghĩa là nó sẽ là 0nếu và chỉ khi có chính xác 1 ký tự duy nhất trong đầu vào, 0là số falsey duy nhất trong Python, do đó nsẽ thay thế 0bằng 1, và mọi thứ khác với 0.



3

JavaScript (ES6), 23 21 byte

Đã lưu 2 byte nhờ Neil

Lấy đầu vào là số nguyên hoặc chuỗi. Trả về một boolean.

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

Bản giới thiệu


Không sử dụng testthay vì !!execlưu 2 byte?
Neil

(Mặc dù, đối với đầu vào chỉ có chuỗi, việc chuyển câu trả lời PHP thậm chí còn ngắn hơn.)
Neil

@ Không biết tôi đang nghĩ gì. Cảm ơn!
Arnauld

3

, 4 byte

Ul2<

Hãy thử trực tuyến!

Giải trình

 Ul2<
 U    # Push uniquified input
  l   # Length
   2< # Is it smaller than 2?

Tôi nghĩ Ul≤nên làm việc.
Christoph

@Christoph Yee Tôi đã có điều đó nhưng tôi không chắc nếu 0 được tính là giá trị trung thực. (Khá mới đối với thứ codegolf này ^^)
Datboi

Ah chết tiệt 0là falsey và mọi số khác là sự thật. Tôi chỉ nhận thấy rằng chúng tôi cần chính xác điều ngược lại cho thử thách này (thường chúng tôi được phép trao đổi miễn là chúng tôi tuyên bố trường hợp nào là sự thật và đó là falsey). Truthy được định nghĩa bởi "sẽ mất một thời gian".
Christoph

Ul1Ecũng nên hoạt động (mặc dù tôi không biết Ohm) vì nó không cần xử lý 0.
Esolanging Fruit

3

APL, 5 byte

Lưu 2 byte nhờ @KritixiLithos

⍕≡1⌽⍕

Hãy thử trực tuyến!


Bạn có thể đánh golf giải pháp 7 byte thành 5 byte bằng cách sử dụng tàu ⊢≡1⌽⊢.
Kritixi Lithos

@KritixiLithos cảm ơn!
Uriel

Thay thế bằng để xử lý cả chuỗi và số.
Adám

@ Adám cảm ơn! Tôi đã không nghĩ về định dạng như là một cách để có được các mảng chữ số.
Uriel

3

Java, 21 byte:

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

llà một MutableList<Character>từ bộ sưu tập nhật thực.


1
lcũng có thể là một CharAd CHƯƠNG.
Donald Raab

@DonaldRaab oooh, tôi chưa bao giờ thấy lớp học đó. Đẹp tìm thấy.
Nathan Merrill

Cũng có CodePointAdOG và CodePointList.
Donald Raab

1
@DonaldRaab Tôi sử dụng các bộ sưu tập nhật thực khá nhiều, nhưng tôi luôn phải vật lộn để tìm bất cứ thứ gì ngoài bộ sưu tập Danh sách / Bản đồ / Bộ tiêu chuẩn. Kiến thức của bạn dựa trên sự phát triển của các thư viện, hay ở đâu đó (ngoài javadoc) tôi có thể tìm thấy một tài liệu tham khảo tốt hơn cho mọi thứ EC cung cấp?
Nathan Merrill

Vui mừng khi nghe nó. Tôi là một người ủy thác cho khung công tác ... Tôi đã viết các lớp liên quan đến Chuỗi đặc biệt này cách đây một năm. Có một Hướng dẫn tham khảo mà nhiều người không biết. Có một bản đồ tư duy gần đây tôi đã tập hợp lại để giúp mọi người tìm hiểu và điều hướng qua rất nhiều tính năng trong thư viện. Đây là liên kết cuối cùng trong TOC của Ref. Hướng dẫn. github.com/eclipse/eclipse-collections/blob/master/docs/ triệt
Donald Raab

3

Kotlin , 28 19 byte

{it.toSet().size<2}

Hãy thử trực tuyến!

Lấy đầu vào là String

Bạn có thể lấy và sử dụng đầu vào làm đại diện chuỗi trong cơ sở 10 với sự không trừng phạt.

Giải trình

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

Nếu bạn không thích một thực tế phải mất một String, bạn có thể có một mà phải mất một Intcho 24 byte .

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

3

Regex (ECMAScript), 31 byte

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

Hãy thử trực tuyến!

Đưa đầu vào vào unary, như thường lệ cho các biểu thức toán học (lưu ý rằng vấn đề là không đáng kể với đầu vào thập phân: chỉ ^(.)\1*$).

Giải trình:

^(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 Rất tiếc tôi quên đặt nó vào, cảm ơn!
Grimmy


2

Neim , 1 byte

𝐐

Đơn giản chỉ cần kiểm tra rằng tất cả các yếu tố là bằng nhau.

Không có nội dung, 2 byte:

𝐮𝐥

Giải trình:

𝐮     Calculate unique digits
 𝐥    Get the length

Điều này hoạt động vì chỉ 1được coi là sự thật trong Neim, và mọi thứ khác là giả.

Ngoài ra, cho 4 byte:

𝐮𝐣μ𝕃

Giải trình:

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

Thử nó!


2

C, 38 byte

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

Đệ quy đi bộ một chuỗi. Nếu hai ký tự đầu tiên khác nhau ( *s^s[1]) thì chúng tôi chỉ thành công nếu chúng tôi ở cuối chuỗi ( !s[1]) nếu không, chúng tôi lặp lại thử nghiệm ở vị trí tiếp theo ( f(s+1)).

Chương trình kiểm tra

#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*")

nlà một String, tự nhiên.

Lưu ý rằng không cần ^...$trong regex vì nó tự động được sử dụng để khớp chính xác (chẳng hạn như matchphương thức), so với tìm trong chuỗi.

Thử nó!

Tiết kiệm

  • -5 byte: được sử dụng Stringvì "Bạn có thể lấy và sử dụng đầu vào dưới dạng một chuỗi không bị trừng phạt."
  • -10 byte: regex rõ ràng là phù hợp.

Đã sắp đăng giải pháp chính xác này, bao gồm cả lời giải thích về việc matcheskhông yêu cầu ^$vì nó phù hợp với toàn bộ Chuỗi. Vì vậy, một +1 nhất định từ tôi. ;)
Kevin Cruijssen


2

Khối , 15 byte

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

Hãy thử trực tuyến!

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

Xem nó chạy

Kết quả 1 cho sự thật và không có gì cho falsey

Rất đơn giản chỉ đọc đọc trong một ký tự đầu vào tại một thời điểm. Nó đưa nhân vật hiện tại đi từ trước đó. Nếu một kết quả khác không thì nó dừng lại ngay lập tức. Nếu không, nó tiếp tục nhập và so sánh cho đến khi EOI. Trên EOI (-1), phủ nhận và thoát


2

QBasic 4.5, 55 byte

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

Tôi đã học nó! Vòng lặp FOR kiểm tra số chữ số trong đầu vào, sau đó tạo c, một chuỗi có độ dài 1 'bằng với đầu vào. Một số sau đó là kỹ thuật số nếu nó điều chỉnh một chuỗi == 0.

Hãy thử trực tuyến! Lưu ý rằng trình thông dịch trực tuyến hơi kỳ quặc và tôi đã phải viết ra một vài tuyên bố rằng IDE QBasic dựa trên DOS sẽ tự động mở rộng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.