Pisanie na klawiaturze

16

Twój przyjaciel nie jest zbyt dobry w korzystaniu z komputerów, więc praktycznym żartem ktoś wymieszał litery (az) na klawiaturze. Kiedy usiadł i próbował wpisać swoje imię, patrząc na klawiaturę, zdał sobie sprawę, że litery są zakodowane i poprosił o pomoc.

Jesteś sprytny, więc wiesz, że jeśli wpisze swoje imię, a następnie wielokrotnie przepisuje to, co pojawia się na ekranie zamiast swojego imienia, w końcu uda mu się wprowadzić jego imię. Jesteś także uprzejmy i przestawiasz klucze, ale chcesz wiedzieć, ile tur potrzeba, by odnieść sukces.

Twoim zadaniem jest napisanie programu lub funkcji, która tasuje litery, a imię znajomego oblicza liczbę zwojów.

Dane wejściowe:

  • Dwa ciągi podano jako dane wejściowe w strukturze dogodnej dla twojego języka.
  • Pierwszy ciąg to lista nowych małych liter w kolejności alfabetycznej starych. (Pierwszy znak to ten, który jest w pozycji a, ostatni jest w pozycji z.) Pewna zmiana zawsze nastąpi w ciągu.
  • Drugi ciąg to nazwa. Może zawierać dowolny znak ascii do wydrukowania, ale tylko wielkie i małe litery alfabetu będą tasowane, jeśli występują. Sama nazwa może nie zostać przetasowana przy al.

Dane wyjściowe:

  • Wyjście to jedna liczba całkowita, minimalnie wymagana liczba zwojów. Newline jest opcjonalny.

Przykłady:

Dane wejściowe: 'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'(zmieniono pozycje d, e, f)

Dane wyjściowe: 3(Pokazane nazwy to: Mr. John Fod=> Mr. John Eof=> Mr. John Doe)

Wejście: 'nopqrstuvwxyzabcdefghijklm' 'Mr. John Doe'( szyfr ROT13 )

Dane wyjściowe: 2(Każda nazwa wejściowa zawierająca litery zajmie 2rundy, aby uzyskać oryginalną nazwę).

Wejście: 'aebcdjfghiqklmnopzrstuvwxy' 'John Doe'

Wynik: 140

To jest golf golfowy, więc wygrywa najkrótszy wpis.

randomra
źródło
1
Prawdopodobnie powinieneś dołączyć ten przypadek testowy: aebcdjfghiqklmnopzrstuvwxy(wyjście 1260 dla Mr John Doe). Jest to maksimum możliwe - składa się z cykli rzędu 4, 5, 7, 9 (i niezmienionych a), a każda nazwa zawierająca co najmniej jedną literę z każdego cyklu da 1260. I wydaje mi się, że biorąc sam alfabet jako dane wejściowe lub używanie niezmienionej nazwy są również ważnymi przypadkami krawędzi.
Martin Ender
@ MartinBüttner Dodano z modyfikacją.
randomra
Jestem trochę zdezorientowany, jak wymyśliłeś liczbę zwojów.
FUZxxl,
@FUZxxl Ogólnie rzecz biorąc, można rozłożyć permutację na cykle , a następnie sprawdzić, które cykle zawierają znaki z nazwy. Wynikiem jest LCM długości tych cykli (cykle przechodzące przez znaki spoza nazwy są oczywiście nieistotne). Jednak w przypadku tego wyzwania nie jest to naprawdę konieczne ... po prostu wykonuj zamiany, aż trafisz oryginalną nazwę i policz, jak często musiałeś zastępować.
Martin Ender
1
Na marginesie, John File Marker aka EOFjest całkowicie niesamowity!
rev

Odpowiedzi:

9

Pyth, 16 bajtów

JGfqzuXGJrQ0UTz1

Wypróbuj tutaj.

Dane wejściowe należy podać w dwóch wierszach, nazwę, a następnie permutację. Należy podać permutację. Imię może być cytowane lub nie cytowane. Na przykład:

"John Doe"
"aebcdjfghiqklmnopzrstuvwxy"

Daje 140.

Wyjaśnienie:

                            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
źródło
Metoda wprowadzania powinna być identyczna dla ciągów.
randomra
10

CJam, 31 27 25 24 bajtów

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

Pobiera dane wejściowe w postaci:

aebcdjfghiqklmnopzrstuvwxy
Mr. John Doe

tzn. pierwsza linia - alfabety, druga linia - nazwa.

Jak to działa :

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

Wypróbuj online tutaj

Optymalizator
źródło
5

Ruby, 58

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

Wyjaśnienie

  • Dane wejściowe są traktowane jako argumenty do lambda.
  • Użyj Enumerable#find(dzięki @Ventero!) I String#tr!zamień znaki, aż zastąpione Stringpasują do prawdziwego imienia.
Britishtea
źródło
""+njest nieco krótszy niż n.dupi możesz zaoszczędzić kolejny bajt, twórczo wykorzystując Enumerable#findzamiast jawnego licznika:(1..1e4).find{t.tr!(...)==n}
Ventero
Możesz także zaoszczędzić wiele bajtów, wprowadzając małe litery w n
Optimizer
@Optimizer To chyba nic mnie nie oszczędza, metoda Ruby na konwersję na małe litery jest dość długa (musiałbym użyć n.downcase!).
britishtea
tak, ale nie musisz tego robić A-Zi+a.upcase
Optimizer
A-Z+a.upcasei n.downcase!\nmają tę samą długość :)
britishtea
2

CJam, 32 31 bajtów

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

Sprawdź to tutaj. Wymaga permutacji w pierwszym wierszu, a nazwa w drugim wierszu wejścia.

Wyjaśnienie

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
źródło
2

Pyth 26

KGJ@GrQZfqJusm@zxKdGUTJ!!J

Wypróbuj online tutaj.

Istnieje wiele niefortunnych konsekwencji, które kosztują ten bajt programu, takich jak konieczność przechowywania G w K, aby użyć go w redukcji, a także konieczność używania nie (nie (J)), aby uruchomić filtr. Z tego powodu oczekuję, że nadal można grać w golfa.

Jest to program, który pobiera dane wejściowe takie jak:

aebcdjfghiqklmnopzrstuvwxy
'John Doe'

(Zwróć uwagę na brak cytatów w pierwszym argumencie)

Wyjaśnienie, które nastąpi po okaleczającym wyczerpaniu;)

FryAmTheEggman
źródło
Czy powinienem powtórzyć mój poprzedni komentarz ”)
Optymalizator
@Optimizer: PI stracił ten ostatni;)
FryAmTheEggman
Mówiłeś ? ;)
Optymalizator
1

Haskell 131 bajtów

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

Wywołaj fciąg permutacyjny i nazwę, aby uzyskać wynik

Wyjaśnienie

-- 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
źródło
1

GolfScript (33 bajty)

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

Pobiera dane wejściowe jako dwa (jedno- lub podwójnie) ciągi cytowane oddzielone dowolną ilością białych znaków; na przykład

'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'

Demo online

Sekcja

~           # 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

Transliteracja polega na tym, że dotyczy to wszystkich znaków ( zastępuje {'ABC'?'abc'=}%to posortowany ciąg znakówA$'ABC' i Azastępowania permutacji 'abc'); bardziej ogólne alternatywy nie oszczędzają wystarczająco dużo, ponieważ filtr do znaków alfabetycznych jest tak tani.

To również zależy od -1$dostępu do dolnej części stosu, co jest stosunkowo rzadką sztuczką GS.

Peter Taylor
źródło