BROKEN CAPSLOCK KEY FIASCO

25

Einige Ihrer Mitarbeiter haben kaputte Schlüssel und Sie sind zu billig, um sie zu ersetzen. Helfen Sie ihnen, indem Sie das kürzestmögliche Programm erstellen, um ihre Arbeit zu korrigieren! Konvertieren Sie einfach jedes Zeichen in einer bestimmten Zeichenfolge von Groß- in Kleinbuchstaben und umgekehrt ... aber es gibt eine Wendung!

Du freust dich auch sehr auf Weihnachten! Sie werden also in einem winzigen "Fehler" zurückbleiben, der Buchstaben nicht korrigiert, die in der Reihenfolge Christmas(ohne Berücksichtigung der Groß- / Kleinschreibung) liegen.

Eingang

Für die Eingabe verwenden Sie eine einzelne Zeichenfolge (oder ein Byte-Array), die Zeilenumbrüche und ASCII-Werte zwischen 0x20 und 0x7e ( - ~) enthalten kann. Sie müssen sich keine Gedanken über Wagenrückläufe oder andere Zeichen in der Zeichenfolge machen.

Ausgabe

Die Ausgabe sollte nur die bereitgestellte Zeichenfolge mit vertauschten Groß- und Kleinbuchstaben enthalten (und natürlich den Weihnachtsfehler!). Es kann bis zu einem zusätzlichen nachgestellten Leerzeichen enthalten.

Weihnachtswanze

Lassen Sie uns dies an einem Beispiel erklären:

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

canenthält "c", das der erste Buchstabe von Weihnachten ist, also wird das nicht geändert. Der nächste Buchstabe in Christmasist "h", der in ist hardly(der auch das "r" enthält), so dass sich nichts ändert, usw. Christmasselbst hat nur einen Buchstaben unverändert, weil er tatsächlich sucht, bis der Code dort ankommt "s", nicht "c".

Sobald die Sequenz gefunden ist, sollte sie bei "c" von vorne beginnen und erneut durchlaufen Christmaswerden. So ChristmasChristmaswürden unverändert gelassen.

Testfälle

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

Gewinner

Das ist also gewinnt die kürzeste Antwort!

redstarcoder
quelle
5
Das "keine eingebauten Ins, die die meisten Herausforderungen lösen" ist eine ziemlich seltsame Einschränkung. Und wird "Swap Case" wirklich so viele Probleme verursachen, wenn die halbe Herausforderung darin besteht, zu identifizieren, welche Buchstaben nicht in "Weihnachten" sind?
ATaco
@ATaco, ich habe es in letzter Minute wegen des Feedbacks zur Sandbox hinzugefügt. Ich stimme jedoch zu, also habe ich es entfernt.
Redstarcoder
Außerdem, Testfall 3, hast du die erste Stunde getauscht, wenn das Weihnachten ist.
ATaco
@ATaco, es sucht Christmassequenziell, so dass "h" ignoriert wird, bis es "c" findet, dann sucht es nach "h", dann "r" usw.
redstarcoder

Antworten:

9

05AB1E , 16 Bytes

Vielen Dank an Emigna für das Speichern eines Bytes und das Beheben eines Fehlers!

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

Erläuterung:

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

Verwendet die CP-1252- Codierung. Probieren Sie es online!

Adnan
quelle
1
Funktioniert das mit Newlines?
Redstarcoder
@redstarcoder Hoppla, das hat es nicht getan. Es ist jetzt behoben.
Adnan
2
Das sieht aus wie Lametta. : D
Titus
1
Die Ausgabe ist nicht korrekt (versuchen Sie zum Beispiel Weihnachten als Eingabe), aber wenn Sie es entfernen u, sollte es funktionieren.
Emigna
1
@ Izzy 05ab1e gibt es schon lange, lange.
Pavel
5

V , 38 , 36 Bytes

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

Probieren Sie es online! (enthält Eingabe und erwartete Ausgabe zum Vergleich)

Als ich das zum ersten Mal sah, dachte ich, dass es extrem einfach sein würde. Wenn es nicht für den „christmas“ Bug ist, wäre dies in der Tat sein , nur 2 Bytes: V~. Der Weihnachtsfehler macht es für eine sehr abgedroschene Antwort bedeutend schwerer.

