สร้างตัวเลขที่เป็นมิตรกับ Numpad


22

แรงบันดาลใจจากการสร้างแป้นพิมพ์ตัวเลขที่เป็นมิตร

พื้นหลัง

แผ่นตัวเลขจำนวนมากมีเค้าโครงดังต่อไปนี้:

789

456

123

    0    

เรากำหนดย่านที่ใกล้เคียงของตัวเลขเป็นชุดของเซลล์ที่อยู่ติดกันแบบตั้งฉากกับจำนวนที่แสดงรวมถึงตัวมันเอง ยกตัวอย่างเช่นเขต 2 เป็นและพื้นที่ใกล้เคียงเป็น{1,5,3,0,2} 0 {1,2,0}มีรายชื่อพื้นที่ใกล้เคียงของแต่ละหมายเลขด้านล่างกรณีทดสอบด้านบน

เรากำหนดหมายเลขที่จำง่ายของ numpadเป็นจำนวนเต็มบวกโดยที่เมื่อเขียนเป็นทศนิยมโดยไม่มีเลขศูนย์นำหน้าแต่ละหลักยกเว้นตัวเลขแรกอยู่ในพื้นที่ใกล้เคียงของตัวเลขก่อนหน้า

ตัวอย่างเช่น,

  • 7856 เป็นหมายเลขที่เหมาะสำหรับเพื่อนเพราะ 8 อยู่ในพื้นที่ใกล้เคียง 7, 5 อยู่ในเพื่อนบ้าน 8 และ 6 อยู่ในพื้นที่ใกล้เคียง 5
  • 1201 เป็นตัวเลขที่เป็นมิตรกับตัวเลขเนื่องจาก 2 อยู่ในพื้นที่ใกล้เคียง 1, 0 อยู่ในพื้นที่ใกล้เคียง 2 และ 1 อยู่ในพื้นที่ใกล้เคียง 0
  • 82 ไม่ใช่หมายเลขที่เหมาะสำหรับเพื่อนเพราะ 2 ไม่ได้อยู่ในละแวกที่ 8
  • 802 ไม่ใช่ตัวเลขที่เป็นมิตรของตัวเลขเนื่องจาก 0 ไม่อยู่ในพื้นที่ใกล้เคียงที่ 8 (ละแวกใกล้เคียงไม่ได้ล้อมรอบ)

ที่เกี่ยวข้อง OEIS ลำดับ หมายเหตุว่าลำดับที่เกี่ยวข้องนี้อยู่ที่แตกต่างกันเพราะมันนับ0เป็นที่อยู่ติดกับ7แทนและ12

ท้าทาย

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

ละแวกใกล้เคียง

ละแวกใกล้เคียงของแต่ละหลักอยู่ที่นี่:

0:{0,1,2}
1:{0,1,2,4}
2:{0,1,2,3,5}
3:{2,3,6}
4:{1,4,5,7}
5:{2,4,5,6,8}
6:{3,5,6,9}
7:{4,7,8}
8:{5,7,8,9}
9:{6,8,9}

กรณีทดสอบ / ลำดับ

นี่คือ 100 คำแรก

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 20, 21, 22, 23, 25, 32, 33, 36, 41, 44, 45, 47, 52, 54, 55, 56, 58, 63, 65, 66, 69, 74, 77, 78, 85, 87, 88, 89, 96, 98, 99, 100, 101, 102, 110, 111, 112, 114, 120, 121, 122, 123, 125, 141, 144, 145, 147, 200, 201, 202, 210, 211, 212, 214, 220, 221, 222, 223, 225, 232, 233, 236, 252, 254, 255, 256, 258, 320, 321, 322, 323, 325, 332, 333, 336, 363, 365, 366, 369, 410, 411, 412, 414, 441, 444, 445, 447]

5
ผมชอบวิธีการท้าทายนี้จะพิจารณาเฉพาะจำนวนเต็มบวก (ซึ่งช่วยให้สาระสำคัญและช่วยให้ภาษาอื่น ๆ ที่จะเข้าร่วม) และช่วยให้การแสดงทั้งn -th หรือแรกnผลให้มีความยืดหยุ่น
หลุยส์ Mendo

ฉันอ่านความท้าทายทั้งหมดผิดนี่คือสคริปต์ "เป็นคำนี้ที่ถูกต้องตามลำดับ": ลองออนไลน์!
Magic Octopus Urn

คำตอบ:


9

JavaScript (ES6), 104 93 89 88 ไบต์

