bROKEN cAPSLOCK kEY fIASCO

25

Beberapa karyawan Anda memiliki kunci capslock yang rusak dan Anda terlalu murah untuk menggantinya. Bantu mereka dengan membuat program sesingkat mungkin untuk memperbaiki pekerjaan mereka! Cukup konversi setiap karakter dalam string yang diberikan dari huruf besar ke huruf kecil dan sebaliknya ... tapi ada twist!

Anda juga sangat bersemangat untuk Natal! Jadi, Anda akan meninggalkan "bug" kecil yang tidak memperbaiki huruf yang berada dalam urutan Christmas(tidak peka huruf besar-kecil).

Memasukkan

Untuk input Anda akan menggunakan satu string tunggal (atau array byte) yang mungkin berisi baris baru dan ascii antara 0x20 dan 0x7e ( - ~). Anda tidak perlu khawatir tentang carriage return atau karakter lain yang ada di string.

Keluaran

Keluaran seharusnya hanya berisi string yang disediakan dengan karakter huruf besar dan kecil bertukar (dan bug Natal tentu saja!). Ini dapat berisi hingga satu spasi tambahan ekstra.

Bug Natal

Mari kita jelaskan ini dengan sebuah contoh:

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

canberisi "c" yang merupakan huruf pertama Natal, sehingga tidak berubah. Huruf berikutnya Christmasadalah "h", yang ada di hardly(yang juga berisi "r"), sehingga tidak berubah, dll. Itu Christmassendiri hanya memiliki satu huruf tidak berubah karena pada saat kode mencapai sana, itu sebenarnya mencari "s", bukan "c".

Setelah urutan ditemukan, ia harus mulai dari awal lagi pada "c", dan mulai mengulangi Christmassekali lagi. Jadi ChristmasChristmasakan dibiarkan tidak berubah.

Uji Kasus

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

Pemenang

Ini adalah sehingga jawaban terpendek menang!

redstarcoder
sumber
5
Bahwa 'tidak ada orang dalam yang paling menyelesaikan tantangan' adalah batasan yang cukup aneh. Dan apakah 'swap case' benar-benar akan menyebabkan banyak masalah ketika setengah dari tantangannya adalah mengidentifikasi huruf mana yang tidak ada di 'natal'?
ATaco
@ATaco, saya menambahkannya di menit terakhir karena umpan balik di kotak pasir, saya setuju jadi saya sudah menghapusnya.
redstarcoder
Juga, Uji kasus 3, Anda bertukar jam pertama, saat itu sedang Natal.
ATaco
@ATaco, ia mencari secara berurutan, Christmasjadi "h" diabaikan sampai menemukan "c", lalu mencari "h", lalu "r", dll.
redstarcoder

Jawaban:

9

05AB1E , 16 byte

Terima kasih kepada Emigna karena menyimpan byte dan memperbaiki bug!

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

Penjelasan:

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

Menggunakan pengkodean CP-1252 . Cobalah online!

Adnan
sumber
1
Apakah ini bekerja dengan baris baru?
redstarcoder
@ redstarcoder Ups, tidak. Sudah diperbaiki sekarang.
Adnan
2
Ini terlihat seperti perada. : D
Titus
1
Outputnya tidak benar (coba misalnya Natal sebagai input), tetapi jika Anda menghapusnya uakan berfungsi.
Emigna
1
@Izzy 05ab1e telah ada untuk waktu yang sangat lama.
Pavel
5

V , 38 , 36 byte

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

Cobalah online! (mengandung input dan output yang diharapkan untuk perbandingan)

Ketika saya pertama kali melihat ini, saya pikir itu akan sangat mudah. Bahkan, jika bukan untuk "Natal" bug, ini akan hanya menjadi 2 bytes: V~. Bug natal membuatnya jauh lebih sulit, untuk jawaban yang sangat rumit.

