หมายเลขนี้เป็น repdigit หรือไม่


33

ท้าทาย

repdigitเป็นจำนวนเต็มไม่ใช่เชิงลบที่มีตัวเลขเท่ากันทั้งหมด

สร้างฟังก์ชั่นหรือโปรแกรมที่สมบูรณ์ที่ใช้จำนวนเต็มเดียวเป็นอินพุทและเอาท์พุทค่าความจริงถ้าหมายเลขอินพุทเป็น repdigit ในฐาน 10 และค่าเท็จ

อินพุตรับประกันว่าจะเป็นจำนวนเต็มบวก

คุณอาจใช้และใช้อินพุตเป็นตัวแทนสตริงในฐาน 10 ด้วยการยกเว้นโทษ

กรณีทดสอบ

เหล่านี้คือ repdigits ต่ำกว่า 1,000 ทั้งหมด

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

รายการที่มีขนาดใหญ่สามารถพบได้ใน OEIS

การชนะ

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ ไม่ได้หมายความว่าคำตอบที่ฉลาดในภาษา verbose จะไม่ได้รับการต้อนรับ


2
ที่เกี่ยวข้อง
Leun Nun

@ AidanFierce จำนวนที่ยิ่งใหญ่ที่สุดที่จะป้อนเข้าคืออะไร?
stevefestl

คำตอบ:


21

Brachylogขนาด 1 ไบต์

=

ลองออนไลน์!

สิ่งนี้ทำหน้าที่เป็นจำนวนเต็ม

จาก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]).

ฉันตัดสินใจที่จะยอมรับสิ่งนี้เพราะมันเป็น 1 ไบต์ที่เร็วที่สุด
Aidan F. Pierce

19

C (gcc) , 33 30 29 ไบต์

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

ลองออนไลน์!


เคล็ดลับที่ดีมากกับการเรียกซ้ำและการมอบหมายแทนreturn(คิดว่าฉันจะขโมยคำตอบของฉัน :))
Doorknob

@ Doorknob ไปข้างหน้า :) คุณจะต้องระบุคอมไพเลอร์ ฉันคาดหวังว่านี่น่าจะเป็น gcc / tcc เท่านั้น
Dennis

คุณทราบล่วงหน้าหรือไม่ว่า gcc ด้วย-O0จะเขียนผลลัพธ์สุดท้ายไปยังnจากทั้งหมดeaxเพื่อให้เป็นค่าตอบแทน คุณช่วยอธิบายเหตุผลที่ว่าทำไมมันถึงใช้ได้ดี?
Ruslan

@ รุสลันฉันไม่แน่ใจว่าทำไม gcc ทำงานแบบนี้ แต่การมอบหมายตัวแปรสุดท้ายในฟังก์ชั่นนี้ทำให้เกิด eax บ่อยกว่าไม่ ถ้าฉันต้องเดาฉันจะบอกว่ามันเป็นเพราะมันช่วยให้return nเป็นแบบ nop และไม่มีเหตุผลที่จะกำหนดให้กับตัวแปรโลคัลในตอนท้ายของฟังก์ชั่นถ้าคุณจะไม่ส่งคืนผลลัพธ์
Dennis

9

COBOL , 139 BYTES

ฉันรู้สึกเหมือนภาษาโคบอลไม่ได้รับความรักในการเล่นกอล์ฟรหัส (อาจเป็นเพราะไม่มีทางชนะ) แต่ที่นี่ไป:

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 หมายถึง PIC 9 (4)


2
คุณสามารถกอล์ฟนี้โดยการเปลี่ยนTRUEและFALSE1 และ 0 ตามลำดับ
Caird coinheringaahing


6

Python 3, 25, 24 19 ไบต์

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

A stdin => ตัวแปรรหัสข้อผิดพลาด

ส่งคืนรหัสข้อผิดพลาด 0 หากเป็น repdigit - หรือมีข้อผิดพลาดเกี่ยวกับความล้มเหลว

ขอบคุณเดนนิสที่ช่วยฉันในความคิดเห็น


ตั้งแต่รหัสออก0บ่งชี้ความสำเร็จผมคิดว่าคุณควรทดสอบมากกว่า>1 <2การเพิ่มข้อผิดพลาดจริงจะสั้นกว่าการใช้exitbtw
Dennis

