หมายเลขบันได


29

จำนวนบันไดเป็นจำนวนเต็มบวกxเช่นว่าnหลัก TH (หนึ่งในการจัดทำดัชนีเริ่มต้นด้วยหลักสำคัญน้อยที่สุด) มีค่าเท่ากับx% (n + 1) นั่นเป็นคำพูดเล็กน้อยดังนั้นลองมาดูตัวอย่าง ใช้7211311ถ้าเราหามอดูลาร์ตกค้างที่7211311ในช่วง 2-8 เราจะได้สิ่งต่อไปนี้:

7211311 % 2 = 1
7211311 % 3 = 1
7211311 % 4 = 3
7211311 % 5 = 1
7211311 % 6 = 1
7211311 % 7 = 2
7211311 % 8 = 7

ตัวเลขเหล่านี้คือ7211311 ! ดังนั้น7211311คือหมายเลขบันได

งาน

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

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

กรณีทดสอบ

นี่คือหมายเลขบันได 13 หมายเลขแรก:

1, 10, 20, 1101, 1121, 11311, 31101, 40210, 340210, 4620020, 5431101, 7211311, 12040210

ไม่ใช่0หมายเลขบันไดใช่ไหม คำตอบมากมายคิดเช่นนั้น
Okx

3
@Okx ภารกิจนี้เพียงเพื่อแยกความแตกต่างของหมายเลขบันไดบวกจากตัวเลขที่ไม่ใช่เชิงบวกดังนั้นพฤติกรรมจึงไม่ได้ถูกกำหนดสำหรับ 0 และจำนวนลบ
Paŭlo Ebermann

คำตอบ:


10

Haskell, 55 57ไบต์

f m|let n#x=n==0||n`mod`10==m`mod`x&&div n 10#(x+1)=m#2

แนวทางที่แตกต่างจากโซลูชัน Haskell อื่น ๆ

ขอบคุณ xnor สำหรับการบันทึก 2 ไบต์


4
คุณสามารถใช้เคล็ดลับนี้เพื่อย่นletนิพจน์ให้สั้นลง
xnor

วิธีที่แตกต่างและสั้นกว่า ทำได้ดี! +1
qfwfq


7

Javascript, 42 41 39 38 ไบต์

-4 ไบต์ต้องขอบคุณ @Shaggy และ @ETHProductions

s=>[...s].some(d=>s%i++^d,i=~s.length)

ซึ่งจะใช้ตัวเลขเป็นสตริงและส่งคืนfalseหากหมายเลขนั้นเป็นหมายเลขบันไดและtrueอื่น ๆ

ตัวอย่างข้อมูลโค้ด:

f=
s=>[...s].some(d=>s%i++^d,i=~s.length)

function update() {
  o.innerText = f(document.getElementById("i").value)
}
<input id="i" type="number">
<button onclick="update()">Test</button>
<p id="o">


2
คุณควรจะทิ้งสิ่ง!ที่ท้าทายไม่ได้ระบุอย่างชัดเจนว่าคุณจะต้องกลับมาtrueเป็นจริงและfalseเป็นเท็จเพียงแค่คุณต้องคืนค่า 2 ค่าที่แตกต่างกัน
Shaggy

2
นี่เป็นกอล์ฟที่ดีมากทำได้ดีมาก ฉันคิดว่าคุณน่าจะบีบออกได้อีกสองไบต์ถ้าคุณคำนวณiตัวเอง:s=>[...s].some(d=>s%i--^d,i=s.length+1)
ETHproductions

2
ที่จริงแล้วโดยการใช้ประโยชน์จากความจริงที่ว่า~x == -(x+1)ในจำนวนเต็มและx%-y == x%yฉันคิดว่าคุณจะได้รับอีกหนึ่ง:s=>[...s].some(d=>s%i++^d,i=~s.length)
ETHproductions

6

05AB1E , 6 ไบต์

รหัส:

ā>%JRQ

