브로큰 카프 록 키


25

직원 중 일부가 자물쇠 열쇠를 뜯어 교체하기에 너무 비쌉니다. 작업을 바로 잡을 수있는 가장 짧은 프로그램을 만들어 그들을 도와주세요! 주어진 문자열의 각 문자를 대문자에서 소문자로 또는 그 반대로 변환하기 만하면됩니다.

당신은 또한 크리스마스에 매우 흥분합니다! 따라서 Christmas(대소 문자를 구분하지 않는) 시퀀스 내에있는 문자를 수정하지 않는 작은 "버그"를 남겨 두어야 합니다.

입력

입력을 위해 0x20과 0x7e ( - ~) 사이의 줄 바꿈과 ASCII가 포함될 수있는 단일 문자열 (또는 바이트 배열 )을 사용합니다. 캐리지 리턴 또는 문자열에 다른 문자가 있을지 걱정할 필요가 없습니다.

산출

출력에는 대문자와 소문자가 바뀐 제공된 문자열 만 포함해야합니다 (물론 크리스마스 버그!). 최대 1 개의 추가 공백이 포함될 수 있습니다.

크리스마스 버그

이를 예로 들어 설명하겠습니다.

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되지 않습니다. 코드 자체에 도달 할 때까지 실제로는 한 문자 만 변경됩니다. "c"가 아닌 "s"

시퀀스가 발견되면 "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", "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 쿨, 나는 당신이 가진 질문에 답변 드리겠습니다! 당신은 항상 vim-golf 방 에서 나를 핑할 수 있습니다 . 지금은 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

펄 6 , 84 바이트

{my $i=0;[~] (.lc~~"christmas".comb[$i%9]??(++$i&&$_)!!.ord>90??.uc!!.lc for .comb)}

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

자바 스크립트, 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`)

  • @Neil 덕분에 11 바이트가 줄었습니다.

k!=c?k:c.toUpperCase()몇 바이트를 절약 하는 데 사용할 수 없습니까 ?
— Neil

1

펄 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

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

못생긴,하지만 작동합니다. 의심의 여지없이 더 많은 골프를하실 수 있습니다.

언 골프 드 :

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
자바의 하스켈과 C #!
— Pavel

1

파이썬 100 바이트

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

루비, 63 + 1 = 64 바이트

-p플래그를 사용합니다 .

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

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

이것은 매우 순진한 솔루션이며 아마도 향상 될 수 있습니다 (어쩌면 char로 암시 적 변환을 허용 할 수 있습니까?).

함수 내부에 있다고 가정하고 콘솔에서 읽고 (stdin) 쓰고 (stdout) 씁니다.

편집 : Char.IsUpper (s [j])는 s [j]> 64 && s [j] <91보다 2 바이트 더 길고 Char.ToUpper도 내 버전보다 깁니다.


0

하스켈 222 207 바이트

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

업데이트 :

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 = x의 ASCII 값- 'A'의 ASCII 값

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"

대문자 크리스마스의 아스키 값에 대한 무한 목록 반복

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- 값이 크리스마스의 현재 문자와 같으면 문자를 유지하고 (다음 문자로 이동) 그렇지 않으면 다른 문자로 변환하고 계속 진행하십시오.

main=interact$k c

IO

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.