Numpad Dostu Sayılar Üret


22

Klavye Dostu Numaralar Üretin esinlenerek .

Arka fon

Birçok sayısal tuş takımı aşağıdaki düzende bulunur:

789

456

123

    0    

Bir sayının mahallesini, kendisi de dahil olmak üzere gösterilen sayısal tuş takımının ortogonal bitişiğindeki hücre kümesi olarak tanımlarız. Örneğin, 2'nin mahallesi {1,5,3,0,2}ve 0'ın mahallesi {1,2,0}. Test numaralarının üstünde, her bir numaranın mahallesinin bir listesi var.

Bir sayısal tuş takımı ile uyumlu bir sayıyı pozitif bir tamsayı olarak tanımlarız , ondalık sayılar olmadan baştaki sıfır olmadan yazıldığında, birincisi hariç her basamağın bir önceki basamağın yakınında olması.

Örneğin,

  • 7856 sayısal tuş takımı bir sayıdır, çünkü 8, 7’nin mahallesinde, 5’i 8’in komşusunda, 6’sı ise 5’in mahallesindedir.
  • 1201 sayısal tuş takımı bir sayıdır, çünkü 2 1’in mahallesinde, 0’ı 2’nin mahallesinde ve 1’i 0’ın mahallesindedir.
  • 82 değil 2 8 mahallede olmadığı için bir sayısal tuş takımı dostu numarası.
  • 802 olduğu değil 0 8 (mahalleler etrafına sarmak yok) yakınında olmadığından bir sayısal tuş takımı dostu numarası.

İlgili OEIS Dizisi . Bu ilgili dizinin farklı olduğuna dikkat edin çünkü yerine ve yerine 0bitişik olarak sayılır .712

Meydan okuma

Olumlu bir tamsayı verildiğinde , ilk sayı 1 nolan nbirinci veya ilk nsayısal tuş takımı sayılarını döndürün. 0 numaralı sayısal tuş takımı dostu sayının 1 olduğu 0 tabanlı dizinlemeyi kullanabilirsiniz.

Çevredekiler

Her basamağın mahallesi burada listelenmiştir:

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}

Test Durumları / Sıra

Bunlar ilk 100 terimdir.

[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
Bu meydan okuma nasıl gibi sadece pozitif tamsayılar dikkate (özünü tutar ve daha fazla dil katılmak sağlayan) ve ya görüntülenmesini sağlar n -inci ya da ilk n esneklik için çıkışları
Luis Mendo

Bu sorunu tamamen yanlış anladım, işte "dizide geçerli olan bu terim budur" betiği: Çevrimiçi deneyin!
Magic Octopus Urn

Yanıtlar:


9

JavaScript (ES6), 104 93 89 88 bayt

1 indeksli dizinin N. Terimini döndürür.

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)

gösteri


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

Bu cevap, sihirli sayılar kavramını tamamen yeni bir seviyeye getiriyor ... Onları nasıl bulduğunuzu bile anlamadım.
O_O

2
@scottinet Büyük ölçüde, bu cevap için açıklamam bunun için de geçerli. Mutlak fark bu konuda çok işe yaramadı, ben de XOR ile çalıştım. Yan not olarak, arama bit maskesi gerekmeden vakaların% 96'sında çalışan başka bir formül buldum. Ancak, kalan% 4'ü ayrı olarak işlemek JS'de çok pahalıydı. Jelly’de denemedim ve şimdi formülü zaten hatırlamıyorum ... ¯ \ _ (ツ) _ / ¯
Arnauld

Açıklamalar için teşekkürler. Bu hala etkileyici :-)
scottinet 28:17

4

Perl 5 , 123 + 1 (-p) = 124 bayt

while($_){$r=@d=++$\=~/./g;map$r&&=(120,1240,12350,236,1457,24568,3569,478,5789,689)[$d[$_-1]]=~/$d[$_]/,1..$#d;$r&&$_--}}{

Çevrimiçi deneyin!


3

Jöle , 27 24 bayt

N dizisinin ilk terimlerini döndürür.

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

Çevrimiçi deneyin!

Bu benim JS cevabımın bir limanı .

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 bayt

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

Çevrimiçi deneyin!

Sıradaki nth sayısını döndürür.

açıklamalar:

µ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

Ana fikir, bunun dışında 0 anahtar azaltılmış ve taban 3'e dönüştürülen herhangi bir basamağın aşağıdaki özelliklere sahip olmasıdır:

  • sol ve sağ komşular mutlak bir fark var 1
  • Yukarı ve aşağı komşular, tersine çevrilerek uygun olarak 1'e eşit olan 10 mutlak farkına sahiptir.
  • başka bir sayısal tuş takımı çifti, ters çevrildiğinde bile farklı değerlere neden olur

Tabii ki if, 0sayısal tuş takımını ele almak için bir ifadeye ihtiyacımız var .


Kesin cevap, daha fazla iyileştirme teklif etmeye geldim, bulamıyorum. Oooo ... ve bu ikili de sizi liderliğe soktu :).
Magic Octopus Urn

