bROKEN cAPSLOCK kEY fIASCO


25

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

คุณตื่นเต้นกับเทศกาลคริสต์มาสมาก! ดังนั้นคุณจะต้องทิ้ง "บั๊ก" ตัวเล็ก ๆ ที่ไม่ได้แก้ไขตัวอักษรที่อยู่ในลำดับของChristmas(ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่)

อินพุต

สำหรับการป้อนข้อมูลคุณจะใช้หนึ่งสตริงเดียว (หรืออาร์เรย์ของไบต์) ที่อาจมีการขึ้นบรรทัดใหม่และ ascii ระหว่าง0x20 และ 0x7e ( - ~) คุณไม่ต้องกังวลกับการขึ้นบรรทัดใหม่หรือตัวละครอื่น ๆ ที่อยู่ในสายอักขระ

เอาท์พุต

ผลลัพธ์ควรมีเฉพาะสตริงที่มีให้ซึ่งมีอักขระตัวพิมพ์ใหญ่และตัวพิมพ์เล็กสลับกัน (และข้อบกพร่องคริสต์มาสแน่นอน!) สามารถมีช่องว่างต่อท้ายได้สูงสุดหนึ่งรายการ

แมลงคริสต์มาส

เรามาอธิบายเรื่องนี้กับตัวอย่าง:

Input: i CAN HARDLY WORK LIKE THIS please GET ME A NEW KEYBOARD FOR cHRISTMAS
Output: I Can HaRdly work lIke thiS PLEASE geT Me A new keyboard for ChriStmas

canมี "c" ซึ่งเป็นตัวอักษรแรกของคริสต์มาสดังนั้นจึงไม่มีการเปลี่ยนแปลง ตัวอักษรถัดไปChristmasคือ "h" ซึ่งอยู่ในhardly(ซึ่งยังมี "r") ดังนั้นจึงไม่เปลี่ยนแปลง ฯลฯChristmasตัวมันเองมีเพียงตัวอักษรเดียวที่ไม่เปลี่ยนแปลงเพราะเมื่อถึงรหัสที่นั่นมันกำลังมองหา "s" ไม่ใช่ "c"

เมื่อพบลำดับแล้วควรเริ่มต้นใหม่อีกครั้งที่ "c" และเริ่มทำซ้ำChristmasอีกครั้ง ดังนั้นChristmasChristmasจะไม่มีการเปลี่ยนแปลง

กรณีทดสอบ

Input: Hello World!
Output: hELLO wORLD!

Input: I like pie :)
Output: i LIKE PIE :)

Input: hELP my KeYboarD
       iS BROKEN
Output: Help MY kEyBOARd
        Is broken

Input: cHRISTMAS IS COMING REALLY SOON!
Output: cHRISTMAS is Coming really soon!

Input: C is the first letter in cHRISTMAS
Output: C IS ThE FIrST LETTER iN ChriSTMAS

ผู้ชนะ

นี่คือดังนั้นคำตอบที่สั้นที่สุดชนะ!


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


@ATaco ฉันเพิ่มในนาทีสุดท้ายเนื่องจากข้อเสนอแนะในแซนด์บ็อกซ์ฉันตกลง แต่ฉันก็ลบมันออกไป
redstarcoder

นอกจากนี้กรณีทดสอบ 3 คุณสลับ h แรกเมื่ออยู่ในคริสต์มาส
ATaco

@ ATaco มันจะค้นหาแบบChristmasเรียงลำดับดังนั้น "h" จะถูกละเว้นจนกว่าจะพบ "c" จากนั้นจะมองหา "h" จากนั้นก็จะเป็น "h" จากนั้น "r" และอื่น ๆ
redstarcoder

คำตอบ:


9

05AB1E , 16 ไบต์

ขอบคุณEmigna ที่บันทึกไบต์และแก้ไขข้อบกพร่อง!

vyÐl'ŒÎ¾èQi¼ëš}?

คำอธิบาย:

vy                # For each character in the string...
  Ð               #   Triplicate that character
   l              #   Convert to lowercase
    'ŒÎ           #   Compressed version of "christmas"
       ¾          #   Push the counting variable (let's call this N)
        è         #   Get the nth character of "christmas", with modular indexing
         Qi   }   #   If equal...
           ¼      #      N += 1
            ë     #   Else...
             š    #      Swapcase
               ?  #   Print that character

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


1
สิ่งนี้ใช้กับการขึ้นบรรทัดใหม่ได้หรือไม่
redstarcoder

@redstarcoder โอ๊ะโอไม่ได้ ตอนนี้ได้รับการแก้ไขแล้ว
Adnan

2
มันดูเหมือนดิ้น : D
Titus

