Tạo số thân thiện với Numpad


22

Lấy cảm hứng từ Tạo số bàn phím thân thiện .

Lý lịch

Nhiều bảng số có bố cục sau:

789

456

123

    0    

Chúng tôi định nghĩa vùng lân cận của một số là tập hợp các ô liền kề trực tiếp với nó trên numpad được hiển thị, bao gồm chính nó. Ví dụ: vùng lân cận của 2 là {1,5,3,0,2}và vùng lân cận là 0 {1,2,0}. Có một danh sách các vùng lân cận của mỗi số bên dưới, trên các trường hợp thử nghiệm.

Chúng tôi định nghĩa một số thân thiện numpad là một số nguyên dương trong đó, khi được viết bằng số thập phân mà không có số 0 đứng đầu, mỗi chữ số ngoại trừ số đầu tiên nằm trong vùng lân cận của chữ số trước đó.

Ví dụ,

  • 7856 là một số thân thiện với người Numpad vì 8 ở khu phố 7, 5 ở khu phố 8 và 6 ở khu phố 5.
  • 1201 là một số thân thiện với numpad vì 2 nằm trong vùng lân cận 1, 0 nằm trong vùng lân cận của 2 và 1 nằm ở vùng lân cận 0.
  • 82 không phải là một số thân thiện numpad vì 2 không nằm trong khu phố 8.
  • 802 không phải là số thân thiện với numpad vì 0 không nằm trong vùng lân cận 8 (các vùng lân cận không bao quanh).

Trình tự OEIS liên quan . Lưu ý rằng chuỗi liên quan này là khác biệt bởi vì nó được tính 0là liền kề 7thay vì 12.

Thử thách

Cho một số nguyên dương n, trả về số thân thiện nthứ n hoặc số nnumpad đầu tiên , trong đó số đầu tiên là 1. Bạn có thể sử dụng lập chỉ mục dựa trên 0, trong đó số thân thiện numpad 0 sẽ là 1.

Vùng lân cận

Vùng lân cận của mỗi chữ số được liệt kê ở đây:

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}

Các trường hợp thử nghiệm / Trình tự

Đây là 100 điều khoản đầu tiên

[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
Tôi thích cách thử thách này chỉ xem xét các số nguyên dương (giữ nguyên bản chất và cho phép nhiều ngôn ngữ tham gia hơn) và cho phép hiển thị đầu ra thứ n hoặc n đầu tiên để linh hoạt
Luis Mendo

Tôi hoàn toàn hiểu sai về thách thức, đây là một kịch bản "thuật ngữ này có giá trị trong chuỗi": Hãy thử trực tuyến!
Bạch tuộc ma thuật Urn

Câu trả lời:


9

JavaScript (ES6), 104 93 89 88 byte

Trả về số hạng thứ N của chuỗi, được lập chỉ mục 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)

Bản giới thiệu


Điều tốt nhất tôi có thể nhận được là 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-1có thể có gì đó giúp ích, bài kiểm tra của tôi có thể quá dài
Conor O'Brien

Câu trả lời này đưa khái niệm về số ma thuật lên một cấp độ hoàn toàn mới ... Tôi thậm chí không hiểu làm thế nào bạn tìm thấy chúng o_O
scottinet

2
@scottinet Ở một mức độ lớn, lời giải thích của tôi cho câu trả lời này cũng áp dụng cho câu hỏi này. Sự khác biệt tuyệt đối không hoạt động tốt trên cái đó, vì vậy tôi đã thử với XOR. Là một lưu ý phụ, tôi đã tìm thấy một công thức khác hoạt động trong 96% trường hợp mà không cần phải tra cứu bitmask. Nhưng việc xử lý riêng 4% còn lại là quá tốn kém trong JS. Tôi đã không thử trong Jelly và bây giờ tôi vẫn không nhớ công thức này ... \ _ () _ /
Arnauld

Cảm ơn đã giải thích. Điều này vẫn còn ấn tượng :-)
scottinet


3

Thạch , 27 24 byte

Trả về N điều khoản đầu tiên của chuỗi.

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

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

Đây là một cổng của câu trả lời JS của tôi .

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 byte

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

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

Trả về số thứ n trong chuỗi.

Giải thích:

µ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

Ý tưởng chính là, ngoài 0khóa, bất kỳ chữ số nào được giảm và chuyển đổi sang cơ sở 3 đều có các thuộc tính sau:

  • hàng xóm bên trái và bên phải có sự khác biệt tuyệt đối là 1
  • hàng xóm lên và xuống có chênh lệch tuyệt đối là 10, đảo ngược, thuận tiện bằng 1
  • bất kỳ cặp khóa numpad nào khác dẫn đến các giá trị khác nhau, ngay cả khi bị đảo ngược

