Klavye Dostu Numaralar Üret


29

En yaygın bilgisayar klavyesi düzenlerinde ondalık basamak tuşları bulunur

1234567890

harflerin tuşlarının üstünde, üstlerinde ilerliyorlar.

Ondalık bir basamağın komşusu , varsa kendi basamaklı tuşundan ve basamaklı tuşlardan sağa ve sola doğru basamak kümesi olsun.

Örneğin, 0 {0, 9}mahallesi ve 5 mahallesi {4, 5, 6}.

Şimdi, klavyeyle uyumlu bir sayıyı , yukarıdaki düzene yazılabilen birinci basamaktan sonraki sayının ardışık her basamağının bir önceki basamağın yakınında olacağı şekilde yukarıdaki düzene yazılabilen pozitif bir tamsayı (baştaki sıfırları olmayan ondalık biçimde) olarak tanımlayın .

  • Tüm tek basamaklı sayılar (1-9) önemsiz derecede klavyelidir.

  • 22321 gibi bir rakam klavyeyle uyumludur çünkü her rakam (birinciyi saymaz) hemen önce hanenin mahallesindedir.

  • 1245 gibi bir sayıdır değildir 4 2 (ya da tam tersi) çevresinde olmadığı için klavye kolay.

  • Bir dizi gibi 109 olduğunu değil 0 1. yakınında olmadığından uçları etrafında döngü yok klavye dostu.

Klavye dostu sayıları en küçüğünden en büyüğüne sırayla koyarak bir tam sayı dizisi oluşturabiliriz .

İşte klavye dostu sayılar dizisinin ilk 200 terimi:

N KFN(N)
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 11
11 12
12 21
13 22
14 23
15 32
16 33
17 34
18 43
19 44
20 45
21 54
22 55
23 56
24 65
25 66
26 67
27 76
28 77
29 78
30 87
31 88
32 89
33 90
34 98
35 99
36 111
37 112
38 121
39 122
40 123
41 211
42 212
43 221
44 222
45 223
46 232
47 233
48 234
49 321
50 322
51 323
52 332
53 333
54 334
55 343
56 344
57 345
58 432
59 433
60 434
61 443
62 444
63 445
64 454
65 455
66 456
67 543
68 544
69 545
70 554
71 555
72 556
73 565
74 566
75 567
76 654
77 655
78 656
79 665
80 666
81 667
82 676
83 677
84 678
85 765
86 766
87 767
88 776
89 777
90 778
91 787
92 788
93 789
94 876
95 877
96 878
97 887
98 888
99 889
100 890
101 898
102 899
103 900
104 909
105 987
106 988
107 989
108 990
109 998
110 999
111 1111
112 1112
113 1121
114 1122
115 1123
116 1211
117 1212
118 1221
119 1222
120 1223
121 1232
122 1233
123 1234
124 2111
125 2112
126 2121
127 2122
128 2123
129 2211
130 2212
131 2221
132 2222
133 2223
134 2232
135 2233
136 2234
137 2321
138 2322
139 2323
140 2332
141 2333
142 2334
143 2343
144 2344
145 2345
146 3211
147 3212
148 3221
149 3222
150 3223
151 3232
152 3233
153 3234
154 3321
155 3322
156 3323
157 3332
158 3333
159 3334
160 3343
161 3344
162 3345
163 3432
164 3433
165 3434
166 3443
167 3444
168 3445
169 3454
170 3455
171 3456
172 4321
173 4322
174 4323
175 4332
176 4333
177 4334
178 4343
179 4344
180 4345
181 4432
182 4433
183 4434
184 4443
185 4444
186 4445
187 4454
188 4455
189 4456
190 4543
191 4544
192 4545
193 4554
194 4555
195 4556
196 4565
197 4566
198 4567
199 5432
200 5433

Meydan okuma