ส่งคืนคำศัพท์ N-th ของลำดับซึ่งจัดทำดัชนี 1 รายการ

f=(i,k,n=k,N=n/5>>1)=>(N?8530025>>(n%10*6191^N%10*6191)%26&1:!i--)?N?f(i,k,N):k:f(i,-~k)

การสาธิต


ดีที่สุดที่ฉันจะได้รับคือ 151 k=(n,a=1)=>n?k(n-([...(x=a+[]).slice(0,-1)].reduce((a,c)=>a*!!~"012 0124 01235 236 1457 24568 3569 478 5789 689".split` `[c].indexOf(x[i++]),i=1)),a+1):a-1บางทีมีอะไรช่วยฉันทดสอบอาจยาวเกินไป
Conor O'Brien

คำตอบนี้นำแนวคิดของหมายเลขมายากลมาสู่ระดับใหม่ทั้งหมด ... ฉันไม่เข้าใจเลยว่าคุณพบพวกเขาได้อย่างไร o_O
scottinet

2
@scottinet ในระดับใหญ่คำอธิบายของฉันสำหรับคำตอบนี้ใช้ได้กับสิ่งนี้เช่นกัน ความแตกต่างที่แน่นอนนั้นใช้งานไม่ได้ดีมากสำหรับฉันดังนั้นฉันจึงลองใช้ XOR แทน จากบันทึกด้านข้างฉันพบสูตรอื่นที่ใช้งานได้ 96% โดยไม่ต้องค้นหา bitmask แต่การประมวลผลส่วนที่เหลืออีก 4% นั้นแยกกันใน JS ฉันไม่ได้ลองทำเยลลี่และตอนนี้ฉันจำสูตรไม่ได้แล้ว ... ¯ \ _ (ツ) _ / ¯
Arnauld

ขอบคุณสำหรับคำอธิบาย สิ่งนี้ยังคงน่าประทับใจ :-)
กอตติเนต์


3

เยลลี่ , 27 24 ไบต์

ส่งคืน N เงื่อนไขแรกของลำดับ

D⁽ÞȦ×^2\%26“⁷wð’æ»ḂẠ
1Ç#

ลองออนไลน์!

นี่คือพอร์ตของคำตอบ JS ของฉัน

D⁽ÞȦ×^2\%26“⁷wð’æ»ḂẠ    - helper link: test numpad-friendliness of a number, e.g. 1257
D                       - get decimal digits             -> [1, 2, 5, 7]
    ×                   - multiply by ...
 ⁽ÞȦ                    - ... the integer 6191           -> [6191, 12382, 30955, 43337]
     ^2\                - bitwise XOR overlapping reduce -> [10353, 18613, 53666]
        %26             - modulo 26                      -> [5, 23, 2]
                æ»      - right-shift by each value ...
           “⁷wð’        - ... the integer 8530025        -> [266563, 1, 2132506]
                  Ḃ     - isolate the LSB                -> [1, 1, 0] which means that 1->2
                                                            and 2->5 are OK and 5->7 is not
                   Ạ    - all (0 if there's any 0)       -> 0, i.e. not numpad-friendly :'(

1Ç#                     - main link: return the [input] first matching numbers,
                          using our helper link as a monad and starting with 1

3

05AB1E , 24 23 ไบต์

µNSü‚εW_iO<ë<3BÆ}ÄR2‹}P

ลองออนไลน์!

ส่งคืนหมายเลขที่ n ตามลำดับ

คำอธิบาย:

µNSü‚εW_iO<ë<3BÆ}ÄR2‹}P    Full program
µ                          Until counter is equal to input
 N                         Push current iteration number (e.g. 1025)
  S                        Split to a list of chars (-> ['1', '0', '2', '5'])
   ü‚                      Group into pairs (-> ['1', '0'], ['0', '2'], ['2', '5'])
     ε                     For each pair
      W_                      Is smallest digit equal to 0?
        iO<                      True: sum all digits and decrement 
           ë                     False: 
            <                       - decrement all digits
             3B                     - convert to base 3
               Æ                    - reduced substraction
                }             End if
                 Ä            Absolute value
                  R           Reverse 
                   2‹         1 if result is < 2, 0 otherwise
                     }     End for each
                      P    Cumulative product (1 if all pair results are 
                                     1, 0 otherwise)
                           -- implicit counter increment if stack value is 1

