Über eine Tastatur gehen


21

Wenn Sie ein Wort (oder eine beliebige Folge von Buchstaben) als Eingabe eingeben, müssen Sie zwischen den einzelnen Buchstaben interpolieren, sodass jedes benachbarte Buchstabenpaar im Ergebnis auch auf einer QWERTZ-Tastatur benachbart ist, als ob Sie die Eingabe über eine riesige Tastatur getippt hätten. Zum Beispiel : ' ja ' werden könnten ' y tr es ', ' Katze ' könnte 'geworden c xz a wer t '.

Regeln:

  • Dies ist das Tastaturformat, das Sie verwenden sollten:

    qwertyuiop
    asdfghjkl
      zxcvbnm

    Jedes Tastenpaar, das sich in diesem Layout berührt, wird als benachbart betrachtet. Zum Beispiel stehen 's' und 'e' nebeneinander, 's' und 'r' dagegen nicht.

  • Das eingegebene "Wort" besteht aus einer beliebigen Folge von Buchstaben. Es enthält nur Buchstaben, so dass Sie sich nicht mit Sonderzeichen befassen müssen.
  • Die Eingabe kann in beliebiger Form erfolgen: stdin, eine Zeichenfolge, eine Liste usw. Die Groß- und Kleinschreibung spielt keine Rolle. Sie können nehmen, was bequemer ist.
  • Die Ausgabe kann in jeder beliebigen Form erfolgen: stdout, eine Zeichenfolge, eine Liste usw. Die Groß- und Kleinschreibung spielt keine Rolle und muss nicht konsistent sein.
  • Alle Pfade über die Tastatur sind gültig, mit der Ausnahme, dass Sie den vorherigen Buchstaben nicht erneut überqueren können, bevor Sie zum nächsten Buchstaben gelangen. Zum Beispiel könnte ' hi ' zu ' h j i ' oder ' h jnbgyu i ' werden, aber nicht zu ' h b h u i '.
  • Ein Buchstabe grenzt nicht an sich selbst an, daher kann " Umfrage " nicht zu " Umfrage " werden. Stattdessen müsste es so etwas wie " pol k l " werden.
  • Vor oder nach dem Wort sind keine Ausgabebuchstaben zulässig. Zum Beispiel kann ' was ' nicht 'tre was ' oder ' was dfg' werden.

Dies ist Codegolf, die kürzeste Antwort in Bytes gewinnt.


Wir geben also einen gültigen 'Walk'-Wert pro Eingabe aus? Dies scheint besser zu sein, wenn man zwei Eingaben vornimmt und feststellt, ob es sich um einen gültigen Spaziergang handelt.
Veskah

Es scheint, als dewqwertysei dies ein gültiger Pfad für dy. Könnten Sie das bestätigen?
Arnauld

@ Arnauld ja, das ist es.
Vaelus

@Veskah Das stimmt; Gibt einen gültigen Lauf für eine Eingabe aus. Dies soll Optimierungen ermöglichen, die möglicherweise nicht möglich sind, wenn es zum Beispiel ein kürzester Weg sein muss.
Vaelus

Antworten:


6

Japt -g , 23 Bytes

;D·ÎÔ+D·Årí)pUl)fUq".*?

Probieren Sie es online!

Nimmt die Eingabe als Array von Großbuchstaben. Ansonsten sehr ähnlich zu den anderen Antworten.

Erläuterung:

;                          :Set D to the keyboard layout
 D·Î                       :Get the first row of keys
    Ô                      :Reversed
     +                     :Concat
      D·Å                  :The other two rows
         rí)               :Interleaved
            p              :Repeat that string
             Ul)           : A number of times equal to the length of the input
                f          :Get the substrings that match
                 U         : The input
                  q".*?    : joined with ".*?"
                           :Implicitly output just once of the matches

14

Python 2 , 83 Bytes

lambda s:re.findall('.*?'.join(s),'qwertyuioplkmnjhbvgfcxdsza'*len(s))[0]
import re

Probieren Sie es online!

Geht die gesamte Tastatur durch, bis das Wort geschrieben ist.


2
Wie kommt das import renach dem Code, nicht vorher?
BruceWayne

@BruceWayne Der Wert wird re.findallausgewertet, wenn das Lambda ausgeführt wird. Daher ist das Importieren nach der Lambda-Definition in Ordnung. Abgesehen davon ist es klarer, vorher zu importieren, es gibt einfach keine Notwendigkeit
Puschkin

@pushkin ah, ich wusste nicht, dass danke für die Klärung! Haben Sie nach nur einer persönlichen Präferenz / Auswahl importiert oder hilft es überhaupt bei der Byte-Zählung?
BruceWayne

2
@BruceWayne Es ist eine Art Konvention für dieses Forum. Es ist nur so, dass es mit der Art und Weise funktioniert, wie die TiO-Site den Code organisiert. Klicken Sie auf "Online testen". Link, um zu sehen, was ich meine.
mypetlion

8

Python 2 , 274 Bytes (optimale Lösung)

296 300 302 308 315 319 324 327 328 430 432 Bytes

-4 Bytes dank mypetlion

from networkx import*
i=input()
M,z='qwertyuiop  asdfghjkl   zxcvbnm'.center(55),i[:1]
G=from_edgelist([(M[e],M[e+h])for h in[-1,1,11,12,-11,-12]for e in range(44)if' '!=M[e]and' '!=M[e+h]])
for y,x in zip(i,i[1:]):z+=[shortest_path(G,y,x)[1:],list(G[y])[0]+y][x==y]
print z