Tất nhiên chúng ta cần một ifcâu lệnh để xử lý 0khóa numpad.


Câu trả lời chắc chắn, đã đưa ra nhiều cải tiến, không thể tìm thấy bất kỳ. Oooo ... và điều đó cũng khiến bạn dẫn đầu :).
Bạch tuộc ma thuật Urn

Tôi không nghĩ rằng tôi đã có thể đưa ra 3 quy tắc đó, khá ấn tượng; Điều gì đã cho bạn ý tưởng?
Bạch tuộc ma thuật Urn

2

MATL , 29 27 byte

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

Đầu ra các nsố thân thiện với numpad đầu tiên .

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

Giải trình

Mỗi chữ số từ 1đến 9được mã hóa thành một số phức biểu thị vị trí của nó trong bàn phím số, sử dụng trong lưới bước 2, trong đó phần thực biểu thị vị trí dọc và phần ảo đại diện cho vị trí nằm ngang. Vậy 10+0j, 20+2j, 30+4j, 42+0j, ..., 94+4j.

Chữ số 0được mã hóa thành 0+1j, tức là như thể nó được đặt chính xác giữa 12.

Đối với mỗi số Numpad thân thiện với ứng cử viên, một "thập phân" chuyển đổi cơ sở được áp dụng bằng cách sử dụng trên số phức thay vì các chữ số 0, 1, ..., 9. Điều này đưa ra một mảng, trong đó sự khác biệt liên tiếp tuyệt đối được tính toán. Số ứng cử viên thân thiện với numpad nếu và chỉ khi tất cả các khác biệt tuyệt đối nhiều nhất 2(tức là bước lưới). Nếu đó là trường hợp, số còn lại trên ngăn xếp.

Mã sử ​​dụng một vòng lặp do... while, được thoát khi số lượng số trong ngăn xếp bằng với đầu vào n.

Một lưới đơn vị sẽ là một lựa chọn tự nhiên hơn. Chữ số 1, 20sau đó sẽ tương ứng với 0+0j, 1+0jvà một cách 0.5+0jđáng tin cậy. Nhưng sẽ tốt hơn khi sử dụng lưới bước 2, vì nhân với 2(hàm E) và đẩy 0+1j(hàm J) ngắn hơn một byte so với đẩy 0+0.5j( J2/hoặc .5j)


2

Thạch , 26 byte

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

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

-2 byte nhờ caird coinheringaahing
-2 byte nhờ Erik the Outgolfer

Giải trình

’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

Bạn có thể xóa []2 byte
caird coinheringaahing

@cairdcoinheringaahing cảm ơn!
HyperNeutrino



1

Toán học, 249 234 202 byte

(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)&


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

cảm ơn người dùng202729 vì đã nén dữ liệu (-32 byte)

Kết quả của tôi:

100 -> 447
1000 -> 20023
10000 -> 788777


Tôi nghĩ rằng bạn có thể nén dữ liệu bằng cách sử dụng IntegerDigits: IntegerDigits/@{210,4210,53210,632,7541,86542,9653,874,9875,986}, và sử dụng FreeQ, Trsử dụng Dothay vì Forsử dụng ký hiệu infix cho AppendTovà sử dụng Dothay vì Whilelặp lại Tr[1^s]thời gian, cũng loại bỏ biến p. Ngoài ra, bạn chưa chứng minh rằng thuật toán là chính xác, nghĩa là, số kết quả luôn nhỏ hơn bình phương của nó, điều này là cần thiết để đưa ra câu trả lời hợp lệ.
dùng202729

1
@ user202729 Tôi đã thay đổi rất nhiều thứ. Câu trả lời của tôi hoàn toàn hợp lệ. Tôi sẽ nén dữ liệu ngay bây giờ.
J42161217

Tại sao các downvote?
J42161217

1

PHP, 124 + 1 byte

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;

Chạy như ống với -nRhoặc thử trực tuyến .


0

Java 8, 192 190 byte

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

Trả về số thứ 1 (được lập chỉ mục) ntrong chuỗi.

Điều này khó hơn đáng kinh ngạc so với tôi nghĩ .. Có lẽ chỉ cần có một số rắm não chiều nay ..

Giải trình:

Hãy thử nó ở đây.

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
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.