Oldukça etkileyici tbh olan bu 3 kuralı bulabileceğimi sanmıyorum; sana fikri ne verdi?
Magic Octopus Urn

2

MATL , 29 27 bayt

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

İlk nsayısal tuş takımıyla uyumlu sayıları çıkarır.

Çevrimiçi deneyin!

açıklama

Each basamak 1için 9gerçek bir parçası yatay pozisyonu temsil eden dikey konumunu ve sanal kısmını temsil eden bir adım 2 ızgara bölgesi kullanılarak, sayısal tuş takımı konumunu temsil eden bir karmaşık sayı olarak kodlanır. Yani 1ise 0+0j, 2olduğu 0+2j, 3olduğunu 0+4j, 4olup 2+0j, ..., 9ise 4+4j.

Rakam tam olarak ve arasına yerleştirilmiş gibi 0şifrelenir .0+1j12

Her aday numpad dostu numarası için, bir "ondalık" temel dönüşüm yerine basamak karmaşık sayılar üzerinde kullanılarak uygulanır 0, 1, ..., 9. Bu, mutlak ardışık farkların hesaplandığı bir dizi verir. Aday numarası, eğer sadece mutlak farkların en fazla olduğu durumlarda 2(ör. Izgara adımı) , numpad dostudur . Bu durumda, numara yığında kalır.

Kod , yığıntaki sayıların sayıya eşit olması durumunda çıkan bir do... whiledöngü kullanır n.

Bir birim ızgara daha doğal bir seçim olabilirdi. Rakamlar 1, 2ve 0daha sonra karşılık olur 0+0j, 1+0jve 0.5+0jrespecrively. Ama ile çarparak, çünkü bir basamak-2 ızgara kullanımı golfier var 2(fonksiyonu E) ve itme 0+1j(fonksiyonu J) itme birden bayt daha kısadır 0+0.5j( J2/ya da .5j)


2

Jöle , 26 bayt

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

Çevrimiçi deneyin!

Caird coinheringaahing sayesinde
-2 byte -2 Bayt Erik sayesinde 2 byte

açıklama

’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 bayt için kaldırabilirsiniz
caird coinheringaahing

@cairdcoinheringaahing teşekkürler!
HyperNeutrino 24:17



1

Mathematica, 249 234 202 bayt

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


Çevrimiçi deneyin!

Veri sıkıştırması için user202729 'e teşekkür ederiz (-32 bytes)

Benim sonuçlarım:

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


Sana kullanarak verileri sıkıştırabilir düşünüyorum IntegerDigits: IntegerDigits/@{210,4210,53210,632,7541,86542,9653,874,9875,986}ve kullanımı FreeQ, Trkullanmak Doyerine Foryönelik, kullanımı infix gösterimde AppendTove kullanımı Doyerine Whiletekrar etmek Tr[1^s]de değişken ortadan zamanlarda p. Ayrıca, algoritmanın doğru olduğunu ispat etmediniz, yani sonuçta elde edilen sayı daima bir cevabı geçerli kılmak için gerekli olan indeks karesinden daha azdır.
user202729

1
@ user202729 Bir çok şeyi değiştirdim. Cevabım kesinlikle geçerli. Şimdi verileri sıkıştıracağım.
J42161217

neden aşağı oy?
J42161217

1

PHP, 124 + 1 bayt

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;

Pipe ile çalıştırın -nRveya çevrimiçi deneyin .


0

Java 8, 192 190 bayt

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 indeksli) döndürür n 'nin numarasını .

Bu düşündüğümden şaşırtıcı bir şekilde daha zordu .. Muhtemelen bu öğleden sonra biraz beyin osuruğu geçiriyordu ..

Açıklama:

Burada dene.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.