bROKEN cAPSLOCK kEY fIASCO


25

Một số nhân viên của bạn bị hỏng khóa capslock và bạn quá rẻ để thay thế chúng. Giúp họ ra bằng cách tạo ra chương trình ngắn nhất có thể để sửa công việc của họ! Đơn giản chỉ cần chuyển đổi từng ký tự trong một chuỗi nhất định từ chữ hoa sang chữ thường và ngược lại ... nhưng có một sự thay đổi!

Bạn cũng rất hào hứng cho Giáng sinh! Vì vậy, bạn sẽ để lại một "lỗi" nhỏ không đúng các chữ cái nằm trong chuỗi Christmas(không phân biệt chữ hoa chữ thường).

Đầu vào

Đối với đầu vào, bạn sẽ sử dụng một chuỗi đơn (hoặc mảng byte) có thể chứa dòng mới và ascii trong khoảng từ 0x20 đến 0x7e ( - ~). Bạn không cần phải lo lắng về lợi nhuận vận chuyển hoặc bất kỳ nhân vật nào khác trong chuỗi.

Đầu ra

Sản lượng nên chứa chỉ các chuỗi cung cấp với các ký tự chữ hoa và chữ thường hoán đổi (và lỗi Giáng dĩ nhiên!). Nó có thể chứa tối đa một khoảng trắng theo sau.

Lỗi giáng sinh

Hãy giải thích điều này bằng một ví dụ:

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

canchứa "c" là chữ cái đầu tiên của Giáng sinh, vì vậy không thay đổi. Chữ cái tiếp theo Christmaslà "h", nằm trong hardly(cũng chứa "r"), do đó không thay đổi, v.v ... Christmasbản thân nó chỉ có một chữ cái không thay đổi bởi vì khi mã đến đó, nó thực sự tìm kiếm "S", không phải "c".

Khi chuỗi được tìm thấy, nó sẽ bắt đầu lại từ "c" và bắt đầu lặp lại Christmasmột lần nữa. Vì vậy, ChristmasChristmassẽ được giữ nguyên.

Các trường hợp thử nghiệm

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

Người chiến thắng

Đây là nên câu trả lời ngắn nhất sẽ thắng!


5
Điều đó 'không được xây dựng để giải quyết hầu hết các thách thức' là một hạn chế khá kỳ lạ. Và 'trường hợp hoán đổi' có thực sự gây ra nhiều vấn đề không khi một nửa thách thức là xác định những chữ cái nào không có trong 'giáng sinh'?
ATaco


@ATaco, tôi đã thêm nó vào phút cuối vì phản hồi trên hộp cát, tôi đồng ý mặc dù vậy tôi đã gỡ bỏ nó.
redstarcoder

Ngoài ra, Test case 3, bạn đã hoán đổi h đầu tiên, khi đó là vào Giáng sinh.
ATaco

@ATaco, nó tìm kiếm Christmastheo thứ tự, vì vậy "h" bị bỏ qua cho đến khi tìm thấy "c", sau đó tìm "h", sau đó "r", v.v.
redstarcoder

Câu trả lời:


9

05AB1E , 16 byte

Cảm ơn Emigna đã lưu một byte và sửa lỗi!

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

Giải trình:

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

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


1
Điều này có làm việc với các dòng mới?
redstarcoder

@redstarcoder Rất tiếc, không. Bây giờ nó đã được sửa.
Ad Nam

2
Điều này trông giống như tinsel. : D
Tít

1
Đầu ra không chính xác (ví dụ như Giáng sinh là đầu vào), nhưng nếu bạn loại bỏ uthì nó sẽ hoạt động.
Emigna

1
@Izzy 05ab1e đã tồn tại từ lâu.
Pavel

5

V , 38 , 36 byte

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

Hãy thử trực tuyến! (chứa đầu vào và đầu ra dự kiến ​​để so sánh)

Khi tôi lần đầu tiên nhìn thấy điều này, tôi nghĩ rằng nó sẽ cực kỳ dễ dàng. Trong thực tế, nếu không phải là lỗi "giáng sinh", thì đây chỉ là 2 byte : V~. Các lỗi Giáng sinh làm cho nó khó khăn hơn đáng kể, cho một câu trả lời rất hacky.

Như thường lệ, đây là một 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~

