Generieren Sie tastaturfreundliche Nummern

29

Die meisten gängigen Computer- Tastaturlayouts haben Dezimalstellen

1234567890

oben über den Buchstabenschlüsseln entlang rennen.

Lassen Sie die Nachbarschaft einer Dezimalziffer sei die Menge von Ziffern aus ihrer eigenen Zifferntaste und aus den Zifferntasten unmittelbar nach links und rechts, falls vorhanden.

Zum Beispiel ist die Nachbarschaft von 0 {0, 9} und die Nachbarschaft von 5 {4, 5, 6}.

Definieren Sie nun eine tastaturfreundliche Nummer als positive Ganzzahl (in Dezimalform ohne führende Nullen), die im obigen Layout so eingegeben werden kann, dass jede aufeinanderfolgende Ziffer in der Zahl nach der ersten Ziffer in der Nachbarschaft der vorhergehenden Ziffer liegt.

  • Alle einstelligen Nummern (1-9) sind trivial tastaturfreundlich.

  • Eine Zahl wie 22321 ist tastaturfreundlich, da sich jede Ziffer (ohne die erste) in der Nähe der Ziffer befindet, die gerade zuvor eingegeben wurde.

  • Eine Zahl wie 1245 ist das nicht tastaturfreundlich, da 4 nicht in der Nähe von 2 liegt (oder umgekehrt).

  • Eine Zahl wie 109 ist nicht tastaturfreundlich, da sich 0 nicht in der Nähe von 1 befindet. Die Enden werden nicht durchgeschleift.

Indem wir die tastaturfreundlichen Zahlen von klein nach groß ordnen, können wir eine ganzzahlige Folge erstellen .

Hier sind die ersten 200 Begriffe der tastaturfreundlichen Zahlenfolge:

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

Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die eine positive Ganzzahl N (über stdin / command line / function arg) verwendet und (nach stdout) ausgibt oder den N-ten Ausdruck in der tastaturfreundlichen Zahlenfolge zurückgibt.

Wenn der Eingang beispielsweise ist 191, sollte der Ausgang sein 4544.

Die Ausgabe kann optional eine einzelne nachgestellte Newline enthalten.

Die kürzeste Übermittlung in Bytes gewinnt.

Calvins Hobbys
quelle
7
Zufällige Tatsache: OEIS hat eine verwandte Sequenz für Numpads
Sp3000
Vielen Dank, @ Sp3000. Ich bin hierher gescrollt und habe mich genau das gefragt.
luser droog

Antworten:

8

Pyth, 27 24 Bytes

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

Demonstration.

Verbesserungen am Original:

  • Verwenden Sie metdanstelle von .r ... _UJ: 2 weniger Bytes. 1 direkt, 1 für das Nichtgebrauchen von J.

  • Verwenden von sund `Tanstelle von JT10: 1 Byte weniger.


Wir beginnen mit der Zeichenfolgendarstellung einer Zahl: `T .

Dann konvertieren wir die Zeichenfolge in eine Liste von Ziffern und drehen die Ziffern um eins zurück (9876543210) mit metsd. Dann nehmen wir die 2 Elementteilfolgen mit .: ... 2. Diese Teilfolgen werden nach gefiltert /h-FY3. Dieser Ausdruck entspricht ((a-b)+1)/3, der genau dann Null ist, wenn die Differenz zwischen aund bhöchstens 1 beträgt. Daher ist die gefilterte Liste nur dann leer, wenn die Zahl tastaturfreundlich ist. Mit! ist das Ergebnis nur dann wahr, wenn die Nummer tastaturfreundlich ist.

f ... hGFilter aufwärts von G+1bis das Ergebnis wahr ist, wobei die erste tastaturfreundliche Zahl bei G+1oder darüber angegeben wird. u ... Q0Wendet diese Funktion auf die eigenen Ausgabezeiten Qan, beginnend mit 0, wobei Qder Eingang ist. Dies gibt die Qgewünschte Tastatur-freundliche Nummer an.

