КОРОТКИЙ КАЛЮЧНИЙ ФАЙСКО


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, я додав його в останню хвилину через відгуки про пісочницю, я згоден, хоча так я його видалив.
redstarcoder

Крім того, тестовий випадок 3, ви поміняли перший h, коли це в Різдво.
Атако

@ATaco, він шукає Christmasпослідовно, тому "h" ігнорується, поки не знайде "c", потім шукає "h", потім "r" тощо
redstarcoder

Відповіді:


9

05AB1E , 16 байт

Дякуємо Еміньї за збереження байта та виправлення помилки!

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 На жаль, не вдалося. Це зараз виправлено.
Аднан

2
Це схоже на мішуру. : D
Тіт

1
Вихід невірний (спробуйте, наприклад, Різдво як введення), але якщо ви видалите, uвін повинен працювати.
Емінья

1
@Izzy 05ab1e існує давно, довго.
Павло

5

V , 38 , 36 байт

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

Спробуйте в Інтернеті! (містить вхідні дані та очікуваний вихід для порівняння)

Коли я вперше побачив це, я думав, що це буде надзвичайно легко. Справді, якщо б це було не для «Різдва» помилки, це буде просто 2 байта: V~. Різдвяна помилка робить це значно важче, за дуже хакітну відповідь.

Як завжди, ось шестикутник:

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

Perl 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

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()щоб заощадити кілька байтів?
Ніл

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.
Бред Гілберт 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;}

Некрасиво, але це працює .. Однозначно, без сумніву, можна пограти в гольф більше .. Я іржавий ..

Безголівки:

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 #!
Павло

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


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]) на 2 байти довше, ніж s [j]> 64 && s [j] <91, Char.ToUpper також довший, ніж моя версія.


0

Haskell, 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 = 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"

нескінченний список значень асції великих літнього Різдва

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.