Tippen mit verschlüsselten Schlüsseln

16

Ihr Freund ist nicht so gut mit Computern umgehen zu können, so dass jemand als Scherz die Buchstaben (az) auf seiner Tastatur verschlüsselt. Als er sich hinsetzte und versuchte, seinen Namen über die Tastatur einzugeben, bemerkte er, dass die Buchstaben verschlüsselt waren und bat um Ihre Hilfe.

Sie sind schlau und wissen, dass es ihm irgendwann gelingen wird, seinen Namen einzugeben, wenn er seinen Namen eingibt und dann wiederholt eingibt, was auf dem Bildschirm statt seines Namens erscheint. Sie sind auch nett und ordnen die Schlüssel neu an, möchten aber wissen, wie viele Runden nötig wären, um erfolgreich zu sein.

Deine Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die die Anzahl der Umdrehungen berechnet, wenn die Buchstaben gemischt werden und der Name des Freundes.

Eingabedetails:

  • Zwei Zeichenfolgen werden als Eingabe in einer für Ihre Sprache geeigneten Struktur angegeben.
  • Die erste Zeichenfolge ist die Liste der neuen Kleinbuchstaben in alphabetischer Reihenfolge der alten. (Das erste Zeichen befindet sich an der Position von a, das letzte an der Position von z.) In der Zeichenfolge treten immer einige Änderungen auf.
  • Die zweite Zeichenfolge ist der Name. Es kann jedes druckbare ASCII-Zeichen enthalten, es werden jedoch nur die Groß- und Kleinbuchstaben gemischt, sofern vorhanden. Der Name selbst könnte bei al nicht gemischt werden.

Ausgabedetails:

  • Die Ausgabe ist eine einzelne Ganzzahl, deren Anzahl an Windungen minimal erforderlich ist. Newline ist optional.

Beispiele:

Eingabe: 'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'(d, e, f Positionen geändert)

Ausgabe: 3(Die angezeigten Namen sind: Mr. John Fod=> Mr. John Eof=> Mr. John Doe)

Eingabe: 'nopqrstuvwxyzabcdefghijklm' 'Mr. John Doe'(die ROT13-Chiffre )

Ausgabe: 2(Jeder Eingabename, der Buchstaben enthält, benötigt 2Runden, um den ursprünglichen Namen zu erzeugen.)

Eingang: 'aebcdjfghiqklmnopzrstuvwxy' 'John Doe'

Ausgabe: 140

Dies ist Code-Golf, also gewinnt der kürzeste Eintrag.

randomra
quelle
1
Sie sollten wahrscheinlich diesen Testfall einschließen: aebcdjfghiqklmnopzrstuvwxy(Ausgabe 1260 für Mr John Doe). Dies ist das maximal mögliche - es besteht aus Zyklen der Ordnung 4, 5, 7, 9 (und einem unveränderten a), und jeder Name, der mindestens einen Buchstaben aus jedem Zyklus enthält, ergibt 1260. Und ich nehme das Alphabet selbst als Eingabe oder die Verwendung eines nicht betroffenen Namens sind ebenfalls wichtige Randfälle.
Martin Ender
@ MartinBüttner Hinzugefügt mit Änderung.
Randomra
Ich bin ein bisschen verwirrt darüber, wie Sie mit der Anzahl der Windungen kommen.
FUZxxl am
@FUZxxl Im Allgemeinen können Sie die Permutation in Zyklen zerlegen und dann überprüfen, welche Zyklen Zeichen aus dem Namen enthalten. Das Ergebnis ist die LCM der Länge dieser Zyklen (Zyklen durch Zeichen, die nicht im Namen enthalten sind, sind natürlich irrelevant). Für diese Herausforderung ist dies jedoch nicht unbedingt erforderlich. Führen Sie die Ersetzungen nur durch, bis Sie den ursprünglichen Namen erreicht haben, und zählen Sie, wie oft Sie ersetzen mussten.
Martin Ender
1
Als Randnotiz ist John File Marker aka EOFtotal erstaunlich!
rev