ฉันสงสัยเกี่ยวกับเรื่องนั้น ความท้าทายกล่าวว่า "คุณค่าที่แท้จริง" ฉันจะเปลี่ยนเพื่อเพิ่มข้อผิดพลาด
Shadow

1
ใช่if python3 repdigit.py; then echo truthy; else echo falsy; fiต้องทำงานตามคำจำกัดความดังนั้น 0เป็นความจริงและทุกอย่างอื่นเป็นเท็จ
Dennis

นั่นทำให้รู้สึก ตกลงฉันจะทำการเปลี่ยนแปลงเช่นกัน
เงา

2
@ Arc676 Unary เลิก*ทำการซ้ำได้ ยกตัวอย่างเช่นการสร้างชุด{*'123'}{'1','2','3'}
Dennis

6

Mathematica ขนาด 27 ไบต์

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

มันไม่ได้ชนะEqual@@IntegerDigits@#&แต่มันก็ชนะการแก้ปัญหาทางคณิตศาสตร์ที่ใช้เลขคณิตอื่น ๆ

Repdigits อยู่ในรูปแบบn = d (10 m -1) / 9โดยmคือจำนวนหลักและdคือตัวเลขซ้ำ เราสามารถกู้คืนdจากnโดยใช้มันโมดูโล 10 (เพราะถ้ามันเป็นตัวแทนหลักมันหลักสุดท้ายจะเป็นd ) ดังนั้นเราสามารถจัดเรียงใหม่นี้เป็นm = log 10 (9 n / (n% 10) + 1)และตรวจสอบว่าmเป็นจำนวนเต็มหรือไม่


5

Haskellขนาด 15 ไบต์

all=<<(==).head

ลองออนไลน์! รับอินพุตสตริง

\s->all(==head s)sเทียบเท่า เต้นทางเลือกอื่น ๆ อย่างหวุดหวิด:

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)เป็นความคิดที่น่าสนใจมากฉันไม่เคยตระหนักถึงพฤติกรรมนี้<*มาก่อน
Laikoni

5

C (gcc), 41 ไบต์

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

นี่คือฟังก์ชันที่รับอินพุตเป็นสตริงและส่งคืน1หากเป็น repdigit และเป็น0อย่างอื่น

มันทำได้โดยการใช้ strspnฟังก์ชั่นซึ่งใช้เวลาสองสายและส่งกลับความยาวของคำนำหน้ายาวที่สุดของสตริงแรกประกอบด้วยตัวอักษรเท่านั้นจากสตริงที่สอง ในที่นี้สตริงแรกคืออินพุตและสตริงที่สองคือตัวเลขสุดท้ายของอินพุตที่ได้รับโดยการส่งตัวชี้ไปยังอักขระตัวสุดท้ายของสตริงอินพุต

iff การป้อนข้อมูลที่เป็น repdigit แล้วผลของการโทรเพื่อจะstrspn strlen(s)จากนั้นการจัดทำดัชนีsจะส่งคืนค่าว่างหากเป็นกรณีนี้ ( str[strlen(str)]เสมอ\0) หรือตัวเลขตัวแรกที่ไม่ตรงกับหลักสุดท้าย ลบล้างสิ่งนี้ด้วย!ผลลัพธ์ว่าsแสดงถึง repdigit

ลองออนไลน์!

ขอบคุณ @Dennis ที่เตือนฉันเกี่ยวกับกลอุบายที่มอบหมายแทนที่แทนที่จะกลับมาโดยอ้อมผ่านคำตอบที่น่าประทับใจของเขาประหยัดกว่า 4 ไบต์!


คุณสามารถย่อให้สั้นลงอีกเล็กน้อยโดยการหลีกเลี่ยงstrlenและสร้างสตริงใหม่จาก*s: c;f(char*s){c=*s;c=!s[strspn(s,&c)];}สำหรับ 37.
hvd

5

PHP, 25 28 25

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

ลบตัวอักษรทั้งหมดออกจากด้านขวาที่เท่ากับตัวแรกและพิมพ์1หากตัวอักษรทั้งหมดถูกลบ


