Craptastic Program Search

8

Ein bestimmtes bekanntes Kabelunternehmen verfügt über eine etwas ungeschickte Funktion zum Suchen nach Programmen, die über die Fernbedienung funktioniert. Es dauert sehr viel Knopfdruck; Als Bewunderer der Bewegungsökonomie dachte ich, ich würde die Hilfe eines Programmierers suchen, um die Anzahl der Fingerbewegungen, die ich machen muss, zu minimieren.

Die Craptastic Search-Funktion bietet ein Layout aus auswählbaren Zellen, 1 Zeile mit 3 Zellen, gefolgt von 6 Zeilen mit 6 Zellen, das folgendermaßen aussieht:

del spa sav
A B C D E F
G H I J K L
M N O P Q R
S T U V W X
Y Z 0 1 2 3
4 5 6 7 8 9

Für jeden Buchstaben gibt es Zellen A-Z, mit spadenen der Suchzeichenfolge ein Leerzeichen hinzugefügt wird. delsoll verwendet werden, um ein Zeichen zu löschen; und savsoll zum Speichern der Suchzeichenfolge verwendet werden. Wir werden diese tatsächlichen Funktionen für diese Herausforderung ignorieren. Ansonsten sind die Zellen für unsere Zwecke noch auswählbar.

Wir beginnen mit einer leeren Suchzeichenfolge und der Aausgewählten Zelle. und wir verwenden die Pfeiltasten nach links, rechts, oben und unten, um die ausgewählte Zelle zu ändern. Wenn die zentrale OK-Taste gedrückt wird, wird das Zeichen in der ausgewählten Zelle zur Suchzeichenfolge hinzugefügt. Der Einfachheit halber werden wir verwenden <, >, ^, vund _für links, rechts, oben, unten und OK sind.

Bei den Buchstaben und Zahlen ist die Bedienung der Richtungstasten unkompliziert. Es gibt kein "Wrap-Around"; Wenn sich beispielsweise die aktuelle Zelle befindet G, <hat dies keine Auswirkung.

Um die Suchzeichenfolge einzugeben BIG, könnten wir die Sequenz verwenden

>_>v_<<_

(Die Initiale >ist erforderlich, um uns von der Standardstartzelle Ain die Zelle zu verschieben. B) Alternativ könnten wir natürlich stattdessen verwenden >_v>_<<_; Beachten Sie jedoch, dass es keine kürzere Sequenz als 8 Tasten gibt, die die Aufgabe ausführen können.

Da die oberste Reihe nur drei Zellen hat, ist die Aktion dort etwas anders und kompliziert die Dinge ein wenig:

Befindet sich die ausgewählte Zelle in der obersten Buchstabenzeile A-F, ^bewegt der Schlüssel die ausgewählte Zelle direkt darüber. Also A,Bgeh zu del, C,Dgeh zu spaund E,Fgeh zu sav.

Wenn andererseits die ausgewählte Zelle 'del' ist, verschiebt der vSchlüssel die ausgewählte Zelle in Aund der >Schlüssel macht die ausgewählte Zelle spa. In ähnlicher Weise vverschiebt die Taste die ausgewählte Zelle von spanach Cund savnach E.

Dies bedeutet , dass zum Beispiel, wenn Sie sich gerade an dem sind BZelle, die Sequenz ^vzurückkehrt Sie nicht auf die BZelle; Stattdessen gelangen Sie in die AZelle.

Und beginnend bei der AZelle v>>^bewegt uns die Sequenz zur CZelle; während die Sequenz ^>>vuns in die EZelle bewegt .

Die Herausforderung

Bei einer TV - Sendung oder einen Film Titel s, die ausschließlich aus Zeichen A-Z, 0-9und spaceIhr Programm / Funktion sollte eine Ausgabe einen der Sequenzen von Tastenfolgen minimaler Länge geben sals Suchbegriff aus dem Ausgangszustand in Craptastic Art und Weise.

