Şifreli tuşlarla yazma


16

Arkadaşınız bilgisayarlarla çok iyi değil, bu yüzden pratik bir şaka olarak birisi klavyesindeki harfleri (az) karıştırdı. Oturup klavyeye bakarak adını yazmaya çalıştığında harflerin karıştırıldığını fark etti ve yardım istedi.

Akıllısınız, eğer ismini yazıyor ve daha sonra adı yerine ekranda çıkanları tekrar tekrar yazıyorsa, sonunda ismine girmeyi başaracağını biliyorsunuz. Ayrıca, anahtarları nazik ve yeniden düzenlersiniz, ancak başarılı olmak için kaç dönüş gerektiğini bilmek istiyorsunuz.

Göreviniz, harflerin karıştırılması ve arkadaşının adı dönüş sayısını hesaplayan bir program veya işlev yazmaktır.

Giriş ayrıntıları:

  • İki dize, dilinize uygun bir yapıda girdi olarak verilir.
  • İlk dize, eski harflerin alfabetik sıraya göre küçük harflerin listesidir. (İlk karakter a, sonuncusu konumunda olan karakterdir z.) Dizede her zaman bir değişiklik olur.
  • İkinci dize addır. Yazdırılabilir herhangi bir ascii karakteri içerebilir, ancak varsa yalnızca büyük ve küçük harfli alfabetik karakterler karıştırılır. İsmin kendisi al'de karıştırılmayabilir.

Çıktı ayrıntıları:

  • Çıktı, gereken minimum dönüş sayısı olan tek bir tamsayıdır. Newline isteğe bağlıdır.

Örnekler:

Giriş: 'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'(d, e, f konumları değişti)

Çıktı: 3(Gösterilen adlar: Mr. John Fod=> Mr. John Eof=> Mr. John Doe)

Giriş: 'nopqrstuvwxyzabcdefghijklm' 'Mr. John Doe'( ROT13 şifresi )

Çıktı: 2(Harf içeren herhangi bir giriş adı 2, orijinal adı oluşturmak için mermi alır .)

Giriş: 'aebcdjfghiqklmnopzrstuvwxy' 'John Doe'

Çıktı: 140

Bu kod golf bu yüzden en kısa giriş kazanır.


1
Muhtemelen bu test senaryosunu dahil etmelisiniz: aebcdjfghiqklmnopzrstuvwxy(çıkış 1260 Mr John Doe). Bu mümkün olan maksimum değerdir - 4, 5, 7, 9 düzeninden (ve değişmeden a) oluşur ve her döngüden en az bir harf içeren her isim 1260 verir. Ve sanırım alfabeyi giriş olarak alıyor veya etkilenmeyen bir ad kullanmak da önemli durumlardır.
Martin Ender

@ MartinBüttner Değişiklikle eklendi.
randomra

Dönüş sayısını nasıl bulduğunuz konusunda biraz kafam karıştı.
FUZxxl

@FUZxxl Genel olarak, permütasyonu döngülere ayırabilir , ardından hangi döngülerin adından karakterler içerdiğini kontrol edebilirsiniz. Sonuç, bu döngülerin uzunluklarının LCM'sidir (isimde olmayan karakterler arasındaki döngüler elbette ilgisizdir). Ancak, bu meydan okuma için bu gerçekten gerekli değil ... sadece orijinal isme çarpana kadar değiştirme yapın ve ne sıklıkta yerine koymanız gerektiğini sayın.
Martin Ender

1
Bir yan not olarak, John File Marker aka EOFtamamen şaşırtıcı!
rev

Yanıtlar:


9

Pyth, 16 bayt

JGfqzuXGJrQ0UTz1

Burada deneyin.

Girdi ad ve sonra permütasyon olmak üzere iki satırda verilmelidir. Permütasyon alıntılanmalıdır. Ad tırnak içine alınmış veya tırnaksız olabilir. Örneğin:

"John Doe"
"aebcdjfghiqklmnopzrstuvwxy"

140 verir.

Açıklama:

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

Giriş yöntemi dizeler için aynı olmalıdır.
randomra

10

CJam, 31 27 25 24 bayt

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

Girdi şeklinde alır:

aebcdjfghiqklmnopzrstuvwxy
Mr. John Doe

ilk satır - alfabe, ikinci satır adı.

Nasıl çalışır :

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

Buradan çevrimiçi deneyin


5

Yakut, 58

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

açıklama

  • Girdi bir lambda'ya argüman olarak alınır.
  • Değiştirilen gerçek adla Enumerable#findeşleşene String#tr!kadar karakterleri değiştirmek için (teşekkürler @Ventero!) Ve karakterlerini kullanın String.

""+nbiraz daha kısadır n.dupve Enumerable#findaçık bir sayaç kullanmak yerine yaratıcı bir şekilde kullanarak başka bir bayt kaydedebilirsiniz :(1..1e4).find{t.tr!(...)==n}
Ventero

Ayrıca, girişi n küçük harf yaparak çok sayıda bayt kaydedebilirsiniz
Optimizer

@Optimizer Bu beni hiçbir şeyden kurtarmıyor gibi görünüyor, Ruby'nin küçük harfe dönüştürme yöntemi oldukça uzun (kullanmam gerekecekti n.downcase!).
britishtea

evet, ama sonra yapmak zorunda değilsin A-Zve+a.upcase
Doktor

A-Z+a.upcaseve n.downcase!\naynı uzunlukta var :)
britishtea

2

CJam, 32 31 bayt

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

Burada test edin. İlk satırdaki permütasyonu ve girişin ikinci satırındaki adı alır.

açıklama

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

Burada çevrimiçi deneyin.

Bu program baytlarına mal olan, G'yi azaltmak için kullanmak üzere K'de saklamak zorunda kalmanın yanı sıra filtreyi başlatmak için (J değil) kullanmaya ihtiyaç duymak gibi birkaç talihsiz sonuç vardır. Bu nedenle, bunun hala golf oynayabileceğini umuyorum.

Bu, aşağıdaki gibi girdi alan bir programdır:

aebcdjfghiqklmnopzrstuvwxy
'John Doe'

(İlk argümandaki alıntı eksikliğine dikkat edin)

Sakatlıktan sonra gelecek açıklama;)


Önceki
Optimizer

@Optimizer: PI sonuncusunu kaybetti;)
FryAmTheEggman

Ne söylüyordun ? ;)
Optimizer

1

Haskell 131 bayt

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

fSonucu almak için permütasyon dizesi ve adıyla arayın

açıklama

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

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

Girdiyi herhangi bir miktarda boşlukla ayrılmış iki (tek veya çift) tırnaklı dizge olarak alır; Örneğin

'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'

Çevrimiçi demo

teşrih

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

Harf çevirisi, tüm karakterlerin etkilendiği gerçeğine dayanır ( {'ABC'?'abc'=}%sıralanan dizenin A$değiştirilmesi 'ABC've permütasyonun Adeğiştirilmesi ile 'abc'); alfabetik karakterlere filtre çok ucuz olduğu için daha genel alternatifler yeterli tasarruf sağlamaz.

Bu -1$, nispeten nadir bir GS hilesi olan yığının tabanına erişmeye de dayanır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.