Gõ bằng các phím bị xáo trộn


16

Bạn của bạn không quá giỏi với máy tính nên như một trò đùa thực tế, ai đó đã xáo trộn các chữ cái (az) trên bàn phím của anh ấy. Khi anh ta ngồi xuống và cố gắng gõ tên mình vào bàn phím, anh ta nhận ra rằng các chữ cái được xáo trộn và nhờ bạn giúp đỡ.

Bạn thông minh để bạn biết rằng nếu anh ấy gõ tên của mình và sau đó lặp lại nhiều lần những gì xuất hiện trên màn hình thay vì tên của anh ấy, anh ấy sẽ thành công trong việc nhập tên của mình. Bạn cũng tốt bụng và sắp xếp lại các phím nhưng muốn biết phải mất bao nhiêu lượt để thành công.

Nhiệm vụ của bạn là viết một chương trình hoặc chức năng đưa ra sự xáo trộn của các chữ cái và tên của người bạn sẽ tính số lượt.

Chi tiết đầu vào:

  • Hai chuỗi được đưa ra làm đầu vào trong một cấu trúc thuận tiện cho ngôn ngữ của bạn.
  • Chuỗi đầu tiên là danh sách các chữ cái viết thường mới theo thứ tự bảng chữ cái của những cái cũ. (Ký tự đầu tiên là ký tự ở vị trí của a, ký tự cuối cùng ở vị trí của z.) Một số thay đổi sẽ luôn xảy ra trong chuỗi.
  • Chuỗi thứ hai là tên. Nó có thể chứa bất kỳ ký tự ascii có thể in nào nhưng chỉ các ký tự chữ cái viết hoa và viết thường sẽ bị xáo trộn nếu có. Tên của nó có thể không bị xáo trộn tại al.

Chi tiết đầu ra:

  • Đầu ra là một số nguyên duy nhất số lượt yêu cầu tối thiểu. Dòng mới là tùy chọn.

Ví dụ:

Đầu vào: 'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'(d, e, f thay đổi vị trí)

Đầu ra: 3(Tên hiển thị là: Mr. John Fod=> Mr. John Eof=> Mr. John Doe)

Đầu vào: 'nopqrstuvwxyzabcdefghijklm' 'Mr. John Doe'( mật mã ROT13 )

Đầu ra: 2(Bất kỳ tên đầu vào nào chứa các chữ cái sẽ mất các 2vòng để tạo tên gốc.)

Đầu vào: 'aebcdjfghiqklmnopzrstuvwxy' 'John Doe'

Đầu ra: 140

Đây là môn đánh gôn nên bài dự thi ngắn nhất sẽ thắng.


1
Bạn có thể nên bao gồm trường hợp thử nghiệm này: aebcdjfghiqklmnopzrstuvwxy(đầu ra 1260 cho Mr John Doe). Đây là mức tối đa có thể - bao gồm các chu kỳ theo thứ tự 4, 5, 7, 9 (và không thay đổi a) và mỗi tên có ít nhất một chữ cái trong mỗi chu kỳ sẽ mang lại 1260. Và tôi đoán lấy chính bảng chữ cái làm đầu vào hoặc sử dụng một tên không bị ảnh hưởng cũng là trường hợp cạnh quan trọng.
Martin Ender

@ MartinBüttner Đã thêm sửa đổi.
ngẫu nhiên

Tôi hơi bối rối về cách bạn đưa ra số lượt.
FUZxxl

@FUZxxl Nói chung, bạn có thể phân tách hoán vị thành các chu kỳ , sau đó bạn kiểm tra chu kỳ nào bao gồm các ký tự từ tên. Kết quả là LCM có độ dài của các chu kỳ đó (tất nhiên các chu kỳ thông qua các ký tự không có tên là không liên quan). Tuy nhiên, đối với thử thách này, điều đó không thực sự cần thiết ... chỉ cần thực hiện các thay thế cho đến khi bạn đạt được tên gốc và tính tần suất bạn phải thay thế.
Martin Ender

1
Là một lưu ý phụ, John File Marker aka EOFlà hoàn toàn tuyệt vời!
rev

