การทดสอบการหารขาดความอดทน


14

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

โปรแกรมของคุณควรใช้จำนวนเต็มD ≥ 2 จากนั้นจึงใส่ตัวเลขเป็นชุด ตัวเลขเหล่านี้แทนตัวเลขของจำนวนเต็มอื่นN ≥ 1 เริ่มต้นที่ตัวเลขที่สำคัญน้อยที่สุด ที่จุดแรกที่ไม่มีทั้งต้องหรือต้องไม่เป็น divisble โดยD , โปรแกรมของคุณควรเอาท์พุทคำตอบที่เหมาะสมและออก หากในตอนท้ายของการป้อนข้อมูลที่จะถึงก็ควรเอาท์พุทว่าเต็มNคือหารด้วยD

นี่คือรายการของรูปแบบการป้อนข้อมูลที่ยอมรับได้สำหรับN (แสดงความคิดเห็นหากคุณคิดว่าสิ่งที่ไม่ได้รวมควรได้รับอนุญาต):

  • อินพุตมาตรฐาน : มีการกำหนดตัวเลขในแต่ละบรรทัด จุดสิ้นสุดของอินพุตคือ EOF หรือค่าพิเศษ exitหมายความว่าฟังก์ชันส่งคืนหรือออกจากโปรแกรม

  • อินพุตแบบอะนาล็อก : ผ่านเช่นการกดแป้นหรือปุ่มสิบปุ่มแทนแต่ละหลัก จุดสิ้นสุดของอินพุตเป็นค่าพิเศษ exitหมายความว่าฟังก์ชันส่งคืนหรือออกจากโปรแกรม

  • ฟังก์ชั่นที่มีสถานะทั่วโลก : เรียกซ้ำกับตัวเลขที่ต่อเนื่อง; จุดสิ้นสุดของอินพุตเป็นค่าพิเศษ exitหมายความว่าฟังก์ชันจะคืนค่าที่ไม่ใช่ค่า Null โปรดทราบว่าถ้าคุณใช้รัฐทั่วโลกก็จะต้องได้รับหลังจากที่ค่าจะถูกส่งกลับหรือมิฉะนั้นการตั้งค่าดังกล่าวว่าฟังก์ชั่นการทำงานของหลาย ๆ ครั้ง

  • ฟังก์ชัน Curried : ส่งคืนฟังก์ชันอื่นที่จะถูกเรียกด้วยตัวเลขถัดไปหรือค่า จุดสิ้นสุดของอินพุตเป็นค่าพิเศษหรือการเรียกใช้ฟังก์ชันโดยไม่มีอาร์กิวเมนต์ exitหมายความว่าฟังก์ชันส่งคืนคำตอบแทนที่จะเป็นฟังก์ชันอื่น

  • พรอมต์ GUI หรือสิ่งที่คล้ายกัน : แสดงซ้ำ ๆ จุดสิ้นสุดของอินพุตคือ "ยกเลิก" หรือเทียบเท่าหรือค่าพิเศษ exitหมายความว่าการแจ้งเตือนให้หยุดปรากฏ

  • ฟังก์ชั่น Iterator : input เป็นวัตถุหรือฟังก์ชั่น stateful ที่ส่งกลับตัวเลขถัดไปเมื่อเรียกว่า จุดสิ้นสุดของอินพุตเป็นข้อยกเว้นหรือค่าพิเศษ; exitหมายความว่าตัววนซ้ำหยุดการเรียก

ป้อนสำหรับDและการส่งออกที่สามารถผ่านวิธีการมาตรฐานที่ยอมรับได้

กรณีทดสอบ:

2;   6               => true
5;   6               => false
20;  0 3             => false
20;  0 4             => true
100; 1               => false
100; 0 0             => true
100; 0 2             => false
4;   2 4             => false
4;   2 5             => true
4;   2 [eof]         => false
4;   4 [eof]         => true
625; 5 5             => false
625; 5 7 2           => false
625; 5 7 3 6         => false
625; 5 7 3 4         => true
7;   9 3 4 [eof]     => false
7;   9 3 4 5 [eof]   => true
140; 0 3             => false
140; 0 4 5 [eof]     => false
140; 0 4 5 1 [eof]   => true
14;  4 5 1 4 [eof]   => false
14;  4 5 1 4 1 [eof] => true

ฉันคิดว่าเราควรสมมติว่าจะได้รับหนึ่งหลักทุกครั้งที่โซลูชันของเราขอข้อมูลใช่ไหม และควรเป็นโปรแกรมเต็มรูปแบบเนื่องจากเป็นวิธีที่มีวัตถุประสงค์เพื่อให้แน่ใจว่าอินพุตได้รับตัวเลขเป็นหลักไม่ใช่หรือไม่ (ความท้าทายบอกว่า "โปรแกรมหรือฟังก์ชั่น", อืม ... )
Erik the Outgolfer

1
@EriktheOutgolfer รูปแบบการป้อนข้อมูลมีการอธิบายรายละเอียดในรายการหัวข้อย่อยในคำถาม
Doorknob

