Mengetik dengan kunci acak

16

Teman Anda tidak terlalu pandai menggunakan komputer sehingga sebagai lelucon praktis seseorang mengacak-acak huruf (az) di keyboard-nya. Ketika dia duduk dan mencoba mengetik namanya sambil melihat keyboard, dia menyadari bahwa huruf-hurufnya berantakan dan meminta bantuanmu.

Anda cerdas sehingga Anda tahu bahwa jika ia mengetik namanya dan berulang kali mengetik ulang apa yang muncul di layar alih-alih namanya, ia akan berhasil memasukkan namanya pada akhirnya. Anda juga baik dan mengatur kembali kunci tetapi ingin tahu berapa banyak putaran yang diperlukan untuk berhasil.

Tugas Anda adalah menulis program atau fungsi yang memberikan pengocokan huruf-huruf dan nama teman menghitung jumlah belokan.

Detail input:

  • Dua string diberikan sebagai input dalam struktur yang nyaman untuk bahasa Anda.
  • String pertama adalah daftar huruf kecil baru dalam urutan abjad dari yang lama. (Karakter pertama adalah karakter yang ada di posisi a, karakter terakhir ada di posisi z.) Beberapa perubahan akan selalu terjadi dalam string.
  • String kedua adalah namanya. Ini dapat berisi karakter ascii yang dapat dicetak tetapi hanya karakter alfabet huruf besar dan kecil yang akan dikocok jika ada. Nama itu sendiri mungkin tidak dikocok di al.

Rincian keluaran:

  • Output adalah bilangan bulat tunggal jumlah belokan minimal yang diperlukan. Baris baru adalah opsional.

Contoh:

Input: 'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'(d, e, f posisi berubah)

Output: 3(Nama yang ditampilkan adalah: Mr. John Fod=> Mr. John Eof=> Mr. John Doe)

Input: 'nopqrstuvwxyzabcdefghijklm' 'Mr. John Doe'( cipher ROT13 )

Output: 2(Setiap nama input yang berisi huruf akan mengambil 2putaran untuk menghasilkan nama asli.)

Memasukkan: 'aebcdjfghiqklmnopzrstuvwxy' 'John Doe'

Keluaran: 140

Ini adalah kode-golf sehingga entri terpendek menang.

randomra
sumber
1
Anda mungkin harus memasukkan test case ini: aebcdjfghiqklmnopzrstuvwxy(output 1260 untuk Mr John Doe). Ini adalah maksimum yang mungkin - ini terdiri dari siklus urutan 4, 5, 7, 9 (dan tidak berubah a), dan setiap nama yang mengandung setidaknya satu huruf dari setiap siklus akan menghasilkan 1260. Dan saya kira mengambil alfabet itu sendiri sebagai input atau menggunakan nama yang tidak terpengaruh juga merupakan kasus tepi yang penting.
Martin Ender
@ MartinBüttner Ditambahkan dengan modifikasi.
randomra
Saya agak bingung tentang bagaimana Anda menghasilkan jumlah belokan.
FUZxxl
@ FUZxxl Secara umum, Anda dapat menguraikan permutasi menjadi siklus , lalu Anda memeriksa siklus mana yang menyertakan karakter dari namanya. Hasilnya adalah LCM dari panjang siklus tersebut (siklus melalui karakter tidak dalam nama tidak relevan, tentu saja). Namun, untuk tantangan ini, itu tidak benar-benar diperlukan ... cukup lakukan penggantian sampai Anda menekan nama aslinya dan hitung seberapa sering Anda harus menggantinya.
Martin Ender
1
Sebagai catatan, John File Marker alias EOFsangat menakjubkan!
rev

Jawaban:

9

Pyth, 16 byte

JGfqzuXGJrQ0UTz1

Coba di sini.

Input harus diberikan pada dua baris, nama dan kemudian permutasi. Permutasi harus dikutip. Nama dapat dikutip atau tidak dikutip. Sebagai contoh:

"John Doe"
"aebcdjfghiqklmnopzrstuvwxy"

Memberi 140.

Penjelasan:

                            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
sumber
Metode input harus identik untuk string.
randomra
10

CJam, 31 27 25 24 byte

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

Mengambil input dalam bentuk:

aebcdjfghiqklmnopzrstuvwxy
Mr. John Doe

yaitu baris pertama - huruf, baris kedua - nama.

Cara kerjanya :

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

Cobalah online di sini

Pengoptimal
sumber
5

Ruby, 58

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

Penjelasan

  • Masukan diambil sebagai argumen untuk lambda.
  • Gunakan Enumerable#find(terima kasih @Ventero!) Dan String#tr!untuk mengganti karakter sampai diganti Stringsesuai dengan nama asli.
britishtea
sumber
""+nsedikit lebih pendek daripada n.dup, dan Anda dapat menyimpan byte lain dengan menggunakan kreatif Enumerable#findalih-alih menggunakan penghitung eksplisit:(1..1e4).find{t.tr!(...)==n}
Ventero
Selain itu, Anda dapat menyimpan banyak byte dengan membuat input n huruf kecil
Pengoptimal
@Optimizer Tampaknya tidak menyelamatkan saya apa-apa, metode Ruby untuk mengonversi ke huruf kecil cukup panjang (saya harus menggunakan n.downcase!).
britishtea
ya, tapi kemudian Anda tidak perlu melakukan A-Zdan+a.upcase
Pengoptimal
A-Z+a.upcasedan n.downcase!\nmemiliki panjang yang sama :)
britishtea
2

CJam, 32 31 byte

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

Uji di sini. Dibutuhkan permutasi pada baris pertama, dan nama pada baris kedua dari input.

Penjelasan

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
sumber
2

Pyth 26

KGJ@GrQZfqJusm@zxKdGUTJ!!J

Cobalah online di sini.

Ada beberapa konsekuensi yang tidak menguntungkan yang menghabiskan biaya byte program ini, seperti harus menyimpan G dalam K untuk menggunakannya dalam pengurangan, serta perlu menggunakan not (bukan (J)) untuk memulai filter. Karena itu, saya berharap ini masih bisa bermain golf.

Ini adalah program yang mengambil input seperti:

aebcdjfghiqklmnopzrstuvwxy
'John Doe'

(Catat kurangnya kutipan dalam argumen pertama)

Penjelasan yang akan datang setelah melelahkan kelelahan;)

FryAmTheEggman
sumber
Haruskah saya ulangi komentar saya sebelumnya ')
Pengoptimal
@Optimizer: PI kehilangan yang terakhir;)
FryAmTheEggman
Anda katakan? ;)
Pengoptimal
1

Haskell 131 byte

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

Panggil fdengan string permutasi dan nama untuk mendapatkan hasilnya

Penjelasan

-- 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
sumber
1

GolfScript (33 byte)

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

Mengambil input sebagai dua (satu atau dua) string yang dikutip dipisahkan oleh jumlah spasi putih; misalnya

'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'

Demo online

Pembedahan

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

Transliterasi bergantung pada fakta bahwa semua karakter terpengaruh (itu {'ABC'?'abc'=}%dengan A$penggantian string yang diurutkan 'ABC'dan permutasi Amenggantikan'abc' ); alternatif yang lebih umum tidak cukup menghemat karena filter ke karakter alfabet sangat murah.

Ini juga bergantung pada -1$untuk mengakses bagian bawah tumpukan, yang merupakan trik GS yang relatif jarang.

Peter Taylor
sumber