Câu trả lời:


9

Bình thường, 16 byte

JGfqzuXGJrQ0UTz1

Hãy thử nó ở đây.

Đầu vào nên được đưa ra trên hai dòng, tên và sau đó hoán vị. Hoán vị nên được trích dẫn. Tên có thể được trích dẫn hoặc không trích dẫn. Ví dụ:

"John Doe"
"aebcdjfghiqklmnopzrstuvwxy"

Tặng 140.

Giải trình:

                            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().

Phương thức nhập phải giống hệt nhau cho các chuỗi.
ngẫu nhiên

10

CJam, 31 27 25 24 byte

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

Đưa đầu vào dưới dạng:

aebcdjfghiqklmnopzrstuvwxy
Mr. John Doe

tức là dòng đầu tiên - bảng chữ cái, dòng thứ hai - tên.

Cách thức hoạt động :

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

Dùng thử trực tuyến tại đây


5

Ruby, 58

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

Giải trình

  • Đầu vào được lấy làm đối số cho lambda.
  • Sử dụng Enumerable#find(cảm ơn @Ventero!) Và String#tr!để thay thế các ký tự cho đến khi thay thế Stringkhớp với tên thật.

""+nngắn hơn một chút n.dupvà bạn có thể lưu một byte khác bằng cách sử dụng sáng tạo Enumerable#findthay vì sử dụng bộ đếm rõ ràng:(1..1e4).find{t.tr!(...)==n}
Ventero

Ngoài ra, bạn có thể tiết kiệm rất nhiều byte bằng cách viết chữ thường đầu vào
Trình tối ưu hóa

@Optimizer Điều đó dường như không tiết kiệm cho tôi bất cứ điều gì, phương pháp của Ruby để chuyển đổi thành chữ thường khá dài (tôi phải sử dụng n.downcase!).
Anh

vâng, nhưng sau đó bạn không phải làm A-Z+a.upcase
Trình tối ưu hóa

A-Z+a.upcasen.downcase!\ncó cùng chiều dài :)
britishtea

2

CJam, 32 31 byte

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

Kiểm tra nó ở đây. Nó lấy hoán vị trên dòng đầu tiên và tên trên dòng thứ hai của đầu vào.

Giải trình

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

2

Số 26

KGJ@GrQZfqJusm@zxKdGUTJ!!J

Hãy thử trực tuyến tại đây.

Có khá nhiều hậu quả đáng tiếc làm tốn byte chương trình này, như phải lưu trữ G trong K để sử dụng nó trong phần giảm, cũng như không cần sử dụng không (không (J)) để khởi động bộ lọc. Bởi vì điều này, tôi hy vọng điều này vẫn có thể được chơi golf.

Đây là một chương trình có đầu vào như:

aebcdjfghiqklmnopzrstuvwxy
'John Doe'

(Lưu ý thiếu dấu ngoặc kép trong đối số đầu tiên)

Giải thích đến sau khi kiệt sức;)


Tôi có nên lặp lại nhận xét trước đó của mình ')
Trình tối ưu hóa

@Optimizer: PI mất cái cuối cùng đó;)
FryAmTheEggman

Bạn đã nói ? ;)
Trình tối ưu hóa

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

Gọi fvới chuỗi hoán vị và tên để có kết quả

Giải trình

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

1

GolfScript (33 byte)

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

Đưa đầu vào thành hai chuỗi (một hoặc hai lần) được trích dẫn cách nhau bởi bất kỳ khoảng trắng nào; ví dụ

'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'

Bản demo trực tuyến

Mổ xẻ

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

Việc chuyển ngữ dựa trên thực tế là tất cả các ký tự bị ảnh hưởng (đó là thay thế {'ABC'?'abc'=}%chuỗi được sắp xếp và thay thế hoán vị ); các lựa chọn thay thế chung hơn không tiết kiệm đủ vì bộ lọc cho các ký tự chữ cái rất rẻ.A$'ABC'A'abc'

Điều này cũng phụ thuộc vào -1$việc truy cập vào dưới cùng của ngăn xếp, đây là một thủ thuật GS tương đối hiếm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.