แนวคิดหลักคือนอกเหนือจาก0คีย์ตัวเลขใด ๆ ที่ลดลงและแปลงเป็นฐาน 3 มีคุณสมบัติดังต่อไปนี้:

  • เพื่อนบ้านซ้ายและขวามีความแตกต่างที่แน่นอน 1
  • เพื่อนบ้านขึ้นและลงมีความแตกต่างอย่างแน่นอนที่ 10 ซึ่งตรงกันข้ามมีค่าเท่ากับ 1
  • คู่อื่น ๆ ของปุ่ม numpad ส่งผลให้มีค่าแตกต่างกันแม้ว่าจะย้อนกลับ

แน่นอนว่าเราต้องมีifคำสั่งเพื่อจัดการ0คีย์ numpad


คำตอบที่ชัดเจนมาเพื่อนำเสนอการปรับปรุงเพิ่มเติมไม่สามารถหาได้ Oooo ... และนั่นทำให้คุณเป็นผู้นำด้วย :)
Magic Octopus Urn

ฉันไม่คิดว่าฉันจะสามารถทำตามกฎทั้งสามนี้ได้เลยน่าประทับใจมาก อะไรทำให้คุณมีความคิด
Magic Octopus Urn

2

MATL , 29 27 ไบต์

`@J3:qEt!J*+hYAd|2>~A?@]NG-

ส่งออกnตัวเลขที่เป็นมิตรกับตัวเลขแรก

ลองออนไลน์!

คำอธิบาย

แต่ละหลักจาก1ถึง9ถูกเข้ารหัสเป็นจำนวนเชิงซ้อนที่แสดงถึงตำแหน่งของมันใน numpad โดยใช้ในกริดขั้นตอนที่ 2 โดยที่ส่วนที่แท้จริงหมายถึงตำแหน่งแนวตั้งและส่วนจินตภาพแทนตำแหน่งแนวนอน ดังนั้น1เป็น0+0j, 2คือ0+2j, 3คือ0+4j, 4คือ2+0j, ... , เป็น94+4j

หลัก0จะถูกเข้ารหัสเป็น0+1jเช่นราวกับว่ามันถูกวางไว้ตรงระหว่างและ12

สำหรับแต่ละจำนวน numpad ง่ายสมัครแปลง "ทศนิยม" ฐานถูกนำไปใช้โดยใช้ตัวเลขที่ซับซ้อนดังกล่าวข้างต้นแทนตัวเลข0, 1, ... 9, สิ่งนี้ให้อาร์เรย์ซึ่งมีการคำนวณความแตกต่างติดต่อกันแบบสัมบูรณ์ หมายเลขผู้สมัครเป็นมิตรกับ numpad ถ้าหากว่าความแตกต่างที่แท้จริงทั้งหมดมีมากที่สุด2(เช่นขั้นตอนของกริด) หากเป็นเช่นนั้นตัวเลขจะถูกทิ้งไว้บนสแต็ก

รหัสที่ใช้do... ห่วงซึ่งจะออกเมื่อปริมาณของตัวเลขในกองเท่ากับการป้อนข้อมูลwhilen

กริดหน่วยจะเป็นทางเลือกที่เป็นธรรมชาติมากกว่า ตัวเลข1, 2และ0จากนั้นก็จะสอดคล้องกับ0+0j, 1+0jและ0.5+0jrespecrively แต่นักกอล์ฟใช้ตาราง step-2 เพราะการคูณด้วย2(ฟังก์ชันE) และการกด0+1j(ฟังก์ชันJ) นั้นสั้นกว่าการกด0+0.5j( J2/หรือ.5j) หนึ่งไบต์


2

เยลลี่ 26 ไบต์

’d-,.⁸?3µ€ạ/S
Dṡ2Ç€<2Ạ
1Ç#

ลองออนไลน์!

-2 ไบต์ต้องขอบคุณ coinheringaahing ที่มีค่า
-2 ไบต์ขอบคุณ Erik the Outgolfer

คำอธิบาย

’d-,.⁸?3µ€ạ/S  Helper Link; compute the distance between two keys z = [x, y]
      ?        Switch:
     ⁸         If z (is not 0):
’              Decrement
 d             Divmod by:
  -,.          Else: [-1, 0.5] (special position for 0)
       3       3; right argument for divmod otherwise ignored
        µ      Begin a new monadic link / end this link
         €     Compute the position for each [x, y]
           /   Reduce on
          ạ    Absolute Difference
            S  Sum (this gives the Manhattan Distance)
Dṡ2Ç€<2Ạ       Helper Link; determine if a number <z> is numpad friendly
D              Convert number to decimal digits
 ṡ             Slice into overlapping slices of length
  2            2 (pairs)
    €          For each pair,
   Ç           The distance between the keys
     <2        Compare with 2 (the distance between two adjacent keys is 1; corners 2; 0 - 1 and 0 - 2 are 1.5)
       Ạ       All; either all of the distances are less than 2 or there were no distances
1Ç#            Main Link; find the first (input) numpad friendly numbers
  #            nfind; counting up from _ collect the first _______ matches that are
1                                      1
                                                           (input)
 Ç             Numpad Friendly

คุณสามารถลบ[]ขนาด 2 ไบต์ได้
caird coinheringaahing

@cairdcoinheringaahing ขอบคุณ!
HyperNeutrino



1

Mathematica, 249 234 202 ไบต์

(a=o=1;While[a<=#,s=IntegerDigits@o;t=1;p=0;While[t+p<Length@s,If[!FreeQ[(IntegerDigits/@{210,4210,53210,632,7541,86542,9653,874,9875,986})[[s[[t]]+1]],s[[t+1]]],t++,p++]];If[t==Length@s,a++];o++];o-1)&


ลองออนไลน์!

ขอบคุณ user202729 สำหรับการบีบอัดข้อมูล (-32 ไบต์)

ผลลัพธ์ของฉัน:

100 -> 447
1,000 -> 20023
10,000 -> 788777


ฉันคิดว่าคุณสามารถบีบอัดข้อมูลโดยใช้IntegerDigits: IntegerDigits/@{210,4210,53210,632,7541,86542,9653,874,9875,986}และการใช้งานFreeQ, Trการใช้DoแทนForสัญกรณ์ใช้มัดสำหรับAppendToและใช้DoแทนการWhileที่จะทำซ้ำครั้งยังขจัดตัวแปรTr[1^s] pนอกจากนี้คุณยังไม่ได้พิสูจน์ว่าอัลกอริทึมนั้นถูกต้องนั่นคือจำนวนผลลัพธ์นั้นน้อยกว่าดัชนีกำลังสองซึ่งจำเป็นต้องทำให้คำตอบนั้นถูกต้องเสมอ
user202729

1
@ user202729 ฉันเปลี่ยนหลายสิ่งหลายอย่างคำตอบของฉันถูกต้องแน่นอน ฉันจะบีบอัดข้อมูลทันที
J42161217

ทำไม downvote
J42161217

1

PHP, 124 + 1 ไบต์

while($argn-=$r)for($p=$r=~0,$x=++$n;$x>=1;$p=[7,23,47,76,178,372,616,400,928,832][$c],$x/=10)$r&=!!($p&1<<$c=$x%10);echo$n;

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์


0

Java 8, 192 190 ไบต์

n->{int r=1,p;a:for(;n>0;){p=-1;for(int c:(r+++"").getBytes())if(p>-1&!"012;0124;01235;236;1457;24568;3568;478;5789;689".split(";")[c-=48].contains(p+""))continue a;else p=c;n--;}return~-r;}

ส่งคืนnหมายเลขลำดับที่(ดัชนี 1 ดัชนี) ในลำดับ

นี่เป็นเรื่องที่ยากกว่าที่ฉันคิด .. น่าจะมีแค่สมองส่วนหนึ่งในบ่ายวันนี้ ..

คำอธิบาย:

ลองที่นี่

n->{                 // Method with integer as both parameter and return-type
  int r=1,           //  Return-integer
      p;             //  Previous digit
  a:for(;n>0;){      //  Loop (1) as long as the input is larger than 0
    p=-1;            //   Start `p` at an integer that is not 0-9 (-1 in this case)
    for(int c:(r+++"").getBytes())
                     //   Loop (2) over the digits of the current number
      if(p>=0        //    If this is not the first digit (`p` != -1),
         &!"012;0124;01235;236;1457;24568;3568;478;5789;689".split(";")[c-=48]
           .contains(p+""))
                     //    and the adjacent digits are NOT part of a NumberPad-Friendly Nr:
        continue a;  //     Go to the next iteration of loop (1)
      else           //    Else:
        p=c;         //     Set `p` to the current digit for the next iteration
                     //   End of loop (2) (implicit / single-line body)
      n--;           //   If we haven't encountered the `continue`, decrease `n` by 1
  }                  //  End of loop (1)
  return~-r;         //  Return the result-integer - 1
}                    // End of method
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.