1
เอาต์พุตไม่ถูกต้อง (ลองใช้คริสต์มาสเป็นอินพุต) แต่ถ้าคุณลบออกuควรใช้งานได้
Emigna

1
@Izzy 05ab1e มีมานานแล้วเป็นเวลานาน
Pavel

5

V , 38 , 36 ไบต์

ÄVumaOchristmasòÉf2x`a@"maj~HòHdjV~

ลองออนไลน์! (มีอินพุตและเอาต์พุตที่คาดหวังสำหรับการเปรียบเทียบ)

เมื่อฉันเห็นสิ่งนี้ครั้งแรกฉันคิดว่ามันจะง่ายมาก ในความเป็นจริงถ้ามันไม่ได้สำหรับข้อผิดพลาด "คริสต์มาส" นี้ก็จะเป็น 2 V~ไบต์: ข้อบกพร่องคริสต์มาสทำให้มันยากขึ้นอย่างมากสำหรับคำตอบที่แฮ็คมาก

ตามปกตินี่คือ hexdump:

00000000: c456 756d 614f 6368 7269 7374 6d61 731b  .VumaOchristmas.
00000010: f2c9 6632 7860 6140 226d 616a 7e48 f248  ..f2x`a@"maj~H.H
00000020: 646a 567e                                djV~

ฉันชอบที่จะรู้เพิ่มเติมเกี่ยวกับ V.
ckjbgames

@ckjbgames เจ๋งฉันมีความสุขที่จะตอบคำถามใด ๆ ที่คุณมี! คุณสามารถ ping ฉันในห้องเล่นกอล์ฟได้ ตอนนี้ฉันกำลังทำงานเพื่อทำให้ V ง่ายขึ้นนิดหน่อยในการเรียนรู้ / สร้างบทเรียน
DJMcMayhem

4

PHP, 113 110 102 ไบต์

while($o=ord($c=$argv[1][$i++]))echo chr(32|$o==ord(christmas[$k%9])?$o|0&$k++:ctype_alpha($c)*32^$o);

รับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งแรก -rทำงานด้วย

ทำให้พังถล่ม

while($o=ord($c=$argv[1][$i++]))// loop through string characters
    echo chr(
        32|$o==ord(christmas[$k%9]) // if $c equals next character in "christmas"
            ?$o|0&$k++              // no change, increase "christmas" index
            :ctype_alpha($c)        // else if $c is a letter
                    *32^$o          // toggle bit 5 of the ascii code
        );

2

MATL , 36 30 ไบต์

"@tk'schristma'H)=?HQXHx}Yo]&h

สายอักขระที่มีการขึ้นบรรทัดใหม่จำเป็นต้องกำหนดโดยการต่อรหัส ASCII 10(ดูตัวอย่างในลิงก์กับกรณีทดสอบ)

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

"              % Implicit input of a string. For each character in that string
  @            %   Push current character
  tk           %   Duplicate and convert to lowercase
  'schristma'  %   Push string. This is 'Christmas' in lowercase and circularly
               %   shifted such that the 'c' is in the second position
  H            %   Push contents of clipboard H, which is initiallized to 2.
               %   This value will be gradually increased when a new character
               %   from the the sequence is found
  )            %   Get character from 'schristma' at that (modular) position
  =            %   Are they equal?
  ?            %   If so
    HQ         %     Push contents of clipboard H and add 1
    XHx        %     Copy into clipboard K and delete
  }            %   Else
    Yo         %     Change case
  ]            %   End
  &h           %   Concatenate stack contents horizontally. This gives a string 
               %   with all characters processed up to now
               % Implicit end. Implicit display



2

C # 197 ไบต์

จะไม่ชนะในเรื่องนี้ แต่หวังว่าการติดตั้ง C # ที่เล็กที่สุดจะได้ผล ...

string C(string s){int i=0,j=0;var r="";for(;i<s.Length;){char c=s[i++],o=(char)32;if(c=="christmas"[j]|c=="CHRISTMAS"[j])j=j>7?0:j+1;else if(c>64&c<91)c+=o;else if(c>96&c<123)c-=o;r+=c;}return r;}

คำอธิบาย:

string C(string s)
{
    // define our two index ints
    // i for indexing across the input string
    // j for indexing across christmas
    int i = 0, j = 0;

    // r is our return string
    var r = "";

    // declare our loop
    // skip the initialisation and afterthought
    for (; i < s.Length;)
    {
        // get our current character c, and increment index i
        // initial our offset char o (difference between upper and lower case)
        char c = s[i++], o = (char)32;

        // check if c is the current character in our christmas bug
        if (c == "christmas"[j] | c == "CHRISTMAS"[j])
            // increment j (or reset to 0)
            j = j > 7 ? 0 : j + 1;

        // else if c is an upper case char
        else if (c > 64 & c < 91)
            // add our offset to make it lower case
            c += o;

        // else if c is lower case
        else if (c > 96 & c < 123)
            // subtract our offset to make it upper case
            c -= o;

        // append c to our return string r
        r += c;
    }

    return r;
}