Ihre Ausgabe sollte eine Zeichenfolge oder eine Liste unterschiedlicher Werte sein, die eine Folge von Auf, Ab, Rechts, Links und OK darstellen. Sie sind also nicht auf den Zeichensatz beschränkt <>^v_(z. B. udrl*oder eine Liste mit ganzzahligen Elementen 0,1,2,3,4 wären akzeptable Alternativen, solange Sie Ihr Schema formulieren).

Das ist ; Es gelten die üblichen Lücken-Tabus. Mögen die Chancen für jede Sprache jemals zu Ihren Gunsten sein.

Testfälle

Nachfolgend finden Sie Eingaben und eine akzeptable Beispielantwort (andere unterschiedliche Sequenzen sind ebenfalls korrekt, müssen jedoch höchstens die Länge der bereitgestellten Beispiele haben).

(Ich poste die Tastatur hier erneut, damit man leichter visuell mitspielen kann, wenn man das nicht will ...)

del spa sav
A B C D E F
G H I J K L
M N O P Q R
S T U V W X
Y Z 0 1 2 3
4 5 6 7 8 9

BIG         >_>v_<<_
THE OFFICE  >vvv_^^_>>>^_^<_vvv_>>>^^__<<<v_^_>>_
FARGO       ^>>v>_^<<v_^>>v>vv_<<<<<^_>>v_
BUFFY       >_>vvv_>>>^^^__^<<vvvvv_
DALLAS      >>>_<<<_^>>v>v__^^<<v_vvv_
THX1138     >vvv_^^_>>>>vv_<<v__>>_<v_
ON DEMAND   >>vv_<_^^^>_v>_>_<<<<vv_^^_>vv_>>^^_
NEWS RADIO  >vv_>>>^^_vvv_<<<<_^^^^>_>vvv>_^^^<<v_>>>_<v_v_
ROOM 909    ^>>v>vv_<<<__<<_^^^>_>vvvvvv>_<<<^_>>>v_
Chas Brown
quelle
2
Nur FAgeht nicht geradeaus, sondern rauf und runter
l4m2
1
Ist delund savnutzlos hier?
14 m2
Eng verwandt .
FryAmTheEggman
@ l4m2: delund savhaben keine Funktion, wenn 'OK' verwendet wird, wenn sie ausgewählt werden; aber das würde einen Tastendruck verschwenden.
Chas Brown
2
@ 14m2 LA, RA, XA, 3A, 9A machen dasselbe
tsh

Antworten:

4

JavaScript (ES6), 196 Byte

Das Golfen dieses Codes unter 200 Bytes war im Grunde ein Albtraum (aber es hat Spaß gemacht). Ich freue mich sehr auf eine einfachere und kürzere Implementierung.

f=(s,p=(i=0,6),x=(p-=p&(p<6))%6,X=(P=(parseInt(c=s[i],36)+26)%36+6||2)%6)=>c?'^<>v_'[(d=p-P?p<6?x<(X&6)?40:X-1&&x^X&6?20:60:P<6+(x>4)|p==11&!X?0:x<X?39:x>X?21:p<P&&60:++i&&70)>>4]+f(s,p+d%16-6):''

Probieren Sie es online aus!

Wie?

Variablen

  • s ist die Eingabezeichenfolge
  • i ist ein Zeiger in s , der auf 0 initialisiert ist
  • c ist der nächste Zielcharakter (auch bekannt als s [i] )
  • p ist die aktuelle Position auf der Tastatur gemäß der folgenden Zuordnung und wird auf 6 initialisiert (die Taste "A" ).

    del spa sav      00 -- 02 -- 04 --
    A B C D E F      06 07 08 09 10 11
    G H I J K L      12 13 14 15 16 17
    M N O P Q R  ->  18 19 20 21 22 23
    S T U V W X      24 25 26 27 28 29
    Y Z 0 1 2 3      30 31 32 33 34 35
    4 5 6 7 8 9      36 37 38 39 40 41
    
  • P ist die Position des Zielzeichens c

  • x ist die Spalte des aktuellen Zeichens ( p% 6 )
  • X ist die Spalte des Zielzeichens ( P% 6 )

Codierung verschieben

