Створення цифрових номерів, зручних для цифр


22

Натхненний створенням дружніх клавіатурних номерів .

Фон

Багато клавіатурних колодок мають такий макет:

789

456

123

    0    

Ми визначаємо сусідство числа як сукупність осередків, ортогонально прилеглих до нього, на показаному на цифровій клавіатурі, включаючи саму себе. Наприклад, сусідство 2 є, {1,5,3,0,2}а 0 - сусідство {1,2,0}. Нижче наведено список мікрорайону кожного номера, що знаходиться над тестовими.

Ми визначаємо число дружнього числа чисел як додатне ціле число, де, коли записується у десятковій формі без провідних нулів, кожна цифра, крім першої, знаходиться в сусідстві з попередньою цифрою.

Наприклад,

  • 7856 - це дружнє число, оскільки 8 знаходиться в районі 7, 5 - в сусідньомуході з 8, а 6 - в районі 5.
  • 1201 - це дружнє число, яке сприймає число, оскільки 2 знаходиться в районі 1, 0 - в районі 2, а 1 - в районі 0.
  • 82 - це не дружнє число, оскільки 2 не знаходиться поблизу 8.
  • 802 - це не дружнє число, оскільки 0 не знаходиться в районі 8 (райони не обертаються).

Пов’язана OEIS послідовність . Зауважте, що ця пов'язана послідовність є чіткою, оскільки вона вважається 0суміжною з 7замість 1і 2.

Виклик

Подавши ціле додатне ціле число n, поверніть n-ве або перше nчисло дружніх номерів, де перше - 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 -й, або перший n- вихід для гнучкості
Луїс Мендо

Я повністю неправильно вичитав виклик, ось сценарій "чи цей термін дійсний у послідовності": Спробуйте в Інтернеті!
Чарівна урва восьминога

Відповіді:


9

JavaScript (ES6), 104 93 89 88 байт

Повертає N-й член послідовності, 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% випадків без необхідності пошуку біт-маски пошуку. Але обробка решти 4% окремо була занадто дорогою в JS. Я не намагався в Jelly , і тепер я не пам'ятаю формули в будь-якому випадку ... ¯ \ _ (ツ) _ / ¯
Арнольд

Дякую за пояснення. Це все ще вражає :-)
scottinet


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
  • будь-яка інша пара клавіш цифрових клавіатур призводить до різних значень, навіть коли вони перевернуті

Звичайно, нам потрібна ifоперація для обробки 0клавіші numpad.


Справжня відповідь, яка запропонувала більше вдосконалень, не можу знайти жодного. Оооо ... і це попарно теж повело тебе в лідерство :).
Magic Octopus Urn

Я не думаю, що я міг би придумати ці 3 правила, досить вражаючі tbh; що дало тобі ідею?
Magic Octopus Urn

2

MATL , 29 27 байт

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

Виводить перші nчисла, сприятливі для числення.

Спробуйте в Інтернеті!

Пояснення

Кожна цифра від 1до 9кодується як складне число, що представляє її положення в нумедоні, використовуючи в сітці кроку-2, де реальна частина являє вертикальне положення, а уявна частина - горизонтальне положення. Так 1є 0+0j, 2є 0+2j, 3є 0+4j, 4є 2+0j, ..., 9є 4+4j.

Цифру 0кодують як 0+1j, тобто так, як якщо б вона була розміщена саме між 1і 2.

Для кожного кандидата Numpad людей числа, «десяткова» базова перетворення застосовується з використанням вище комплексних чисел замість цифр 0, 1..., 9. Це дає масив, з якого обчислюються абсолютні послідовні різниці. Номер кандидата є чистим для чисельності, якщо і лише тоді, коли абсолютні відмінності є максимум 2(тобто крок сітки). Якщо це так, число залишається на стеку.

У коді використовується цикл do... while, який виходить, коли кількість чисел у стеку дорівнює вводу n.

Більш природним вибором була б одинична сітка. Digits 1, 2і 0потім відповідати 0+0j, 1+0jі 0.5+0jrespecrively. Але гравець використовувати сітку кроку-2, тому що множення на 2(функцію E) та натискання 0+1j(функцію J) на один байт коротше, ніж натискання 0+0.5j( J2/або .5j)


2

Желе , 26 байт

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

Спробуйте в Інтернеті!

-2 байти завдяки пташиному коінхерінгагінгу
-2 байту завдяки Еріку Переверху

Пояснення

’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

Математика, 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
1000 -> 20023
10000 -> 788777


Я думаю, що ви можете стиснути дані, використовуючи IntegerDigits:, IntegerDigits/@{210,4210,53210,632,7541,86542,9653,874,9875,986}і використовувати FreeQ, Trвикористовувати Doзамість For, використовувати позначення інфіксації для, AppendToа використовувати Doзамість Whileповторення Tr[1^s]разів, також усунути змінну p. Також ви не довели, що алгоритм є правильним, тобто отримане число завжди менше, ніж його індекс у квадраті, що необхідно, щоб відповідь була дійсною.
користувач202729

1
@ user202729 Я змінив багато речей. Моя відповідь безумовно справедлива. Я зараз стисну дані.
J42161217

чому потік?
J42161217


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

Повертає (1-індексований) n'-ве число у послідовності.

Це було напрочуд важче, ніж я думав. Напевно, просто вдруге південь у мозку.

Пояснення:

Спробуйте тут.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.