スクランブルキーで入力する


16

あなたの友人はコンピューターがあまり上手ではないので、実際の冗談で誰かがキーボードの文字(az)をスクランブルしました。彼が座ってキーボードを見て名前を入力しようとすると、彼は文字がスクランブルされていることに気づき、助けを求めました。

あなたは賢いので、彼が自分の名前を入力してから、彼の名前の代わりに画面に表示されるものを繰り返し再入力すると、彼は最終的に彼の名前を入力することに成功することを知っています。また、親切でキーを再配置しますが、成功するのに何ターンかかるかを知りたいです。

あなたの仕事は、文字をシャッフルし、友人の名前がターン数を計算するプログラムまたは関数を書くことです。

入力の詳細:

  • 2つの文字列が、言語に便利な構造の入力として与えられます。
  • 最初の文字列は、古い小文字のアルファベット順の新しい小文字のリストです。(最初の文字はの位置にありa、最後の文字はの位置にありzます。)文字列には常に何らかの変更が発生します。
  • 2番目の文字列は名前です。印刷可能なASCII文字を含めることができますが、大文字と小文字のアルファベットのみがシャッフルされます。名前自体はalでシャッフルされないかもしれません。

出力の詳細:

  • 出力は、最小限必要な巻き数の単一の整数です。改行はオプションです。

例:

入力: 'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'(d、e、fの位置が変更されました)

出力:( 3表示される名前はMr. John Fod=> Mr. John Eof=> Mr. John Doe

入力: 'nopqrstuvwxyzabcdefghijklm' 'Mr. John Doe'ROT13暗号

出力:( 2文字を含むすべての入力名は2、元の名前を生成するためにラウンドします。)

入力: 'aebcdjfghiqklmnopzrstuvwxy' 'John Doe'

出力: 140

これはコードゴルフなので、最短のエントリが優先されます。


1
次のテストケースを含める必要があります:(aebcdjfghiqklmnopzrstuvwxy出力1260 Mr John Doe)。これは最大の可能性です-順序4、5、7、9のサイクル(および変更されていないa)で構成され、各サイクルから少なくとも1つの文字を含むすべての名前は1260を生成します。または、影響を受けない名前を使用することも重要です。
マーティンエンダー

@MartinBüttnerを修正して追加。
randomra

私はあなたがどのようにターン数を考え出すかについて少し混乱しています。
FUZxxl

@FUZxxl一般的に、順列をcyclesに分解してから、どのサイクルに名前の文字が含まれているかを確認できます。結果は、それらのサイクルの長さのLCMです(名前に含まれない文字のサイクルは、もちろん無関係です)。ただし、この課題では、それは本当に必要ではありません...元の名前に到達するまで置換を実行し、置換する必要がある頻度を数えます。
マーティンエンダー

1
サイドノートとして、別名ジョンファイルマーカーEOFは完全に素晴らしいです!
rev

回答:


9

Pyth、16バイト

JGfqzuXGJrQ0UTz1

ここで試してみてください。

入力は、名前と順列の2行で指定する必要があります。順列を引用する必要があります。名前は引用符で囲まれている場合と引用されていない場合があります。例えば:

"John Doe"
"aebcdjfghiqklmnopzrstuvwxy"

140を与えます。

説明:

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

入力メソッドは文字列に対して同一である必要があります。
ランダラ

10

CJam、31 27 25 24バイト

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

次の形式で入力を受け取ります。

aebcdjfghiqklmnopzrstuvwxy
Mr. John Doe

すなわち、1行目-アルファベット、2行目-名前。

仕組み

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

こちらからオンラインでお試しください


5

ルビー、58

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

説明

  • 入力はラムダへの引数として取得されます。
  • Enumerable#find(@Ventero!に感謝)および String#tr!を使用して、置き換えられた文字Stringが実際の名前と一致するまで文字を置き換えます。

""+nより少し短くなってn.dup、あなたはの創造を利用することにより、別のバイトを保存することができますEnumerable#find代わりに、明示的なカウンターを使用して:(1..1e4).find{t.tr!(...)==n}
Ventero

また、入力nを小文字にすることで大量のバイトを節約できます
オプティマイザー

@Optimizerそれは私を何も救っていないようです、小文字に変換するRubyの方法はかなり長いです(私は使用する必要がありますn.downcase!)。
イギリス茶

ええ、しかしあなたはする必要はA-Zありません+a.upcase
オプティマイザー

A-Z+a.upcasen.downcase!\n同じ長さを持っています:)
イギリス茶

2

CJam、32 31バイト

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

ここでテストしてください。入力の1行目に順列を、2行目に名前を取ります。

説明

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

Pyth 26

KGJ@GrQZfqJusm@zxKdGUTJ!!J

こちらからオンラインでお試しください。

GをKに格納してreduceで使用する必要があるほか、not(not(J))を使用してフィルターを開始する必要があるなど、このプログラムバイトにかかる不幸な結果がかなりあります。このため、これでもゴルフができると思います。

これは、次のような入力を受け取るプログラムです。

aebcdjfghiqklmnopzrstuvwxy
'John Doe'

(最初の引数に引用符がないことに注意してください)

疲労困crの後に来る説明;)


以前のコメントを繰り返します ')
オプティマイザー

@Optimizer:PIは最後の1つを失いました;)
FryAmTheEggman

あなたは言っていました ?;)
オプティマイザー

1

Haskell 131バイト

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

f置換文字列と名前で呼び出して結果を取得します

説明

-- 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バイト)

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

入力を任意の量の空白で区切られた2つの(単一または二重)引用符付き文字列として受け取ります。例えば

'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'

オンラインデモ

解剖

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

音訳は、すべての文字が(それはだ影響を受けているという事実に依存{'ABC'?'abc'=}%ソート文字列がでA$置き換える'ABC'と順列はA交換します'abc')。アルファベット文字へのフィルターは非常に安価であるため、より一般的な代替手段では十分に保存できません。

これ-1$は、スタックの最下部へのアクセスにも依存していますが、これは比較的まれなGSトリックです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.