Es gibt 7 mögliche Züge. Wir codieren jede von ihnen als 7-Bit-Ganzzahl. Die 4 niedrigstwertigen Bits halten den Verschiebungswert V + 6 und die 3 höchstwertigen Bits halten das Symbol ID S .

move                       | symbol | S |  V | V + 6 | S << 4 | (V + 6)
---------------------------+--------+---+----+-------+-----------------
one position to the left   |   <    | 1 | -1 |   5   |       21
two positions to the left  |   <    | 1 | -2 |   4   |       20
one position to the right  |   >    | 2 |  1 |   7   |       39
two positions to the right |   >    | 2 |  2 |   8   |       40
upwards                    |   ^    | 0 | -6 |   0   |        0
downwards                  |   v    | 3 |  6 |  12   |       60
don't move (press the key) |   _    | 4 |  0 |   6   |       70

Ausrichtung mit Funktionstasten

Zu Beginn jeder Iteration führen wir den folgenden Code aus, um sicherzustellen, dass p mit der aktuellen Funktionstaste ausgerichtet ist, wenn wir uns in der ersten Zeile befinden:

p -= p & (p < 6)

Logik verschieben

Der Zug wird mit einer (zu) langen Kette ternärer Operatoren ausgewählt, die unten beschrieben wird.

p - P ?               // if we're not yet located over the target character:
  p < 6 ?             //   if we're currently located in the first row:
    x < (X & 6) ?     //     if x is less than the column of the function key holding the target character:
      40              //       move 2 positions to the right
    :                 //     else:
      X - 1 &&        //       if the target character is not located in the 2nd column
      x ^ X & 6 ?     //       and x is not equal to the column of the function key holding the target character:
        20            //         move two positions to the left
      :               //       else:
        60            //         move downwards
  :                   //   else:
    P < 6             //     if the target key is space (P is either greater than 5 or equal to 2)
          + (x > 4) | //     or the target key is A and we're currently in the rightmost column
    p == 11 & !X ?    //     or we're currently over F and the target key is in the leftmost column:
      0               //       move upwards
    :                 //     else, this is a standard move:
      x < X ?         //       if x is less than X:
        39            //         move one position to the right
      :               //       else:
        x > X ?       //         if x is greater than X:
          21          //           move one position to the left
        :             //         else:
          p < P && 60 //           move either upwards or downwards
:                     // else:
  ++i && 70           //   don't move and advance the pointer in s
Arnauld
quelle
3

Python 2 , 294 293 289 Bytes

r='';l=[(ord(c)-59)%43-14*(c<'0')for c in input()]
for a,b in zip([6]+l,l):x,y,X,Y=a%6,a/6,b%6,b/6;A=(a<6)*(X!=1);x=[x,X/2*2][A];r+='< >'[X/2]*A+('^'*y+['<<'+'v'*Y,'> <'[x/2]][b<6]if(b,x)in[(6,5),(2,x)]or(a,X)==(11,0)else('^v'[Y>y]*abs(y-Y)+'<>'[X>x]*abs(x-X)))+'_'
print r.replace(' ','')

Probieren Sie es online aus!

TFeld
quelle
1

JavaScript, 311 Bytes

f=n=>(parseInt(n,36)+26)%36+1||'S'
g=n=>(t=+n)?[t-(t%6!=1),t%6?t+1:t,t>30?t:t+6,t<7?' DDSSVV'[t]:t-6]:{D:'DS1',S:'DV3',V:'SV5'}[n]||[]
h=(p,q,t={[p]:''})=>([...g(p)].map((n,i)=>n in t&&t[n].length<t[p].length+1||h(n,q,t,t[n]=t[p]+'<>v^'[i])),t[q])
F=s=>[...s].map(f).map((c,i,a)=>h(a[i-1]||1,c)+'_').join``
<input id=i oninput=o.value=F(i.value)><br><output id=o>

Ich bin mir nicht sicher, wie ich das Golf spielen soll ...

  • f: Konvertiere 'A-Z0-9' in 1-36, Leerzeichen in "S"
  • g: Holen Sie sich 4 Geschwister des angegebenen Schlüssels
  • h: finde den kürzesten Weg von p nach q
  • F: die Antwort
tsh
quelle