ANAHTAR KAPLANMIŞ ANAHTAR FIASCO


25

Çalışanlarınızdan bazıları, kapak kilidi tuşlarını kırdı ve bunları değiştirmek için çok ucuzsunuz. Çalışmalarını düzeltmek için mümkün olan en kısa programı oluşturarak onlara yardım edin! Belirli bir dizgede her karakteri büyük harften küçük harfe ve tam tersine dönüştürmeniz yeterlidir, ancak bir bükülme var!

Noel için de çok heyecanlısın! Böylece, dizileri içindeki harfleri düzeltmeyen küçük bir "böcek" içinde bırakacaksınız (büyük küçük harf Christmasduyarlı).

Giriş

Girdi için, 0x20 ve 0x7e ( - ~) arasında yeni satırlar ve ascii içerebilecek tek bir dize (veya bayt dizisi) kullanacaksınız . Satır iadeleri veya dizgede olan diğer karakterler için endişelenmenize gerek yok.

Çıktı

Çıktı yalnızca sağlanan büyük ve küçük harf karakterleri (ve tabii ki Noel böceği!) Değiştirilen dizgiyi içermelidir . Bir ekstra en fazla iz bırakabilen boşluk içerebilir.

Noel Böceği

Bunu bir örnekle açıklayalım:

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

canNoel'in ilk harfi olan "c" yi içerir, bu yüzden değişmez. Sonraki harf Christmasise "h" dir hardlyo değişmez, böylece (aynı zamanda "r" içerir), vb Christmasçünkü orada kod ulaştığında, aslında aradığı zaman kendisi sadece bir harf değişmeden vardır "s", "c" değil.

Dizi bulunduktan sonra tekrar "c" de başlamalı ve bir Christmaskez daha yinelemeye başlamalıdır . Böylece ChristmasChristmasdeğişmeden kalır.

Test Kılıfları

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

kazanan

Bu yani en kısa cevap kazanır!


5
'En zoru çözen hiçbir yerleşik yapı' oldukça tuhaf bir kısıtlama. Ve 'takas davası' gerçekten zorluğun yarısı hangi harflerin 'noel'de' olmadığını belirlerken birçok meseleye neden olacak mı?
ATaco


@ATaco, bunu son dakikaya ekledim çünkü sandbox hakkındaki geri bildirimlerimden dolayı kabul ettim ancak bu yüzden kaldırdım.
redstarcoder

Ayrıca, Test davası 3, Noel’deyken ilk saatte değiştirdiniz.
ATaco

@ATaco, sırayla arar Christmas, bu nedenle "h", "c" yi bulana kadar yok sayılır, sonra "h", sonra "r", vb.
Arar

Yanıtlar:


9

05AB1E , 16 bayt

Bir bayt tasarrufu ve bir hatayı düzeltmek için Emigna için teşekkürler !

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

Açıklama:

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 kodlamasını kullanır . Çevrimiçi deneyin!


1
Bu newlines ile çalışır mı?
redstarcoder

@ redstarcoder Hata, olmadı. Şimdi düzeltildi.
Adnan

2
Bu sadece gelin teli gibi görünüyor. : D
Titus

1
Çıktı doğru değil (örneğin Noel'i giriş olarak deneyin ), ancak kaldırırsanız uçalışması gerekir.
Emigna,

1
@Izzy 05ab1e uzun, uzun zamandır var.
Pavel,

5

V , 38 , 36 bayt

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

Çevrimiçi deneyin! (karşılaştırma için girdi ve beklenen çıktıyı içerir)

Bunu ilk gördüğümde çok kolay olacağını düşündüm. O "Noel" hata olmasaydı Aslında, bu sadece 2 bayt olacaktır: V~. Noel böceği, çok kaba bir cevap için, önemli ölçüde zorlaştırır.

Her zamanki gibi, işte bir 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. hakkında daha fazla bilgi edinmek isterdim
ckjbgames

@ckjbgames Harika, herhangi bir sorunuza cevap vermekten mutluluk duyarım! Beni her zaman golf sahasında ping edebilirsin . Şu anda bir öğretici öğrenmek / oluşturmak için V'i biraz daha kolaylaştırmak için çalışıyorum.
DJMcMayhem

4

PHP, 113 110 102 bayt

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

ilk komut satırı argümanından girdi alır. İle koş -r.

Yıkmak

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 bayt

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

Yeni satırlı dizgelerin ASCII koduyla birleştirilerek tanımlanması gerekir 10(test durumlarıyla bağlantıdaki örneğe bakın).

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

"              % 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 bayt

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

2

C # 197 bayt

Bununla kazanamayacaksınız, ama umarım en küçük C # uygulaması ...

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

Açıklama:

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 bayt

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 bayt kapalı teşekkürler @ Neil.

k!=c?k:c.toUpperCase()Seni bir kaç bayttan kurtarmak için kullanamaz mısın?
Neil

1

Perl 6 , 80 bayt

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

Dene

{   # 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
}

Boş bırakmanın my $i=0;yasal olduğuna inanmıyorum . Daha fazla boşlukla ilgili sözdizimi hatası olsaydı, ben de şaşırmam.
bb94

1
@ bb94 Kelimenin tam anlamıyla kodu çalıştıracak bir siteye bir bağlantı dahil. Bunun çalışacağına inanmıyorsan, neden denemiyorsun. Demek istediğim, $/ eq $/.lcdaha $/.lc eq $/önce alanı kaldırabilmek için değil de yazdım eq.
Brad Gilbert,

@ bb94 Bağlantılı derleyici üzerinde çalıştığını onaylayabilirim.
redstarcoder

1

Java 7, 200 bayt

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

Çirkin, ama işe yarıyor .. Kesinlikle hiç şüphesiz daha fazla golf olabilir .. Paslıyım ..

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

Test kodu:

Burada dene.

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

Çıktı:

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
Java'nın Haskell ve C #!
Pavel,

1

Python 100 bayt

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

Ruby, 63 + 1 = 64 bayt

-pBayrağı kullanır .

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

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

daha açık sürüm:

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

bu oldukça naif bir çözümdür ve muhtemelen daha da geliştirilebilir (belki de karaktere örtük dönüştürmeye izin verebiliriz?).

bir fonksiyonun içinde olduğunu varsayar, konsoldan okur (stdin) ve ona yazar (stdout).

düzenleme: Char.IsUpper (s [j]) s [j]> 64 && s [j] <91'den 2 bayt, Char.ToUpper da benim sürümümden daha uzun.


0

Haskell, 222 207 Bayt

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

güncellenmiş:

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"

Nasıl çalışır:

s=(+(-65)).ord

sx = ASCII değeri x - 'A' ASCII değeri

f=(`divMod`32).s

f (sx) = (0, sx) büyük harf için, (1, (s x-32)) küçük harf için

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

f ile indekslenebilir harflerin paralel listesi (küçük harf-> 1-> büyük harf, büyük harf-> 0-> küçük harf)

c = cycle $ map s "CHRISTMAS"

tekrarlanan büyük noelin ascii değerlerinin sonsuz listesi

k _ []=[]

temel durum

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

alfasayısal olmayan karakterleri döndürür ve s değeri, geçerli Noel harfiyle aynıysa (bir sonraki harfe gider) harfini korur, aksi takdirde diğer harfe dönüştürür ve devam eder.

main=interact$k c

IO

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.