Wie immer ist hier ein 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
quelle
Ich würde gerne mehr über V.
ckjbgames erfahren
@ckjbgames Cool, ich würde gerne alle Fragen beantworten, die Sie haben! Sie können mich immer im Vim-Golf-Raum anpingen . Im Moment arbeite ich daran, V ein bisschen leichter zu lernen / ein Tutorial zu erstellen.
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);

Nimmt Eingaben vom ersten Befehlszeilenargument entgegen. Laufen Sie mit -r.

Nervenzusammenbruch

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

MATL , 36 30 Bytes

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

Zeichenfolgen mit Zeilenumbrüchen müssen durch Verketten mit dem ASCII-Code definiert werden 10(siehe Beispiel im Link zu den Testfällen).

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

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

Pyke, 31 25 Bytes

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

Probieren Sie es hier aus!

Blau
quelle
Funktioniert das mit Newlines?
Redstarcoder
@redstarcoder, wenn Sie sie als zu entkommen \nund die Eingabe in "dann ja umgeben
Blue
2

Perl 6 , 84 Bytes

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

C # 197 Bytes

Ich werde damit nicht gewinnen, aber hoffentlich die kleinste C # -Implementierung, die funktioniert ...

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

Erläuterung:

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
quelle
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 weg danke @Neil.
Washington Guedes
quelle
Kannst du nicht k!=c?k:c.toUpperCase()ein paar Bytes sparen?
Neil
1

Perl 6 , 80 Bytes

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

Versuch es

{   # 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
quelle
Ich glaube nicht, dass das Weglassen des Leerzeichens my $i=0;legal ist. Und ich wäre nicht überrascht, wenn es mehr mit Leerzeichen zusammenhängende Syntaxfehler gäbe.
BB94
1
@ bb94 Ich habe buchstäblich einen Link zu einer Site eingefügt, auf der der Code ausgeführt wird. Wenn du nicht glaubst, dass das klappt, warum versuchst du es nicht? Ich meine, ich habe $/ eq $/.lceher geschrieben, als $/.lc eq $/dass ich das Leerzeichen vorher entfernen könnte eq.
Brad Gilbert b2gills
@ bb94 Ich kann bestätigen, dass es auf dem verlinkten Compiler funktioniert.
Redstarcoder
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;}

Hässlich, aber es funktioniert .. Kann definitiv ohne Zweifel mehr golfen werden .. Ich bin rostig ..

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

Testcode:

Probieren Sie es hier aus.

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

Ausgabe:

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
quelle
2
Java schlägt Haskell und 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
quelle
1

Ruby, 63 + 1 = 64 Bytes

Verwendet die -pFlagge.

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

C # 239 Zeichen

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

explizitere Version:

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

Dies ist eine ziemlich naive Lösung und kann wahrscheinlich verbessert werden (vielleicht können wir die implizite Konvertierung in char zulassen?).

Es setzt voraus, dass es sich in einer Funktion befindet, liest von der Konsole (stdin) und schreibt darauf (stdout).

edit: Char.IsUpper (s [j]) ist 2 Bytes länger als s [j]> 64 && s [j] <91, Char.ToUpper ist auch länger als meine Version.

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

aktualisiert:

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"

Wie es funktioniert:

s=(+(-65)).ord

sx = ASCII-Wert von x - ASCII-Wert von 'A'

f=(`divMod`32).s

f (sx) = (0, sx) für Großbuchstaben, (1, (s x-32)) für Kleinbuchstaben

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

parallele Buchstabenliste, indizierbar durch f (Kleinbuchstaben-> 1-> Großbuchstaben, Großbuchstaben-> 0-> Kleinbuchstaben)

c = cycle $ map s "CHRISTMAS"

unendliche Liste der ASCII-Werte von Weihnachten in Großbuchstaben wiederholt

k _ []=[]

Grundfall

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

Geben Sie nicht-alphanumerische Zeichen zurück und behalten Sie den Buchstaben entweder bei, wenn sein s-Wert mit dem aktuellen Weihnachtsbuchstaben übereinstimmt (zum nächsten Buchstaben übergehen), oder konvertieren Sie ihn in den anderen Groß- / Kleinschreibungstyp und fahren Sie fort

main=interact$k c

IO

Archaephyrryx
quelle