ใช้การเข้ารหัส05AB1E ลองออนไลน์!

คำอธิบาย:

ā        # Get the range [1 .. len(input)]
 >       # Increment by 1
  %      # Vectorized modulo
   J     # Join the array into a single number
    RQ   # Reverse that number and check if it's equal to the original input




5

Japt , 9 7 ไบต์

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

¥£%´JÃw

ทดสอบมัน

  • บันทึก 2 ไบต์ด้วยความช่วยเหลือจาก ETHproductions

คำอธิบาย

เราใช้สตริงเป็นอินพุตโดยปริยาย

£   Ã

แม็พอักขระแต่ละตัวในสตริง

´J

Jเป็นค่าคงที่ Japt สำหรับ-1และ´ลดลงทีละ 1 ในแต่ละรอบ ( --ใน JavaScript) -2ดังนั้นในครั้งแรกผ่านนี้จะช่วยให้เรา

%

เราใช้ค่านั้นเพื่อดำเนินการโมดูโลบนสตริงอินพุตซึ่งจะแปลงเป็นจำนวนเต็มโดยอัตโนมัติในกระบวนการ ใน JavaScript ให้ผลเช่นเดียวกับx%-yx%y

w

ย้อนกลับสตริงผลลัพธ์

¥

ตรวจสอบว่าสตริงใหม่เท่ากับอินพุตต้นฉบับและส่งผลลัพธ์ผลลัพธ์โดยปริยายเป็นบูลีนโดยปริยาย


เอ้(Y+2ยฉันรู้สึกว่าอาจจะสั้นกว่าอย่างน้อย 1 ไบต์ ...
ETHproductions

1
... และมันสามารถ: ¥£%´JÃw:-) (ทำงานได้x%y == x%-yใน JS)
ETHproductions

อ๊ะใช่กำลังลองสิ่งที่แตกต่างกันสองสามอย่างเพื่อให้ได้การคำนวณนั้นลดลงเหลือ 2 ไบต์
Shaggy

4

Neim , 6 ไบต์

𝐧ᛖ𝕄𝐫𝐣𝔼

คำอธิบาย:

𝐧         Get the length of the input, then create an exclusive range
 ᛖ        Add 2 to each element
  𝕄       Modulus
    𝐫      Reverse
     𝐣     Join
      𝔼   Check for equality

ลองออนไลน์!


@Thehx เกี่ยวกับการแก้ไขของคุณ Neim ใช้การเข้ารหัสที่กำหนดเอง: อันนี้
Okx



2

Perl 6 , 32 ไบต์

{$_ eq[~] $_ «%«(1+.comb...2)}

ลองออนไลน์!

  • .combคือจำนวนอักขระในการแสดงสตริงของอาร์กิวเมนต์อินพุต$_(นั่นคือจำนวนหลัก)
  • 1 + .comb ... 2 คือลำดับของตัวเลขจากตัวเลขที่มากกว่าหนึ่งถึง 2
  • «%«เป็น hyperoperator โมดูลัสที่ให้เหลือเมื่อโต้แย้งการป้อนข้อมูลทางด้านซ้ายของตนโดยแบ่งเป็นแต่ละองค์ประกอบของลำดับทางด้านขวาของตน:$_$_ % 2, $_ % 3, ...
  • [~]eqเชื่อมตัวเลขเหล่านั้นเป็นจำนวนใหม่ซึ่งเมื่อเทียบกับการโต้แย้งการป้อนข้อมูลที่ใช้ประกอบการสตริงเสมอภาค


2

Pyth , 13 ไบต์

-1 ไบต์ขอบคุณที่Okx

qsjk_m%QhdSl`

ลองออนไลน์!

คำอธิบาย

             QQ    # Implicit input
          Sl`Q     # Generate [1, len(str(Q))]
     m%Qhd         # For digit d in above range, perform Q % (d + 1)
 sjk_              # Reverse, then convert to number