5

R, 31 ไบต์

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

ฟังก์ชันนี้ทำงานกับอินพุตสตริงและใช้นิพจน์ทั่วไปเพื่อพิจารณาว่าอินพุตเป็น repdigit หรือไม่

ตัวอย่าง

> 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 ไบต์โดยเปลี่ยนจากฟังก์ชั่น (x) เป็นการใช้การสแกน (, '') tio.run/##K/r/P70otSBHQylOQ08zJsZQS0VJpzg5MU9DR11dU/O/paXlfwA
Sumner18

5

/// , 110 ไบต์

/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

ลองออนไลน์!

ภาษา /// ไม่มีแนวคิดของความจริงและเท็จดังนั้นผลลัพธ์นี้ "T" ถ้าอินพุตเป็น repdigit และจะไม่ส่งออกอักขระใด ๆ หากอินพุตไม่ใช่ repdigit



4

ระดับเสียงคู่ 11 ไบต์

@(s)s==s(1)

ลองออนไลน์!

รับอินพุตเป็นสตริง

มันจะตรวจสอบตัวละครทั้งหมดเพื่อความเท่าเทียมกันกับตัวละครตัวแรก หากทั้งหมดเท่ากันผลลัพธ์จะเป็นเวกเตอร์ที่มีเฉพาะ1(เป็นจริงในระดับแปดเสียง) มิฉะนั้นจะมีอย่างน้อยหนึ่ง0(เป็นเท็จในระดับแปดเสียง) นี่เป็นหลักฐาน


คุณไม่จำเป็นต้องปิดมันall(...)เพื่อให้ได้ผลลัพธ์ตามจริง / เท็จ
Tom Carpenter

คุณทดสอบหลักฐานแล้วหรือยัง? นั่นคือส่วนของรหัสคือคำจำกัดความ (meta consensus) ของจริง / เท็จใน ppcg
Stewie Griffin


4

C #, 42 33 28 ไบต์

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

i จะต้องมีสตริง

ขอบคุณมากกับ @LethalCoder


2
i[0].ToString()สามารถลงไปi[0]+"", จะสั้นกว่า<1 ==0
TheLethalCoder

1
นอกจากนี้ยัง.Length<1สามารถเป็น==""
TheLethalCoder

3

Braingolfขนาด 6 ไบต์

iul1-n

ลองออนไลน์!

น่าเสียดายที่ Braingolf ของอินพุตจาก implline commandline args ไม่สามารถรับอินพุตทุกหลักเป็นสตริงมันจะส่งไปที่ตัวเลขเสมอดังนั้นวิธีแก้ปัญหาคือการส่งผ่าน STDIN ซึ่งเพิ่ม 1 ไบต์สำหรับการอ่าน STDIN ( i)

คำอธิบาย:

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

หลังจากที่uความยาวของสแต็คเท่ากับจำนวนตัวอักษรที่ไม่ซ้ำกันในการป้อนข้อมูลลบ 1 หมายถึงมันจะเป็น0ถ้าหากมีตรง 1 ตัวละครที่ไม่ซ้ำกันในการป้อนข้อมูลที่0เป็นเพียงจำนวน falsey ในหลามดังนั้นnจะแทนที่0ด้วย1, 0และทุกอย่างอื่นด้วย



3

JavaScript (ES6), 23 21 ไบต์

บันทึก 2 ไบต์ต้องขอบคุณ Neil

รับอินพุตเป็นจำนวนเต็มหรือสตริง ส่งคืนบูลีน

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

การสาธิต


ไม่ได้ใช้testแทนการ!!execบันทึก 2 ไบต์ใช่ไหม
Neil

(แม้ว่าสำหรับการป้อนข้อมูลสตริงเท่านั้น porting คำตอบ PHP คือแม้สั้น.)
นีล

@ ไม่มีฉันไม่รู้ว่าฉันคิดอะไรอยู่ ขอบคุณ!
Arnauld

3

โอห์ม 4 ไบต์

Ul2<

ลองออนไลน์!

คำอธิบาย

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

ฉันคิดว่าUl≤ควรจะทำงาน
Christoph

