CAÇAMBA BRANCA KEY FIASCO

25

Alguns de seus funcionários quebraram as teclas de trava e você é muito barato para substituí-las. Ajude-os criando o programa mais curto possível para corrigir seu trabalho! Simplesmente converta cada caractere em uma determinada string de maiúsculas para minúsculas e vice-versa ... mas há uma diferença!

Você também está muito animado para o Natal! Então você vai deixar um pequeno "bug" que não corrige letras que estão dentro de sequências de Christmas(sem distinção entre maiúsculas e minúsculas).

Entrada

Para entrada, você usará uma única sequência (ou matriz de bytes) que pode conter novas linhas e ascii entre 0x20 e 0x7e ( - ~). Você não precisa se preocupar com retornos de carro ou com outros caracteres na cadeia.

Saída

A saída deve conter apenas a string fornecida com os caracteres maiúsculos e minúsculos trocados (e o bug do Natal, é claro!). Pode conter até um espaço em branco à direita extra.

Bug de Natal

Vamos explicar isso com um exemplo:

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

cancontém "c", que é a primeira letra do Natal, para que não seja alterado. A próxima letra em Christmasé "h", que está em hardly(que também contém o "r"), para que não seja alterada, etc. em Christmassi só tem uma letra inalterada porque, quando o código chega lá, ele está procurando por "s", não "c".

Uma vez que a sequência é encontrada, ela deve começar novamente em "c" e começar a iterar Christmasnovamente. Então, ChristmasChristmasseria deixado inalterado.

Casos de teste

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

Vencedora

Isso é então a resposta mais curta vence!

redstarcoder
fonte
5
O fato de "não haver construtores que resolvam mais o desafio" é uma restrição bastante estranha. E o 'caso de troca' realmente causará muitos problemas quando metade do desafio é identificar quais letras não estão no 'natal'?
ATaco
@ ATaco, eu adicionei no último minuto por causa do feedback na caixa de areia, mas eu concordo, então eu a removi.
Reddarcoder 19/12/16
Além disso, no caso de teste 3, você trocou o primeiro h, quando é no Natal.
ATaco
@ATaco, ele procura Christmassequencialmente, por isso "h" é ignorado até encontrar "c", então ele procura por "h", em seguida, "r", etc.
redstarcoder

Respostas:

9

05AB1E , 16 bytes

Agradecimentos a Emigna por salvar um byte e corrigir um bug!

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

Explicação:

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

Usa a codificação CP-1252 . Experimente online!

Adnan
fonte
1
Isso funciona com novas linhas?
Redstarcoder
@redstarcoder Ops, não foi. Está consertado agora.
Adnan
2
Isso parece com enfeites. : D
Titus
1
A saída não está correta (tente, por exemplo, o Natal como entrada), mas se você a remover, uela funcionará.
Emigna
1
O Izzy 05ab1e existe há muito, muito tempo.
Pavel
5

V , 38 , 36 bytes

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

Experimente online! (contém entrada e saída esperada para comparação)

Quando vi isso pela primeira vez, pensei que seria extremamente fácil. Na verdade, se não fosse para o bug "natal", este seria apenas 2 bytes: V~. O bug do natal torna significativamente mais difícil, para uma resposta muito hacky.

Como de costume, aqui está um 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~
DJMcMayhem
fonte
Gostaria de saber mais sobre V.
ckjbgames
@ckjbgames Legal, eu ficaria feliz em responder a quaisquer perguntas que você tem! Você sempre pode me mandar um ping na sala de golfe . No momento, estou trabalhando para tornar o V um pouco mais fácil de aprender / criar um tutorial.
DJMcMayhem
4

PHP, 113 110 102 bytes

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

recebe entrada do primeiro argumento da linha de comando. Corra com -r.

demolir

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
        );
Titus
fonte
2

MATL , 36 30 bytes

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

Seqüências de caracteres com novas linhas precisam ser definidas concatenando-se com o código ASCII 10(veja o exemplo no link com os casos de teste).

Experimente online! Ou verifique todos os casos de teste .

Explicação

"              % 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
Luis Mendo
fonte
2

Pyke, 31 25 bytes

FD.dґ~o@Dl3+{DIoK)R!Il3

Experimente aqui!

Azul
fonte
Isso funciona com novas linhas?
Redstarcoder 20/12/16
@redstarcoder se você escapá-los como \ne cercar a entrada, "então sim #
Blue
2

Perl 6 , 84 bytes

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

Bytes em C # 197

Não vou ganhar com isso, mas espero que a menor implementação de C # que funcione ...

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

Explicação:

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;
}
Erresen
fonte
2

JavaScript, 122 118 114 107 104 93 bytes

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 bytes de desconto, graças à @ Neil.
Washington Guedes
fonte
Você não pode usar k!=c?k:c.toUpperCase()para economizar alguns bytes?
31416 Neil
1

Perl 6 , 80 bytes

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

Tente

{   # 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
}
Brad Gilbert b2gills
fonte
Não acredito que omitir o espaço my $i=0;seja legal. E não ficaria surpreso se houvesse mais erros de sintaxe relacionados ao espaço em branco.
Bb94
1
@ bb94 Eu literalmente incluí um link para um site que executará o código. Se você não acredita que isso funcione, por que não tenta? Quero dizer que escrevi, $/ eq $/.lce não $/.lc eq $/para remover o espaço antes eq.
Brad Gilbert b2gills
@ bb94 Posso confirmar trabalhando no compilador vinculado.
Reddarcoder 20/12/16
1

Java 7, 200 bytes

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

Feio, mas funciona .. Definitivamente, sem dúvida, posso jogar mais golfe .. Estou enferrujado ..

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

Código do teste:

Experimente aqui.

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

Saída:

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
Kevin Cruijssen
fonte
2
O Java está batendo o Haskell e o C #!
Pavel
1

Python 100 bytes

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
Cormac
fonte
1

Ruby, 63 + 1 = 64 bytes

Usa a -pbandeira.

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

C # 239 caracteres

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

versão mais explícita:

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

esta é uma solução bastante ingênua e provavelmente pode ser melhorada (talvez possamos permitir a conversão implícita em char?).

ele assume estar dentro de uma função, lê no console (stdin) e grava nele (stdout).

edit: Char.IsUpper (s [j]) é 2 bytes mais longo que s [j]> 64 && s [j] <91, Char.ToUpper também é maior que minha versão.

satibel
fonte
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

Atualizada:

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"

Como funciona:

s=(+(-65)).ord

sx = valor ASCII de x - valor ASCII de 'A'

f=(`divMod`32).s

f (sx) = (0, sx) para maiúsculas, (1, (s x-32)) para minúsculas

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

lista paralela de letras, indexável por f (minúsculas-> 1-> maiúsculas, maiúsculas-> 0-> minúsculas)

c = cycle $ map s "CHRISTMAS"

lista infinita dos valores ASCII de Natal em maiúsculas repetidos

k _ []=[]

caso base

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

retorna caracteres não alfanuméricos e mantém a letra se o valor s for o mesmo que a carta de natal atual (passando para a próxima letra), caso contrário, converta-a para o outro caso e prossiga

main=interact$k c

IO

archaephyrryx
fonte