Probieren Sie es online!

Diese Lösung bietet die kürzestmögliche Ausgabe. Die Tastatur wird in ein Diagramm umgewandelt, mit dem der kürzeste Pfad zur Berechnung der Ausgabezeichenfolge ermittelt wird:

puzzles     --> poiuhbvcxzazxcvbhjklkiuytres
programming --> poiuytrtyuioijhgtresasdcvbnmkmkijnbg
code        --> cvbhjioijhgfde
golf        --> ghjiolkjhgf
yes         --> ytres
hi          --> hji
poll        --> polpl


1
@mypetlion u machte eine wichtige Reduzierung, können Sie die Antwort aktualisieren :)
mdahmoune


3

05AB1E , 43 Bytes

ü)Jε©žVćRs`.ιJ«D«Œʒg≠yн®нQyθ®θQ**}yªн¨}JIθ«

Nicht die richtige Sprache für diese Herausforderung, da Regex nicht wie die anderen Antworten verwendet werden kann.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

ü)               # Split the input into overlapping pairs
                 #  i.e. "poll" → ["p","o"],["o","l"],["l","l"]]
  J              # Join each inner list together
                 #  i.e. ["p","o"],["o","l"],["l","l"]] → ["po","ol","ll"]
   ε             # Map each to:
    ©            #  Store the current value in the register
    žV           #  Push ["qwertyuiop","asdfghjkl","zxcvbnm"]
    ćR           #  Extract the head, and reverse it
                 #   i.e. ["qwertyuiop","asdfghjkl","zxcvbnm"] → "poiuytrewq"
    s`           #  Swap to take the remainder, and push them to the stack
               #  And then interweave them with each other
                 #   i.e. ["asdfghjkl","zxcvbnm"]
                 #    → ["a","z","s","x","d","c","f","v","g","b","h","n","j","m","k","l"]
        J        #  Join the list to a single string
                 #   i.e. → "azsxdcfvgbhnjmkl"
         «       #  Merge them together
                 #   i.e. "qwertyuiop" and "azsxdcfvgbhnjmkl"
                 #    → "poiuytrewqazsxdcfvgbhnjmkl"
          D«     #  Duplicate it, and append it to itself
                 #   i.e. "poiuytrewqazsxdcfvgbhnjmkl"
                 #    → "poiuytrewqazsxdcfvgbhnjmklpoiuytrewqazsxdcfvgbhnjmkl"
            Π   #  Get all substrings of this strings
                 #   i.e. → ["p","po","poi",...,"k","kl","l"]
ʒ              } #  Filter this list by:
 g              #   Where the length is NOT 1 (otherwise pair "ll" would result in "l")
              *  #   and
   yн®нQ         #   Where the first character of the substring and pair are the same
             *   #   and
        yθ®θQ    #   Where the last character of the substring and pair are the same
                 #    i.e. "po" → []
                 #    i.e. "ll" → ["lazsxdcfvgbhnjmkl"]
yª               #  After filtering, append the current pair to the filtered list
                 #   i.e. [] → ["po"]
                 #   i.e. ["lazsxdcfvgbhnjmkl"] → ["lazsxdcfvgbhnjmkl","ll"]
  н              #  Get the first item
                 #   ["po"] → "po"
                 #   ["lazsxdcfvgbhnjmkl","ll"] → "lazsxdcfvgbhnjmkl"
   ¨             #  Remove the last character
                 #   i.e. "po" → "p"
                 #   i.e. "lazsxdcfvgbhnjmkl" → "lazsxdcfvgbhnjmk"
}                # Close the map
 J               # Join everything together
                 #  i.e. ["p","o","lazsxdcfvgbhnjmk"] → "polazsxdcfvgbhnjmk"
  Iθ«            # And append the last character of the input
                 # (and output the result implicitly)
                 #  i.e. "polazsxdcfvgbhnjmk" and "poll" → "polazsxdcfvgbhnjmkl"

3

Kohle , 48 Bytes

≔”&⌈″⌊5EWXVNa…-εW¶ζR”η≔⌕η§θ⁰ζFθF⊕﹪⁻⌕ηιζ²⁶«§ηζ≦⊕ζ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

≔”&⌈″⌊5EWXVNa…-εW¶ζR”η

Hol den String qwertyuioplkmjnhbgvfcdxsza.

≔⌕η§θ⁰ζ

Suchen Sie die Position des ersten Zeichens des Wortes. Dieser Index ist normalerweise eins nach dem gerade erreichten Zeichen, aber dieser Wert fälscht die erste Iteration der Schleife aus, um das erste Zeichen des Wortes zu drucken.

Fθ

Schleife über jedes Zeichen.

F⊕﹪⁻⌕ηιζ²⁶«

Berechnen Sie, wie viele Zeichen gedruckt werden sollen, um das nächste Zeichen des Wortes und die Schleife so oft einzuschließen.

§ηζ≦⊕ζ

Drucken Sie das nächste Zeichen zyklisch und erhöhen Sie den Index.


Haben Sie versucht, die Zeichenfolge "qwertyuioplkmjnhbgvfcdxsza" zu drehen und festzustellen, ob eine der Drehungen komprimierbarer ist? Ich kenne mich nicht mit der Kompression von Holzkohle aus. Vielleicht ist das nicht möglich.
Vaelus

@Vaelus Ich weiß es auch nicht, also habe ich alle 26 Umdrehungen ausprobiert, aber alle auf 20 Bytes komprimiert. Natürlich sind das nicht alle möglichen Spaziergänge ...
Neil
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.