2

JavaScript, 122 118 114 107 104 93 ไบต์

f=
s=>s.replace(/./g,c=>(k=c.toLowerCase())=='christmas'[i%9]?++i&&c:k!=c?k:c.toUpperCase(),i=0)


F=s=>console.log(f(s))
F(`Hello World!`)
F(`I like pie :)`)
F(`hELP my KeYboarD
       iS BROKEN`)
F(`cHRISTMAS IS COMING REALLY SOON!`)
F(`C is the first letter in cHRISTMAS`)

  • 11 ไบต์ปิดขอบคุณ @Neil

คุณไม่สามารถใช้k!=c?k:c.toUpperCase()เพื่อช่วยให้คุณประหยัดไม่กี่ไบต์?
Neil

1

Perl 6 , 80 ไบต์

{my$i=0;S:g{.?<!{'christmas'.comb[$i%9]eq$/.lc&&++$i}>}=$/eq$/.lc??$/.uc!!$/.lc}

ลองมัน

{   # bare block lambda with implicit parameter 「$_」

  my $i = 0;             # counter

  S                      # substitute and return ( implicitly against 「$_」 )
  :global
  {
    .                    # any char
    ?                    # work around a bug where 「$/」 doesn't get set

    <!{                  # fail this match if this block returns True
      'christmas'.comb\  # a list of the characters of 「christmas」
      [ $i % 9 ]         # grab a char from the list
      eq                 # is it equal to
      $/.lc              # the lowercase version of the char
      &&                 # if so
      ++$i               # increment 「$i」 ( result is True )
    }>

  }

  =                      # for each matched char

  $/ eq $/.lc            # is it lowercase?
  ?? $/.uc               # the uppercase it
  !! $/.lc               # otherwise lowercase it
}

ฉันไม่เชื่อว่าการเว้นพื้นที่ในmy $i=0;นั้นถูกกฎหมาย และฉันจะไม่แปลกใจถ้ามีข้อผิดพลาดทางไวยากรณ์ที่เกี่ยวข้องกับช่องว่างมากขึ้น
bb94

1
@ bb94 ฉันรวมลิงค์ไปยังเว็บไซต์ที่จะเรียกใช้รหัสอย่างแท้จริง หากคุณไม่เชื่อว่าสิ่งนั้นจะทำงานทำไมคุณไม่ลอง ฉันหมายความว่าฉันเขียน$/ eq $/.lcมากกว่าเพื่อที่ฉันจะลบพื้นที่ก่อน$/.lc eq $/ eq
Brad Gilbert b2gills

@ bb94 ฉันสามารถยืนยันได้ว่าทำงานได้กับคอมไพเลอร์ที่เชื่อมโยง
redstarcoder

1

Java 7, 200 ไบต์

String c(char[]a){String r="";int i=0,s;Character l='a';for(char c:a)if((s="christma".indexOf(l=l.toLowerCase(c)))==i|i>7&s==4){r+=c;i=i>7?0:i+1;}else r+=l.isUpperCase(c)?l:l.toUpperCase(c);return r;}

น่าเกลียด แต่ก็ใช้งานได้ .. สามารถเล่นกอล์ฟได้อย่างไม่ต้องสงสัยเลย .. ฉันเป็นสนิม ..

Ungolfed:

String c(char[] a){
  String r = "";
  int i = 0,
      s;
  Character l = 'a';
  for(char c : a){
    if((s = "christma".indexOf(l = l.toLowerCase(c))) == i) | i > 7 & s == 4){
      r += c;
      i = i > 7
           ? 0
           : i+1;
    } else{
      r += l.isUpperCase(c)
       ? l
       : l.toUpperCase(c);
    }
  }
  return r;
}

รหัสทดสอบ:

ลองที่นี่

class M{
  static String c(char[]a){String r="";int i=0,s;Character l='a';for(char c:a)if((s="christma".indexOf(l=l.toLowerCase(c)))==i|i>7&s==4){r+=c;i=i>7?0:i+1;}else r+=l.isUpperCase(c)?l:l.toUpperCase(c);return r;}