Antworten:

9

Pyth, 16 Bytes

JGfqzuXGJrQ0UTz1

Probieren Sie es hier aus.

Die Eingabe sollte in zwei Zeilen erfolgen: Name und dann Permutation. Die Permutation sollte angegeben werden. Der Name kann in Anführungszeichen oder ohne Anführungszeichen stehen. Beispielsweise:

"John Doe"
"aebcdjfghiqklmnopzrstuvwxy"

Gibt 140.

Erläuterung:

                            Implicit:
                            z = input()              z is the name.
                            Q = eval(input())        Q is the permutation.
                            G = 'abcdefghijklmnopqrstuvwxyz'

JG                          J = G
  f             1           Starting at 1 and counting upwards, find
                            the first case where the following is true:
   qz                       z ==
     u       UTz            reduce, where the accumulator, G, is initialized to z on
      XG                    translate G
        J                   from the normal alphabet, J
         rQ0                to Q.lower().
isaacg
quelle
Die Eingabemethode sollte für die Zeichenfolgen identisch sein.
Randomra
10

CJam, 31 27 25 24 Bytes

l:A;lel:N{_A_$er_N#}g;],

Nimmt Eingaben in Form von:

aebcdjfghiqklmnopzrstuvwxy
Mr. John Doe

dh erste Zeile - Alphabete, zweite Zeile - Name.

Wie es funktioniert :

l:A;lel:N{_A_$er_N#}g;],
l:A;                         "Read the alphabets from the 1st line in A and pop from stack";
    lel:N                    "Read the name in small caps from 2nd line and store in N";
         {         }g        "Run a while loop until we have the original name back again";
          _                  "Put a dummy string on stack just to keep count of times";
           A                 "Put the alphabets on stack";
            _$               "Copy them and sort the copy to get the correct order";
              er             "Transliterate the right keys with the wrong ones";
                _N#          "Copy the result and see if its equal to the original name";
                     ;]      "Pop the last name and wrap everything in an array";
                       ,     "Get the length now. Since we were putting a dummy string";
                             "on stack in each iteration of the while loop, this length";
                             "represents the number of times we tried typing the name";

Probieren Sie es hier online aus

Optimierer
quelle
5

Rubin, 58

->a,n{t=""+n
(1..2e3).find{t.tr!("a-zA-Z",a+a.upcase)==n}}

Erläuterung

  • Die Eingabe wird als Argument für ein Lambda verwendet.
  • Verwenden Sie Enumerable#find(danke @Ventero!) Und String#tr!, um Zeichen zu ersetzen, bis das Ersetzte Stringmit dem tatsächlichen Namen übereinstimmt.
britishtea
quelle
""+nist ein bisschen kürzer als n.dup, und Sie können ein weiteres Byte speichern, indem Sie Enumerable#findanstelle eines expliziten Zählers kreativ verwenden :(1..1e4).find{t.tr!(...)==n}
Ventero
Sie können auch eine Menge Bytes sparen, indem Sie die Eingabe in Kleinbuchstaben
vornehmen
@Optimizer Das scheint mir nichts zu retten, Rubys Methode, in Kleinbuchstaben umzuwandeln, ist ziemlich langwierig (müsste ich verwenden n.downcase!).
britishtea am
Ja, aber dann müssen Sie nicht tun A-Zund+a.upcase
Optimizer
A-Z+a.upcaseund n.downcase!\nhaben die gleiche Länge :)
britishtea
2

CJam, 32 31 Bytes