q             Q    # Test equality with input

ทางเลือกอื่นยังคง 13 ไบต์ (ขอบคุณkarlkastor )

qi_.e%Q+2k`QT

ลองออนไลน์! นั่นเป็นหลักเหมือนกับโซลูชั่นแรกยกเว้นว่ามันใช้iในการแปลงจากอาร์เรย์ของตัวเลขเป็นตัวเลขและช่วงนั้นถูกสร้างขึ้นแตกต่างกัน


1
คุณสามารถแทนที่ss`M_ด้วยjk_เพื่อบันทึก 2 ไบต์
Okx

@Okx ฉันต้องการเพราะjเอาท์พุทสตริงในขณะที่ฉันต้องการตัวเลขเพื่อเปรียบเทียบกับอินพุต (ซึ่งเป็นตัวเลข)
Jim

1
วิธีแก้ปัญหาอีก 13 ไบต์คือqi_.e%Q+2k`QTใช้การแจกแจงแผนที่ ( .e) แทนแผนที่ และแปลงส่วนที่เหลือเป็นฐาน 10 int จากรายการแทนที่จะใช้การเข้าร่วม
KarlKastor

2

C ++, 104 ไบต์

1) เวอร์ชันดั้งเดิม:

int main(){int N,T,R=1;cin>>N;T=N;for(int i=1;i<=log10(N)+1;i++){if(N%(i+1)!=T%10){R=0;}T/=10;}cout<<R;}

2) ในรูปแบบที่อ่านได้:

int main()
{
    int N, T, R = 1;

    cin >> N;
    T = N;

    for (int i = 1; i <= log10(N) + 1; i++)
    {
        if (N % (i + 1) != T % 10)
        {
            R = 0;
        }

        T /= 10;
    }

    cout << R;
}

ลองออนไลน์!



1

Python 2 , 66 60 58 57 ไบต์

  • ขอบคุณ @Leaky แม่ชีขนาด 6 ไบต์: ลบที่ไม่จำเป็นออกx and( ไม่ควรตรวจสอบ 0)
  • ขอบคุณ @Einkorn Enchanter 1 ไบต์: การใช้ enumerate
lambda x:all(a==`x%(i+2)`for i,a in enumerate(`x`[::-1]))

ลองออนไลน์!



ขอขอบคุณ. และเฮ้ฉันเพิ่งรู้ว่าคุณเป็นพ่อมดข้าวสาลี .. : D
Officialaimm

1

Python 3: 63 ไบต์

lambda m:all(int(x)==m%(n+2)for n,x in enumerate(str(m)[::-1]))

หากฉันสามารถนับจำนวนครั้งที่ฉันต้องการให้ 'แจกแจง' สั้นกว่านี้ ...

ลองออนไลน์!


ใช่และฉันเพิ่งรู้ว่ามันเหมือนกับคำตอบที่ @officialaimm ให้ ... ฉันควรลบหรือไม่
bendl

พวกมันอยู่ในหลาม 2 และคุณมากับมันด้วยตัวเองดังนั้นฉันจะปล่อยมันไป
ข้าวสาลี Wizard

สามารถบันทึกสองไบต์โดยเริ่มนับของคุณที่ 2 และจัดเรียงลอจิคัลใหม่:lambda m:all(m%n==int(x)for n,x in enumerate(str(m)[::-1],2))
nocturama


1

Java 8, 156 149ไบต์

interface B{static void main(String[]s){String f="";for(int i=1;i<=s[0].length();)f=new Long(s[0])%++i+f;System.out.print(f.equals(s[0]));}}

Ungolfed:

interface B {
    static void main(String[] s) {
        String f = "";
        for (int i = 1; i <= s[0].length();)
            f = new Long(s[0]) % ++i + f;
        System.out.print(f.equals(s[0]));
    }
}

ลองออนไลน์!

UPDATE:
-7 ไบต์ : ถูกลบออกไร้ประโยชน์{}และถูกแทนที่Integer.parseInt(...)โดยnew Integer(...)
-9 ไบต์ : ขอบคุณกับเควิน Cruijssen ออกพวงของไร้ประโยชน์()ที่ใช้LongแทนIntegerและแทนprint printlnขอบคุณKévin!


1
คำตอบที่ดี +1 จากฉัน Btw บางสิ่งเล็ก ๆ ที่จะเล่นกอล์ฟ: new Integerสามารถnew Long(-3 ไบต์); printlnสามารถเป็นprint(-2 ไบต์); และคุณสามารถลบวงเล็บที่อยู่รอบ ๆnew Long(s[0])%i+f;(-4 ไบต์)
Kevin Cruijssen

ดีจริงๆ ! ขอบคุณฉันจะอัปเดตสิ่งนี้!
Alex Ferretti

1

ถ่าน , 20 15 ไบต์

⌊Eθ⁼ιI﹪Iθ⁻⁺¹Lθκ

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



0

q / kdb +, 34 ไบต์

วิธีการแก้:

{s~raze($)x mod'2+(|)(!)(#)s:($)x}

ตัวอย่าง:

q){s~raze($)x mod'2+(|)(!)(#)s:($)x}7211311 / this is a staircase number (true)
1b
q){s~raze($)x mod'2+(|)(!)(#)s:($)x}7211312 / this is not (false)
0b
q)t(&){s~raze($)x mod'2+(|)(!)(#)s:($)x}each t:1 + til 1000000 / up to a million
1 10 20 1101 1121 11311 31101 40210 340210

คำอธิบาย:

ส่งหมายเลขอินพุตไปยังสตริงนับจาก 0.. ความยาวของสตริงเพิ่ม 2 ลงในทั้งหมดย้อนกลับและป้อนแต่ละตัวเลขmodพร้อมกับอินพุตดั้งเดิม ส่งผลลัพธ์ของตัวดัดแปลงไปยังสตริงและลดรายการตรวจสอบว่าเท่ากับสตริงของหมายเลขอินพุต:

{s~raze string x mod'2 + reverse til count s:string x} / ungolfed solution
{                                                    } / lambda function
                                           s:string x  / convert input to string, save as s
                                     count             / return length of this string
                                 til                   / like python's range() function
                         reverse                       / reverses the list
                     2 +                               / adds two to each element in the list
               x mod'                                  / ' is each both, so feeds x, and each element of the list to modulo function
        string                                         / converts output list to string list ("7";"2";"1"..etc)
   raze                                                / reduce list ("721...")
 s~                                                    / is s equal to this reduced list, returns boolean

หมายเหตุ:

วิธีแก้ปัญหาส่วนใหญ่ใช้สำหรับสร้าง2,3,4..รายการฉันมีวิธีแก้ไขปัญหาที่น้อยกว่า แต่มีขนาด 37 ไบต์หลังจากเล่นกอล์ฟ:

{s~x mod'reverse 2 + til count s:("J"$) each string x} / ungolfed
{s~x mod'(|)2+til(#)s:("J"$)each($)x}                  / golfed

0

Clojure, 75 ไบต์

#(=(sort %)(sort(map(fn[i c](char(+(mod(Integer. %)(+ i 2))48)))(range)%)))

อินพุตเป็นสตริงโดยใช้mapและท้าย%ที่สุดจะสั้นกว่าfor[i(range(count %))]วิธี


0

Haskell, 62 ไบต์

f x=and$zipWith(==)(reverse$show x)$map(head.show.mod x)[2..]

แทนที่จะกลับรายการ (ไม่มีที่สิ้นสุด) ของโมดูลัสมันตัดทอนรายการด้วยการซิปด้วยการแสดงสตริงที่กลับด้านของอินทิกรัล x ซึ่งจะทำให้แน่ใจว่าเป็นองค์ประกอบที่ฉลาดเท่ากัน


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