Tôi rất muốn biết thêm về V.
ckjbgames

@ckjbgames Thật tuyệt, tôi rất sẵn lòng trả lời bất kỳ câu hỏi nào của bạn! Bạn luôn có thể ping tôi trong phòng golf vim . Ngay bây giờ tôi đang làm việc để làm cho V dễ dàng hơn một chút để tìm hiểu / tạo một hướng dẫn.
DJMcMayhem

4

PHP, 113 110 102 byte

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

lấy đầu vào từ đối số dòng lệnh đầu tiên. Chạy với -r.

phá vỡ

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 byte

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

Các chuỗi có dòng mới cần được xác định bằng cách nối với mã ASCII 10(xem ví dụ trong liên kết với các trường hợp thử nghiệm).

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

"              % 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 byte

Sẽ không chiến thắng với điều này, nhưng hy vọng việc triển khai C # nhỏ nhất hoạt động ...

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

Giải trình:

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 byte

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

  • Tắt 11 byte cảm ơn @Neil.

Bạn không thể sử dụng k!=c?k:c.toUpperCase()để tiết kiệm cho bạn một vài byte?
Neil

1

Perl 6 , 80 byte

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

Thử nó

{   # 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
}

Tôi không tin bỏ qua không gian trong my $i=0;là hợp pháp. Và tôi sẽ không ngạc nhiên nếu có nhiều lỗi cú pháp liên quan đến khoảng trắng.
bb94

1
@ bb94 Tôi thực sự bao gồm một liên kết đến một trang web sẽ chạy mã. Nếu bạn không tin rằng nó sẽ chạy, tại sao bạn không thử nó. Ý tôi là tôi đã viết $/ eq $/.lcchứ không phải $/.lc eq $/để tôi có thể xóa khoảng trống trước đó eq.
Brad Gilbert b2gills

@ bb94 Tôi có thể xác nhận nó hoạt động trên trình biên dịch được liên kết.
redstarcoder

1

Java 7, 200 byte

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

Xấu xí, nhưng nó hoạt động .. Chắc chắn có thể không nghi ngờ gì nữa là bị đánh gôn nhiều hơn .. Tôi đang hoen rỉ ..

Ung dung:

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

Mã kiểm tra:

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

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()));
  }
}

Đầu ra:

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
Java đang đánh Haskell và C #!
Pavel

1

Python 100 byte

def a(s,i=0,g=''):
 for c in s:a=c.lower()=='christmas'[i%9];i+=a;g+=[c.swapcase(),c][a]
 return g

1

Ruby, 63 + 1 = 64 byte

Sử dụng -pcờ.

i=0;gsub(/./){|c|c=~/#{"christmas"[i%9]}/i?(i+=1;c):c.swapcase}

0

C # 239 ký tự

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

phiên bản rõ ràng hơn:

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

đây là một giải pháp khá ngây thơ và có lẽ có thể được cải thiện (có lẽ chúng ta có thể cho phép chuyển đổi ngầm thành char?).

nó giả sử là bên trong một hàm, đọc từ bàn điều khiển (stdin) và ghi vào nó (stdout).

chỉnh sửa: Char.IsUpper (s [j]) dài hơn 2 byte so với s [j]> 64 && s [j] <91, Char.ToUpper cũng dài hơn phiên bản của tôi.


0

Haskell, 222 207 byte

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

đã cập nhật:

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"

Làm thế nào nó hoạt động:

s=(+(-65)).ord

sx = giá trị ASCII của x - Giá trị ASCII của 'A'

f=(`divMod`32).s

f (sx) = (0, sx) cho chữ hoa, (1, (s x-32)) cho chữ thường

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

danh sách các chữ cái song song, có thể lập chỉ mục bằng f (chữ thường-> 1-> chữ hoa, chữ hoa-> 0-> chữ thường)

c = cycle $ map s "CHRISTMAS"

danh sách vô hạn của các giá trị ascii của chữ hoa Giáng sinh lặp đi lặp lại

k _ []=[]

trường hợp cơ sở

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

trả về các ký tự không phải là chữ và số và giữ chữ cái nếu giá trị s của nó giống với chữ cái giáng sinh hiện tại (chuyển sang chữ cái tiếp theo), nếu không thì chuyển nó sang trường hợp khác và tiếp tục

main=interact$k c

Tôi

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.