  public static void main(String[] a){
    System.out.println(c("i CAN HARDLY WORK LIKE THIS please GET ME A NEW KEYBOARD FOR cHRISTMAS".toCharArray()));
    System.out.println(c("Hello World!".toCharArray()));
    System.out.println(c("I like pie :)".toCharArray()));
    System.out.println(c("hELP my KeYboarD\niS BROKEN".toCharArray()));
    System.out.println(c("cHRISTMAS IS COMING REALLY SOON!".toCharArray()));
    System.out.println(c("C is the first letter in cHRISTMAS".toCharArray()));
  }
}

เอาท์พุท:

I Can HaRdly work lIke thiS PLEASE geT Me A new keyboard for ChriStmas
hELLO wORLD!
i LIKE PIE :)
Help MY kEyBOARd
Is broken
cHRISTMAS is Coming really soon!
C IS ThE FIrST LETTER iN ChriSTMAS

2
Haskell และ C # ของ Java เต้น!
Pavel



0

C # 239 ตัวอักษร

var s=Console.ReadLine().ToCharArray();int j=0,i=0;var c="christmas";for(;j<s.Length;j++)if(s[j]==c[i%9]|s[j]==(c[i%9]-32))i++;else if(s[j]>64&s[j]<91)s[j]=(char)(s[j]+32);else if(s[j]>96&s[j]<123)s[j]=(char)(s[j]-32);Console.WriteLine(s);

รุ่นที่ชัดเจนมากขึ้น:

var s = Console.ReadLine().ToCharArray();
int j = 0,i = 0;
var c = "christmas";
for (var j = 0; j < s.Length; j++)
   if (s[j] == c[i%9]|s[j] == (c[i%9] - 32))// non case sensitive compare with c 
      i++;//next char in christmas
   else
      if (s[j] > 64 & s[j] < 91)//if between A and Z
         s[j] = (char)(s[j] + 32);//convert to a-z
      else
         if (s[j] > 96 & s[j] < 123)//if between a and z
            s[j] = (char)(s[j] - 32);//convert to A-Z
Console.WriteLine(s);

นี่เป็นคำตอบที่ไร้เดียงสาและอาจปรับปรุงได้ (เราอาจอนุญาตให้แปลงเป็นแบบถ่านโดยนัย)

มันถือว่าอยู่ภายในฟังก์ชั่นอ่านจากคอนโซล (stdin) และเขียนลงไป (stdout)

แก้ไข: Char.IsUpper (s [j]) มีความยาว 2 ไบต์มากกว่า s [j]> 64 && s [j] <91 Char.ToUpper ยาวกว่ารุ่นของฉันด้วย


0

Haskell, 222 207 Bytes

import Data.Char
s=(+(-65)).ord
f=(`divMod`32).s
l=[['a'..'z'],['A'..'Z']]
c=cycle$map s"CHRISTMAS"
k _[]=[]
k(a:b)(x:y)|isAlpha x=let(d,m)=f x in if(m==a)then(x:k b y)else(l!!d!!m:k(a:b)y)|1>0=x:k(a:b)y
main=interact$k c

updated:

import Data.Char
s=(+(-65)).ord
k _[]=[]
k(a:b)(x:y)|isAlpha x=let(d,m)=s x`divMod`32 in if(m==a)then(x:k b y)else([['a'..'z'],['A'..'Z']]!!d!!m:k(a:b)y)|1>0=x:k(a:b)y
main=interact$k$cycle$map s"CHRISTMAS"

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

s=(+(-65)).ord

sx = ค่า ASCII ของ x - ค่า ASCII ของ 'A'

f=(`divMod`32).s

f (sx) = (0, sx) สำหรับตัวพิมพ์ใหญ่, (1, (s x-32)) สำหรับตัวพิมพ์เล็ก

l=[['a'..'z'],['A'..'Z']]

รายการตัวอักษรแบบขนานสามารถจัดทำดัชนีได้โดย f (ตัวพิมพ์เล็ก -> 1-> ตัวพิมพ์ใหญ่ตัวพิมพ์ใหญ่ -> 0-> ตัวพิมพ์เล็ก)

c = cycle $ map s "CHRISTMAS"

รายการอนันต์ของค่า ascii ของตัวพิมพ์ใหญ่คริสต์มาสซ้ำ

k _ []=[]

กรณีฐาน

k (a:b) (x:y) | isAlpha x = let (d,m) =f x
                             in if m == a
                                then x : k b y
                                else (l!!d)!!m : k (a:b) y
              | 1 > 0 = x : k (a:b) y

ส่งกลับอักขระที่ไม่ใช่ตัวอักษรและตัวเลขและเก็บจดหมายไว้หากค่า s-value นั้นเหมือนกับตัวอักษรคริสต์มาสปัจจุบัน (ไปที่ตัวอักษรถัดไป) มิฉะนั้นให้แปลงเป็นกรณีอื่นและดำเนินการต่อ

main=interact$k c

IO

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.