การพิมพ์ด้วยปุ่มสัญญาณรบกวน


16

เพื่อนของคุณไม่ดีกับคอมพิวเตอร์ดังนั้นเป็นเรื่องตลกในทางปฏิบัติใครบางคนกวนตัวอักษร (az) บนแป้นพิมพ์ของเขา เมื่อเขานั่งลงและพยายามพิมพ์ชื่อของเขาดูที่แป้นพิมพ์เขาก็ตระหนักว่าตัวอักษรดังกล่าวมีสัญญาณรบกวนและขอความช่วยเหลือจากคุณ

คุณฉลาดเพื่อให้คุณรู้ว่าถ้าเขาพิมพ์ชื่อของเขาและจากนั้นพิมพ์ซ้ำสิ่งที่เกิดขึ้นบนหน้าจอแทนชื่อของเขาเขาจะประสบความสำเร็จในการป้อนชื่อของเขาในที่สุด คุณยังใจดีและจัดเรียงกุญแจใหม่อีกครั้ง แต่ต้องการทราบว่าจะต้องใช้เวลากี่ครั้งในการประสบความสำเร็จ

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ให้ตัวอักษรสับและชื่อของเพื่อนคำนวณจำนวนรอบ

รายละเอียดการป้อนข้อมูล:

  • มีการให้สองสตริงเป็นอินพุตในโครงสร้างที่สะดวกสำหรับภาษาของคุณ
  • สตริงแรกคือรายการของตัวอักษรตัวพิมพ์เล็กใหม่ตามลำดับตัวอักษรของตัวอักษรเก่า (อักขระตัวแรกคือตัวอักษรที่อยู่ที่ตำแหน่งตัวอักษรตัวaสุดท้ายอยู่ที่ตำแหน่งz) การเปลี่ยนแปลงบางอย่างจะเกิดขึ้นในสตริงเสมอ
  • สตริงที่สองคือชื่อ มันสามารถมีตัวอักษร ASCII ที่พิมพ์ได้ใด ๆ แต่ตัวอักษรตัวอักษรบนและล่างจะถูกสับถ้ามี ชื่อตัวเองอาจไม่ได้สับที่อัล

รายละเอียดผลลัพธ์:

  • เอาท์พุทเป็นจำนวนเต็มเดียวจำนวนการเลี้ยวที่ต้องการน้อยที่สุด ขึ้นบรรทัดใหม่เป็นตัวเลือก

ตัวอย่าง:

อินพุต: '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) และชื่อทุกชื่อที่มีตัวอักษรอย่างน้อยหนึ่งตัวจากแต่ละรอบจะให้ผล 1260 และฉันเดาว่าการใช้ตัวอักษรเป็นอินพุต หรือการใช้ชื่อที่ไม่ได้รับผลกระทบก็เป็นตัวเลือกที่สำคัญเช่นกัน
Martin Ender

@ MartinBüttnerเพิ่มพร้อมการดัดแปลง
randomra

ฉันสับสนเล็กน้อยเกี่ยวกับวิธีที่คุณคิดจำนวนรอบ
FUZxxl

@FUZxxl โดยทั่วไปคุณสามารถแยกย่อยการเรียงสับเปลี่ยนเป็นวงรอบจากนั้นคุณตรวจสอบว่าวงรอบใดมีอักขระจากชื่อ ผลที่ได้คือ LCM ของความยาวของรอบเหล่านั้น (รอบผ่านตัวละครที่ไม่ได้อยู่ในชื่อที่ไม่เกี่ยวข้องแน่นอน) อย่างไรก็ตามสำหรับความท้าทายนี้มันไม่จำเป็นจริงๆ ... เพียงแค่ทำการเปลี่ยนตัวจนกว่าคุณจะตีชื่อดั้งเดิมและนับว่าคุณต้องเปลี่ยนบ่อยแค่ไหน
Martin Ender

1
ในฐานะที่เป็นข้อความด้าน, John File Marker aka EOFเป็นที่น่าอัศจรรย์อย่างสิ้นเชิง!
rev

คำตอบ:


9

Pyth, 16 ไบต์

JGfqzuXGJrQ0UTz1

ลองที่นี่

การป้อนข้อมูลควรให้สองบรรทัดชื่อและการเรียงสับเปลี่ยน ควรมีการยกระดับการเรียงสับเปลี่ยน ชื่ออาจจะยกมาหรือไม่ยกมา ตัวอย่างเช่น:

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

วิธีการป้อนข้อมูลควรเหมือนกันสำหรับสตริง
randomra

10

CJam, 31 27 25 24 bytes

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

รับอินพุตในรูปแบบของ:

aebcdjfghiqklmnopzrstuvwxy
Mr. John Doe

เช่นบรรทัดแรก - ตัวอักษรบรรทัดที่สอง - ชื่อ

มันทำงานอย่างไร :

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

นอกจากนี้คุณยังสามารถบันทึกไบต์จำนวนมากได้ด้วยการทำอินพุทและตัวพิมพ์เล็ก
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ที่ดูเหมือนจะไม่ช่วยฉันอะไรเลยวิธีการแปลง Ruby เป็นตัวพิมพ์เล็กนั้นค่อนข้างยาว (ฉันต้องใช้n.downcase!)
britishtea

ใช่ แต่คุณไม่ต้องทำA-Zและ+a.upcase
เครื่องมือเพิ่มประสิทธิภาพ

A-Z+a.upcaseและn.downcase!\nมีความยาวเท่ากัน :)
britishtea

2

CJam, 32 31 ไบต์

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

ทดสอบที่นี่ ใช้การเรียงสับเปลี่ยนในบรรทัดแรกและชื่อในบรรทัดที่สองของอินพุต

คำอธิบาย

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 เพื่อใช้ในการลดและต้องไม่ใช้ (ไม่ใช่ (J)) เพื่อเริ่มตัวกรอง ด้วยเหตุนี้ฉันคาดหวังว่าสิ่งนี้ยังคงสามารถเล่นกอล์ฟได้

นี่คือโปรแกรมที่รับอินพุตเช่น:

aebcdjfghiqklmnopzrstuvwxy
'John Doe'

(สังเกตการขาดเครื่องหมายคำพูดในอาร์กิวเมนต์แรก)

คำอธิบายที่จะเกิดขึ้นหลังจากอ่อนเพลียหมดอำนาจ;)


ฉันควรทำซ้ำความคิดเห็นก่อนหน้าของฉัน ')
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer: PI สูญเสียคนสุดท้าย;)
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],(

รับอินพุตเป็นสตริงที่ยกมาเป็นสอง (เดี่ยว - หรือ - สอง) สตริงที่คั่นด้วยจำนวนช่องว่างใด ๆ เช่น

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