Olumlu bir tamsayı N (stdin / komut satırı / function argümanı ile) alan ve basan (stdout'a) alan veya klavye dostu sayılar dizisindeki Nth terimini döndüren bir program veya işlev yazın.

Örneğin, eğer giriş ise 191, çıkış olmalıdır 4544.

Çıktı isteğe bağlı olarak tek bir izleyen yeni hatta sahip olabilir.

Bayt cinsinden en kısa gönderme kazanır.


7
Rastgele gerçek:
OEIS'in numpadler

Teşekkürler, @ Sp3000. Bu şeyi merak ederek buraya geldim.
luser droog,

Yanıtlar:


8

Pyth, 27 24 bayt

uf!f/h-FY3.:metsd`T2hGQ0

Gösteri.

Orijinaldeki iyileştirmeler:

  • Kullanılması metdyerine, .r ... _UJ: 2 daha az bayt. 1 direkt, 1 J kullanmak zorunda olmadığından

  • Kullanımı sve `Tyerine JT10: 1 az bayt.


Bir sayının dize gösterimi ile başlayacak: `T.

Daha sonra dizgiyi bir sayı listesine dönüştürürüz ve sayı sayılarını birer birer (9876543210) ile döndürürüz metsd. Ardından 2 elementin sırasını da alırız .: ... 2. Bu alt diziler filtrelenir/h-FY3 . Bu sentezleme karşılık ((a-b)+1)/3arasındaki fark ancak ve ancak sıfırdır, ave bsayısı klavye için uygun olduğu takdirde nedenle eğer 1. En olan, süzüldü liste boş olacaktır. İle !, sonuç yalnızca sayı klavyeyle uyumluysa doğrudur.

f ... hGG+1sonuç doğru olana kadar yukarı doğru filtreler , ilk G+1veya daha klavyeye dost bir numara verir . u ... Q0bu işlevi girişin Q0'dan başlayarak kendi çıkış sürelerine uygular Q. Bu, istediğiniz şekilde Qth Keyboard Friendly Number değerini verir .


4

Python 3, 112 102 bayt

f=lambda n,k=0:n+1and f(n-all(-2<~-int(a)%10-~-int(b)%10<2for a,b in zip(str(k),str(k)[1:])),k+1)or~-k

Bulmak için hala gerekli olan dost sayıları nve son kontrol edilen sayıları takip ediyoruz k.

@İsaacg ve @ Sp3000 sayesinde 5 ve 5 bayt kurtarıldı.


Bir def dönüş yerine bir lamba ifadesi kullanın. Lambas varsayılanlara izin verir.
isaacg

@isaacg Teşekkürler, lambda ile nasıl tekrar elde edeceğimi bilmiyordum.
randomra

Ah doğru. Unary ops önce gelir. Benim hatam.
mbomb007 12:15

Sen bırak [:-1]içindezip
SP3000

4

CJam, 29 28 bayt

ri_4#{AbAfe|_1>.-W<3,:(-!},=

CJam tercümanında çevrimiçi olarak deneyin .


N-dostluk dostu sayının üst sınırının N ** 2 olduğuna dair kolay bir kanıt var mı
Doktor

Henüz bir tane bulamadım. Bunun kanıtı N ** 4oldukça kolaydır, çünkü aşağıda en azından 2 ** kKFN vardır 10 ** k < 16 ** k. Değiştirme _*ile 4#bayt sayısını değiştirmez, ama bunun bir şifre korkunç verimsiz hale getirecektir.
Dennis

O zaman kodunuz bazı büyük giriş numaraları için yanlış değil mi?
Doktor

1
Neyse ki değil. Ama öğrenene kadar değiştireceğim. homurdanmalar
Dennis,

3

CJam, 34 31 bayt

Dennis tarafından 3 bayt kurtardı.

Eminim ki Pyth ile olan boşluk bir şekilde kapatılabilir, ancak şu anda bunu daha fazla golf oynamak için zamanım yok.

0q~{{)_s:_2ew{A,s(+f#~m2/},}g}*

Burada test et.


2 karakter kaydetmek için ve ile değiştirmek için )_++ile değiştirebilirsiniz . :_-z1>m2/
Dennis,

@Dennis Oh, bunlar çok güzel, teşekkür ederim!
Martin Ender

3

JavaScript (ES6), 95

F=k=>{for(i=0;k;k-=(f=1,p=NaN,[for(d of''+i)(d=(8-~d)%10,d-p>1|p-d>1?f=0:p=d)],f))++i;return i}

Ungolfed

F=k=>{
  for(i=0; k>0; )
  {
    ++i;
    f = 1; // presume i it's friendly
    p = NaN; // initial value so that first comparison gives false
    for(d of ''+i) // loop for each digit of i
    {
      // rotate digits 1->0, 2->1 ... 9->8, 0->9
      // note d is string, ~~ convert to number (golfed: 8-~d)
      d = (~~d+9) % 10 
      if (p-d>1 || p-d<-1) 
        f = 0 // not friendly
      else 
        // this can go in the 'else', if not friendly I don't care anymore
        p = d // move current digit to prev digit
    }
    k -= f // count if it's friendly, else skip
  }
  return i
}

Test : Firefox'ta snippet'i çalıştır


Çok fazla JS bilmiyorum, ama sen abs(p-d)>1yerine bir şey yapamaz mısın p-d>1|p-d<-1?
Alex A.

@AlexA. Genişletilmiş ve golf içindeki ifadeler eşdeğerdir. Math.abs(p-d)>1daha uzunp-d>1|p-d<-1
edc65 14:15

Ah tamam. Eşdeğer olduklarını biliyordum, Math.ön eke ihtiyacın olduğunu bilmiyordum .
Alex A.

2

Haskell, 90 80 bayt

([x|x<-[0..],all((<2).abs)$zipWith(-)=<<tail$[mod(1+fromEnum c)10|c<-show x]]!!) 

Bu isimsiz bir fonksiyondur. Kullanmak için, örneğin: ([x|x<-[0..],all((<2).abs)$zipWith(-)=<<tail$[mod(1+fromEnum c)10|c<-show x]]!!) 199döndüren bir parametre ile çağırın5432 .

Nasıl çalışır:

[x|x<-[0..]           ]  make a list of all integers x starting with 0
           ,             where
             c<-show x   each character in the string representation of x
  mod(1+fromEnum c)10    turned into the number '(ascii+1) mod 10'
 zipWith(-)=<<tail       then turned into a list of differences between neighbor elements
all((<2).abs)            only contains elements with an absolute value less than 2


                   !!    ... take the element given by the parameter (!! is 0 
                         based, that's why I'm starting the initial list with 0)

Düzenleme: @Mauris kaydetmek için bazı bayt bulundu. Teşekkürler!


Yerine x<-[1..]... !!n-1yapabileceğiniz x<-[0..]... !!n.
Lynn

Ve sonra elbette f n=[...]!!nolabilir f=([...]!!).
Lynn

Bunu ortadan kaldırarak tek bir işleve indirdim a:f=([x|x<-[0..],all((<2).abs)$zipWith(-)=<<tail$[mod(1+fromEnum c)10|c<-show x]]!!)
Lynn

@ Mauris: vay, teşekkür ederim! aBiz olmadan da eleyebiliriz f.
nimi

2

Dart, 92 bayt

f(n,[x=0]){t(x)=>x>9?((x+9)%10-((x~/=10)+9)%10).abs()>1||t(x):--n>0;while(t(++x));return x;}

Çizgi çubuklarıyla:

f(n,[x=0]){
  t(x)=>x>9?((x+9)%10-((x~/=10)+9)%10).abs()>1||t(x):--n>0;
  while(t(++x));  
  return x;
}

DartPad'da görün / çalıştırın


1

Toplu İş - 520 Bayt

Titreme.

@echo off&setLocal enableDelayedExpansion&set a=0&set b=0
:a
set/ab+=1&set l=0&set c=%b%
:b
if defined c set/Al+=1&set "c=%c:~1%"&goto b
set/am=l-2&set f=0&for /l %%a in (0,1,%m%)do (
set x=!b:~%%a,1!&set/an=%%a+1&for %%b in (!n!)do set y=!b:~%%b,1!
set z=0&set/ad=x-1&set/ae=x+1&if !e!==10 set e=0
if !d!==-1 set d=9
if !y!==!d! set z=1
if !y!==!e! set z=1
if !y!==!x! set z=1
if !y!==0 if !x!==1 set z=0
if !y!==1 if !x!==0 set z=0
if !z!==0 set f=1)
if !f!==0 set/aa+=1
if %a% NEQ %1 goto :a
echo %b%

1

Bash + coreutils, 120 bayt

seq $1$1|tr 1-90 0-9|sed 's#.#-&)%B)/3)||(((C+&#g;s/^/(0*((/;s/$/))*0)/'|bc|nl -nln|sed '/1$/d;s/   0//'|sed -n "$1{p;q}"

Bazı test durumları:

$ for i in 1 10 11 99 100 200; do ./kfn.sh $i; done
1     
11    
12    
889   
890   
5433  
$ 

0

JavaScript ES6, 126 bayt

f=n=>{b=s=>[...++s+''].every((e,i,a,p=(+a[i-1]+9)%10)=>i?p==(e=+e?e-1:9)|p-e==1|e-p==1:1)?s:b(s)
for(p=0;n--;)p=b(p)
return p}

Ungolfed kod ve aşağıdaki testler. Bu kesinlikle daha da geliştirilebilirdi.

f=function(n){
  b=function(s){
    return (s+'').split('').every(function(e,i,a){
      e=+e?e-1:9
      p=i?(+a[i-1]+9)%10:e
      return p==e|p-e==1|e-p==1
    })?s:b(s+1)
  }
  for(p=i=0;i<n;i++){
    p=b(p+1)
  }
  return p
}

var input = document.getElementById('n'), results = [];
input.onchange = function(){
  document.getElementById('s').innerHTML = f(input.value)
}
for(var i=0;i<200;i++){
  results.push(i + ':&nbsp;' + f(i))
}
document.getElementById('r').innerHTML=results.join('<br />')
N = <input type="number" id="n" min="1" value="191" /><br />
KBD(N) = <samp id="s">4544</samp>
<div id="r"></div>


0

Kobra - 135

Bunu bir süredir yapmadım, ama işte:

def f(n,i=0)
    while n,if all for x in (s='[i+=1]').length-1get s[x+1]in' 1234567890'[(int.parse(s[x:x+1])+9)%10:][:3],n-=1
    print i

Ungolfed:

def fn(n as int)
    i = 0
    while n <> 0
        i += 1
        s = i.toString
        l = s.length - 1
        v = true
        for x in l
            k = (int.parse(s[x].toString) + 9) % 10
            if s[x + 1] not in ' 1234567890'[k : k + 3], v = false
        if v, n -= 1
    print i


0

Pyth, 19 bayt

e.f.AgL1.aM.+|RTjZT

Burada dene.

Not: Kullanımlar bu zorluktan daha yeni bir işlem yapar, bu nedenle isaacg'ın cevabının bahanesi olarak görülmemelidir. Bu yine de rekabet ediyor.

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.