Seperti biasa, ini 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
sumber
Saya ingin tahu lebih banyak tentang V.
ckjbgames
@ckjbgames Keren, saya akan dengan senang hati menjawab pertanyaan yang Anda miliki! Anda selalu bisa ping saya di ruang vim-golf . Saat ini saya sedang berupaya membuat V sedikit lebih mudah untuk belajar / membuat tutorial.
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);

mengambil input dari argumen baris perintah pertama. Jalankan dengan -r.

kerusakan

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
sumber
2

MATL , 36 30 byte

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

String dengan baris baru perlu didefinisikan dengan menyatukan dengan kode ASCII 10(lihat contoh di tautan dengan kasus uji).

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

"              % 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
sumber
2

Pyke, 31 25 byte

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

Coba di sini!

Biru
sumber
Apakah ini bekerja dengan baris baru?
redstarcoder
@redstarcoder jika Anda menghindarinya \ndan mengelilingi input "maka ya
Biru
2

Perl 6 , 84 byte

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

C # 197 byte

Tidak akan menang dengan ini, tapi semoga implementasi C # terkecil yang bekerja ...

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

Penjelasan:

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

  • Off 11 byte terima kasih @Neil.
Washington Guedes
sumber
Tidak bisakah Anda menggunakan k!=c?k:c.toUpperCase()untuk menghemat beberapa byte?
Neil
1

Perl 6 , 80 byte

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

Cobalah

{   # 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
sumber
Saya tidak percaya menghilangkan ruang my $i=0;itu legal. Dan saya tidak akan terkejut jika ada lebih banyak kesalahan sintaksis terkait ruang putih.
bb94
1
@ bb94 Saya benar-benar menyertakan tautan ke situs yang akan menjalankan kodenya. Jika Anda tidak percaya itu akan berjalan, mengapa Anda tidak mencobanya. Maksud saya, saya menulis $/ eq $/.lcdaripada $/.lc eq $/supaya saya bisa menghapus spasi sebelumnya eq.
Brad Gilbert b2gills
@ bb94 Saya bisa mengkonfirmasinya bekerja pada kompilator yang ditautkan.
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;}

Jelek, tapi berhasil .. Pasti bisa dipastikan lagi main golf .. Aku berkarat ..

Tidak Disatukan:

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

Kode uji:

Coba di sini.

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

Keluaran:

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
sumber
2
Java mengalahkan Haskell dan 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
Cormac
sumber
1

Ruby, 63 + 1 = 64 byte

Menggunakan -pbendera.

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

C # 239 karakter

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

versi yang lebih eksplisit:

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

ini adalah solusi yang cukup naif, dan mungkin dapat ditingkatkan (mungkin kita dapat mengizinkan konversi implisit ke char?).

ia menganggap berada di dalam suatu fungsi, membaca dari konsol (stdin), dan menulis ke sana (stdout).

sunting: Char.IsUpper (s [j]) lebih panjang 2 byte dari s [j]> 64 && s [j] <91, Char.ToUpper lebih panjang dari versi saya juga.

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

diperbarui:

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"

Bagaimana itu bekerja:

s=(+(-65)).ord

sx = Nilai ASCII dari x - Nilai ASCII dari 'A'

f=(`divMod`32).s

f (sx) = (0, sx) untuk huruf besar, (1, (s x-32)) untuk huruf kecil

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

daftar huruf paralel, dapat diindeks oleh f (huruf kecil-> 1-> huruf besar, huruf besar-> 0-> huruf kecil)

c = cycle $ map s "CHRISTMAS"

daftar tak terbatas nilai ascii natal huruf besar diulang

k _ []=[]

kasus dasar

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

mengembalikan karakter non-alfanumerik, dan baik menyimpan surat itu jika nilainya sama dengan surat natal saat ini (pergi ke surat berikutnya), jika tidak ubahlah ke kasus lain dan lanjutkan

main=interact$k c

IO

archaephyrryx
sumber