isaacg
quelle
4

Python 3, 112 102 Bytes

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

Wir verfolgen die Anzahl der noch zu findenden nund zuletzt eingecheckten befreundeten Nummern k.

5 und 5 Bytes gespart dank @isaacg und @ Sp3000.

randomra
quelle
Verwenden Sie einen Lamba-Ausdruck anstelle einer def-Rückgabe. Lambas erlauben Standardeinstellungen.
isaacg
@isaacg Danke, ich wusste nicht, wie ich mit Lambda umgehen soll.
Randomra
Ah richtig. Unary Ops stehen an erster Stelle. Mein Fehler.
mbomb007
Sie können die [:-1]in derzip
Sp3000
4

CJam, 29 28 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Dennis
quelle
Gibt es einen einfachen Beweis, dass die Obergrenze der N-ten befreundeten Zahl N ** 2 ist
Optimierer
Habe noch keinen gefunden. Der Beweis dafür N ** 4ist ziemlich einfach, da es mindestens 2 ** kKFN unten gibt 10 ** k < 16 ** k. Das Ersetzen _*durch 4#würde die Bytezahl nicht ändern, aber den Code fürchterlich ineffizient machen.
Dennis
Ist Ihr Code dann für eine große eingegebene Nummer nicht falsch?
Optimierer
1
Hoffentlich nicht. Aber ich werde es ändern, bis ich es weiß. murrt
Dennis
3

CJam, 34 31 Bytes

3 Bytes gespeichert von Dennis.

I'm sure the gap to Pyth can be closed somehow, but I don't have time right now to golf this further...

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

Test it here.

Martin Ender
quelle
You can replace )_++ with :_ to save 2 chars and -z1> with m2/ to save another.
Dennis
@Dennis Oh, those are nice, thank you!
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 : execute snippet in Firefox

edc65
quelle
I don't know much JS, but couldn't you do something like abs(p-d)>1 rather than p-d>1|p-d<-1?
Alex A.
@AlexA. The expressions in expanded and golfed are equivalent. Math.abs(p-d)>1 is longer than p-d>1|p-d<-1
edc65
Ah, okay. I knew they were equivalent, I just didn't know that you needed the Math. prefix.
Alex A.
2

Haskell, 90 80 bytes

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

This is a function without a name. To use it, call it with a parameter, e.g.:([x|x<-[0..],all((<2).abs)$zipWith(-)=<<tail$[mod(1+fromEnum c)10|c<-show x]]!!) 199 which returns 5432.

How it works:

[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)

Edit: @Mauris found some bytes to save. Thanks!

nimi
quelle
Instead of x<-[1..] ... !!n-1, you can do x<-[0..] ... !!n.
Lynn
And then of course f n=[...]!!n can be f=([...]!!).
Lynn
I got it down to a single function, eliminating a: f=([x|x<-[0..],all((<2).abs)$zipWith(-)=<<tail$[mod(1+fromEnum c)10|c<-show x]]!!)
Lynn
@Mauris: wow, thank you! Without a we can eliminate f, too.
nimi
2

Dart, 92 bytes

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

With linebreaks:

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

See/run it on DartPad

lrn
quelle
1

Batch - 520 Bytes

Schaudern.

@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%
unclemeat
quelle
1

Bash + Coreutils, 120 Bytes

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

Einige Testfälle:

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

JavaScript ES6, 126 Bytes

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 Code und Tests unten. Dies könnte sicherlich noch verbessert werden.

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>

NinjaBearMonkey
quelle
0

Cobra - 135

Habe das schon eine Weile nicht mehr gemacht, aber hier ist es:

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
Οurous
quelle
0

Pyth, 19 bytes

e.f.AgL1.aM.+|RTjZT

Try it here.

Note: Uses commit newer than this challenge, so shouldn't be considered as an outgolf of isaacg's answer. This is still competing, though.

Erik the Outgolfer
quelle