@Christoph Yee ฉันมี แต่ฉันไม่แน่ใจว่า 0 ถือเป็นค่าความจริง (ค่อนข้างใหม่สำหรับสิ่ง codegolf นี้ ^^)
Datboi

Ah damn 0เป็นคนโกหกและตัวเลขอื่น ๆ ทุกคนเป็นความจริง ฉันเพิ่งสังเกตเห็นว่าเราต้องการสิ่งที่ตรงกันข้ามสำหรับความท้าทายนี้ (บ่อยครั้งที่เราได้รับอนุญาตให้เปลี่ยนตราบใดที่เราประกาศว่ากรณีใดเป็นความจริงและเป็นเท็จ) ความจริงถูกกำหนดโดย "จะใช้เวลาที่สดใส"
Christoph

Ul1Eควรทำงาน (แม้ว่าฉันไม่ทราบ Ohm) เพราะมันไม่จำเป็นต้องจัดการกับ 0
ผลไม้ที่แยกแยะ

3

APL, 5 ไบต์

บันทึก 2 ไบต์ด้วย @KritixiLithos

⍕≡1⌽⍕

ลองออนไลน์!


คุณสามารถกอล์ฟทางออกที่ 7 ไบต์ 5 ⊢≡1⌽⊢ไบต์โดยใช้รถไฟ
Kritixi Lithos

@KritixiLithos ขอบคุณ!
Uriel

แทนที่ด้วยเพื่อจัดการทั้งสตริงและตัวเลข
อดัม

@ Adámขอบคุณ! ฉันไม่คิดว่าการจัดรูปแบบเป็นวิธีรับจำนวนอาร์เรย์
Uriel

3

Java, 21 ไบต์:

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

lเป็นMutableList<Character>คอลเลกชันจาก eclipse


1
lอาจเป็น CharAdapter
Donald Raab

@DonaldRaab oooh ฉันไม่เคยเห็นชั้นเรียนนั้นเลย ยินดีที่ได้พบ
Nathan Merrill

มี CodePointAdapter และ CodePointList เช่นกัน
Donald Raab

1
@DonaldRaab ฉันใช้คอลเลกชัน eclipse ไม่น้อย แต่ฉันมักจะพยายามหาอะไรนอกเหนือจากคอลเลกชันรายการ / แผนที่ / ชุดมาตรฐาน ความรู้ของคุณอยู่บนพื้นฐานของการพัฒนาห้องสมุดหรือมีที่ไหนสักแห่ง (นอกเหนือจาก javadoc) ฉันสามารถหาข้อมูลอ้างอิงที่ดีกว่าสำหรับทุกสิ่งที่ EC จัดเตรียมไว้ให้หรือไม่?
Nathan Merrill

ดีใจที่ได้ยิน ฉันเป็นคอมมิชชันสำหรับเฟรมเวิร์ก ... ฉันเขียนคลาสที่เกี่ยวข้องกับสตริงโดยเฉพาะเหล่านี้เมื่อประมาณปี มีคู่มืออ้างอิงที่คนจำนวนมากไม่รู้ มีแผนที่ความคิดที่ฉันเพิ่งรวมตัวกันเพื่อช่วยให้ผู้คนเรียนรู้และนำทางผ่านคุณสมบัติมากมายในห้องสมุด มันคือลิงค์สุดท้ายใน TOC ของการอ้างอิง คู่มือ github.com/eclipse/eclipse-collections/blob/master/docs/…
Donald Raab

3

Kotlin , 28 19 ไบต์

{it.toSet().size<2}

ลองออนไลน์!

ใช้อินพุตเป็นStringเพราะ

คุณอาจใช้และใช้อินพุตเป็นตัวแทนสตริงในฐาน 10 ด้วยการยกเว้นโทษ

คำอธิบาย

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

ถ้าคุณไม่ชอบความจริงที่จะใช้เวลาStringที่คุณสามารถมีหนึ่งที่ใช้เวลาIntสำหรับ24 ไบต์

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

3

Regex (ECMAScript), 31 ไบต์

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

ลองออนไลน์!

ใช้อินพุตเป็น unary ตามปกติสำหรับคณิตศาสตร์ regexes (โปรดทราบว่าปัญหาเล็กน้อยกับอินพุตทศนิยม: เพียง^(.)\1*$)