1
ฉันแค่คิดถึงว่ารูปแบบเหล่านั้นจะมีวัตถุประสงค์ได้อย่างไร ... ฉันคิดว่าฉันจะเลิก nitpicking และเริ่มแก้ไขสิ่งนี้จริงๆ :-)
Erik the Outgolfer

1
มีอะไรผิดปกติหรือไม่ที่ต้องจดรายการเป็นdigitsอินพุตด้วยค่าพิเศษสำหรับ EOF
Jonathan Allan

1
@EriktheOutgolfer ไม่ได้หากมีค่า EOF ยกเว้นว่าฉันเข้าใจผิดบางอย่าง ตัวอย่างเช่นสมมติว่าค่าทั้งหมดคือ 132 และหารที่มีศักยภาพคือ 4 แล้ว[]และ[2]ผลตอบแทนอื่นใดนอกเหนือfalseหรือtrue(รวมถึงฟังก์ชั่นของตัวเอง ฯลฯ ... ) ในขณะที่[2,3], [2,3,1]และผลตอบแทน[2,3,1,EOF] trueมันทำให้ฉันใกล้เคียงกับตัวเลือกสถานะทั่วโลก
Jonathan Allan

คำตอบ:


9

JavaScript (ES6), 70 ไบต์

รูปแบบอินพุต: ฟังก์ชั่น Curried

-101

p=>(q='',g=(d,t=k=z=!~d||(q=d+q,p))=>k--?g(d,t-=(k+q)%p<1):t?t-z&&g:1)

ลองออนไลน์!

อย่างไร?

พีQn0k<พี

(1)k×10n+Q(พอควรพี)

xพีม.10k<พีx=ม.พี+k

x×10n+Q(พอควรพี)=(ม.พี+k)×10n+Q(พอควรพี)=(ม.พี×10n(พอควรพี))+(k×10n+Q(พอควรพี))(พอควรพี)=0+(k×10n+Q(พอควรพี))(พอควรพี)=k×10n+Q(พอควรพี)

ดังนั้นถ้ามีค่าเท่ากับทั้งหมดก็ยังจะเท่ากับสำหรับการใด ๆและคำตอบคือจริง(1)00k<พี0kพี

(1)00k<พี

(1)Q

แสดงความคิดเห็น

p => (                       // p = divisor
  q = '',                    // q = dividend stored as a string, initially empty
  g = (                      // g() = curried function taking:
    d,                       //   d = next digit
    t =                      //   t = number of iterations yielding a non-zero value
    k =                      //   k = total number of iterations to process
    z =                      //   z = copy of k
      !~d ||                 //   if d == -1 (meaning EOF), use only 1 iteration
                             //   so that we simply test the current value of q
      (q = d + q, p)         //   otherwise, prepend d to q and use p iterations
  ) =>                       //
    k-- ?                    //   decrement k; if it was not equal to zero:
      g(                     //     do a recursive call to g():
        d,                   //       pass the current value of d (will be ignored anyway)
        t -= (k + q) % p < 1 //       test (k + q) % p and update t accordingly
      )                      //     end of recursive call
    :                        //   else:
      t ?                    //     if t is greater than 0:
        t - z && g           //       return 0 if t == z, or g otherwise
      :                      //     else:
        1                    //       return 1
)                            //

2

แบตช์177 169 ไบต์

@set n=
@set g=1
:l
@set/ps=
@if %s%==- goto g
@set n=%s%%n%
@set/ae=%1/g,g*=2-e%%2,g*=1+4*!(e%%5),r=n%%g
@if %g% neq %1 if %r%==0 goto l
:g
@cmd/cset/a!(n%%%1)

ใช้dเป็นพารามิเตอร์บรรทัดคำสั่งและอ่านตัวเลขของnบนบรรทัดที่แยกจากกันด้วย-เครื่องหมาย EOF เอาท์พุท1สำหรับการหาร0ถ้าไม่ คำอธิบาย:

@set n=

เริ่มต้นnกับสตริงว่าง

@set g=1

g คือ gcd(d, 10**len(n))

:l

เริ่มต้นการอ่านตัวเลขแบบวนซ้ำ

@set/ps=

อ่านตัวเลขถัดไป

@if %s%==- goto g

หยุดการประมวลผลที่ EOF

@set n=%s%%n%

nย่อหน้าหลักถัดไป

@set/ae=%1/g,g*=2-e%%2,g*=1+4*!(e%%5),r=n%%g

การปรับปรุงgในขณะนี้ว่ามีการเพิ่มขึ้นและการคำนวณlen(n)n%g

@if %g% neq %1 if %r%==0 goto l

ถ้าrไม่ใช่ศูนย์แล้วdแน่นอนไม่หารnเพราะgปัจจัยdไม่ ถ้าrเป็นศูนย์เรารู้เพียงว่าdหารnถ้าgเท่ากับdดังนั้นถ้าไม่ใช่ให้วนรอบต่อไป

:g

แยกออกจากวงการอ่านหลักที่นี่ใน EOF

@cmd/cset/a!(n%%%1)

คำนวณและส่งออกผลลัพธ์โดยปริยาย

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