llel_2e3,{;'{,97>3$er_2$=}#)p];

Teste es hier. Es nimmt die Permutation in der ersten Zeile und den Namen in der zweiten Zeile der Eingabe an.

Erläuterung

llel_2e3,{;'{,97>3$er_2$=}#)p];
ll                              "Read both lines into strings.";
  el_                           "Convert the name to lower-case and duplicate.";
     2e3,                       "Get a range from 0 to 1999 to cover all possible results.";
         {               }#     "Find the first index where the block yields a true result.";
          ;                     "Discard the number, it's just a dummy.";
           '{,97>               "Create a string of the lower-case alphabet.";
                 3$             "Copy the permutation.";
                   er           "Substitute letters in the second copy of the name.";
                     _2$=       "Duplicate and check for equality with original name.";
                           )p   "Increment by 1 and print.";
                             ]; "Clear the stack to prevent extraneous output.";
Martin Ender
quelle
2

Pyth 26

KGJ@GrQZfqJusm@zxKdGUTJ!!J

Probieren Sie es hier online aus.

Es gibt einige unglückliche Konsequenzen, die dieses Programmbyte kosten, wie das Speichern von G in K, um es in der Reduzierung zu verwenden, und das Verwenden von not (nicht (J)), um den Filter zu starten. Aus diesem Grund gehe ich davon aus, dass dies noch gespielt werden kann.

Dies ist ein Programm, das Eingaben wie folgt entgegennimmt:

aebcdjfghiqklmnopzrstuvwxy
'John Doe'

(Beachten Sie das Fehlen von Anführungszeichen im ersten Argument)

Erklärung nach lähmender Erschöpfung zu kommen;)

FryAmTheEggman
quelle
Sollte ich meinen vorherigen Kommentar wiederholen
Optimizer
@Optimizer: PI verlor das letzte;)
FryAmTheEggman
Sie sagten? ;)
Optimierer
1

Haskell 131 Bytes

import Data.Char
h n=(!!((ord n)-97))
g s n m|n==m=1|0<1=1+g s(h n s)m
f s=foldr1 lcm.map((\x->g s(h x s)x).toLower).filter isAlpha

Rufen Sie fmit der Permutationszeichenfolge und dem Namen auf, um das Ergebnis zu erhalten

Erläuterung

-- h finds the mapping of a character given the permutation
h :: Char   -> -- Character to map
     String -> -- Character permutation
     Char      -- Mapped character

-- g finds the number of character mappings required to reach a given character
-- by calling h on the given character every time it calls itself.
g :: String -> -- The character permutation
     Char   -> -- The current character
     Char   -> -- The character to find
     Int       -- The number of mapped to find the character

-- f finds the number of mappings required to return the given string back to itself
-- by finding the lowest common multiple of the period of all the characters in the
-- given string
g :: String -> -- The permutation string
     String -> -- The string to get back
     Int       -- The final answer
Jmac
quelle
1

GolfScript (33 Bytes)

~{32|}%\:A&{.{A$?A=}%.-1$=!}do],(

Nimmt die Eingabe als zwei (einfach oder doppelt) zitierte Zeichenfolgen, die durch Leerzeichen voneinander getrennt sind. z.B

'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'

Online-Demo

Präparation

~           # Eval. Stack: perm name
{32|}%      # Lower-case name (also affects non-alphabetic characters but...)
\:A&        # Store perm in A and filter name to alphabetic characters, giving str_0
{           # do-while loop. Stack: str_0 str_1 ... str_i
  .         #   Duplicate str_i
  {A$?A=}%  #   tr 'a-z' perm   giving str_{i+1}
  .-1$=!    #   Loop while str_{i+1} != str_0
}do         # end do-while loop
],(         # Gather the sequence of permuted strings in an array and take its length - 1
            # to account for containing str_0 twice

Die Transliteration beruht auf der Tatsache, dass alle Zeichen betroffen sind ( {'ABC'?'abc'=}%wobei die sortierte Zeichenfolge A$ersetzt 'ABC'und die Permutation Aersetzt wird 'abc'). Die allgemeineren Alternativen sparen nicht genug, weil der Filter für alphabetische Zeichen so billig ist.

Dies setzt auch -1$den Zugriff auf den Boden des Stapels voraus, was ein relativ seltener GS-Trick ist.

Peter Taylor
quelle