คำอธิบาย:

^(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

2

PHP, 30 ไบต์

<?=($a=$argn).$a[0]==$a[0].$a;

@ ดาดาไม่ไม่มันจะเปรียบเทียบ 4344 และ 4434
63956

โอ้ใช่ฉันไม่ดี ขอบคุณ
Dada

2

Neim 1 ไบต์

𝐐

เพียงตรวจสอบว่าองค์ประกอบทั้งหมดเท่ากัน

ไม่มีตัวใน 2 ไบต์:

𝐮𝐥

คำอธิบาย:

𝐮     Calculate unique digits
 𝐥    Get the length

งานนี้เพราะ1ถือว่าเป็นความจริงใน Neim เท่านั้นและทุกอย่างอื่นเป็นเท็จ

อีกทางเลือกหนึ่งสำหรับ 4 ไบต์:

𝐮𝐣μ𝕃

คำอธิบาย:

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

ลองมัน!


2

C, 38 ไบต์

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

เดินสตริงซ้ำ ๆ หากตัวละครสองตัวแรกแตกต่างกัน ( *s^s[1]) แล้วเราจะประสบความสำเร็จก็ต่อเมื่อเราอยู่ที่จุดสิ้นสุดของสตริง ( !s[1]) มิฉะนั้นเราจะทำซ้ำการทดสอบในตำแหน่งต่อไป (f(s+1) )

โปรแกรมทดสอบ

#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 ไบต์

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

nเป็นStringธรรมชาติ

โปรดทราบว่าไม่จำเป็นต้องมี^...$ใน regex เพราะมันถูกใช้โดยอัตโนมัติสำหรับการจับคู่ที่แน่นอน (เช่นmatchวิธีการ) เมื่อเทียบกับการค้นหาในสตริง

ลองมัน!

ประหยัด

  • -5 ไบต์: ใช้Stringตั้งแต่ "คุณอาจใช้และใช้อินพุตเป็นสตริงที่ไม่ต้องรับโทษ"
  • -10 ไบต์: regex เป็นแบบที่ดี

กำลังจะโพสต์โซลูชันที่แน่นอนนี้รวมถึงคำอธิบายเกี่ยวกับการmatchesไม่ต้องการ^$เพราะมันตรงกับสตริงทั้งหมด +1 ที่แน่นอนจากฉัน ;)
Kevin Cruijssen

2

R, 25 ไบต์

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

ลองออนไลน์

ทางออกที่ไม่ใช่ regex ที่ดีที่สุดที่ฉันสามารถหาได้คือ 36 ไบต์:

is.na(unique(el(strsplit(x,"")))[2])

1
สำหรับตัวเลือกอื่นใน non-regexrle(charToRaw(scan(,'')))$v[2]<1
MickyT

2

Cubix , 15 ไบต์

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

ลองออนไลน์!

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

ดูมันวิ่ง

เอาต์พุต 1 สำหรับความจริงและไม่มีอะไรผิดพลาด

อ่านอย่างง่ายมากอ่านในการป้อนข้อมูลหนึ่งตัวอักษรในเวลา ใช้อักขระปัจจุบันห่างจากก่อนหน้า หากผลลัพธ์ที่ไม่ใช่ศูนย์จะหยุดทันที มิฉะนั้นจะยังคงทำการป้อนข้อมูลและเปรียบเทียบจนกว่า EOI ใน EOI (-1) ปฏิเสธและออก


2

QBasic 4.5, 55 ไบต์

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

ฉันคิดว่ามัน! FOR-loop ตรวจสอบจำนวนของตัวเลขในอินพุตจากนั้นสร้างcซึ่งเป็นชุดที่มีความยาวเท่ากับ 1 ของอินพุต จำนวนนั้นคือ repdigit ถ้ามัน modulo one-string == 0

ลองออนไลน์! โปรดทราบว่าล่ามออนไลน์นั้นค่อนข้างแปลกและฉันต้องเขียนข้อความสองสามข้อความที่ใช้ QBasic IDE ใน DOS จะขยายโดยอัตโนมัติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.