브로큰 카프 록 키


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.