Harflerin sayılarını kendi harfleriyle değiştir


23

Girdi olarak sayı alan bir işlev veya program yaratın ve küçük ve büyük harf alfabe için ASCII kod noktalarının karakter eşdeğerleriyle değiştirildiği bir dize çıktılar.

  • Büyük harf alfabe kod noktalarını kullanır: 65-90
  • Küçük harf alfabe kod noktalarını kullanır: 97-122

Girişteki bitişik basamaklardan herhangi biri bir harfin kod noktasına eşitse, o harf çıkış dizesindeki rakamların yerini almalıdır.

Kurallar:

  • Giriş, 1 ile 99 rakam arasında pozitif bir tamsayı olacak
  • Sadece geçerli giriş yapıldığını varsayabilirsin
  • Tamsayının başında ikame etmeye başlarsınız ( 976-> a6değil 9L)
  • Giriş herhangi bir uygun formatta olabilir (string temsili tamam)
  • Çıktı uygun herhangi bir formatta olabilir
  • Standart kurallar geçerlidir

Örnekler:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

Bayt cinsinden en kısa kod kazanır!


Liderler Sıralaması

Bu yazının altındaki Yığın Parçacığı, cevapları a) dil başına en kısa çözümün bir listesi olarak ve b) genel bir lider tablosu olarak oluşturur.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

## Ruby, <s>104</s> <s>101</s> 96 bytes


2
"Girdi, 1 ile 99 rakam arasında pozitif bir tamsayı olacak" Bildiğim hemen hemen tüm programlama dillerinde, 1 ile 99 rakam arasında bir dize olacak, çünkü 64 bitlik bir int yalnızca 19 ondalık basamağa kadar basamak ...
TJ Crowder

3
@TJCrowder Matematiksel anlamda veri tipinden ziyade tamsayı demek istediğini varsayıyorum.
Dennis,

1
@TJCrowder geçerli nokta :-) Yanılmıyorsam, 1e99 teknik olarak hala bir tamsayıdır. long intyetmez, ihtiyacın var super long int.
Stewie Griffin

1
@StewieGriffin: Hah! :-) Eminim böyle bir şeyin olduğu bir dil vardır.
TJ Crowder

Yanıtlar:


2

Jolf, 18 16 bayt

Burada dene! UpperLower işlevinin bir gün faydalı olacağını biliyordum! Değiştir óile ΢ya da sadece tercüman linki kullanınız. Bu, ISO 8859-7'de kodlanmıştır.

ρiLaΜGpwpuEdóH΅A
      pw           upper and lower
        pu         of the uppercase alphabet
     G    E        split by nothing (E = "")
    Μ      dóH     map each char to its numeric counterpart
  La               regex alternate array (e.g. La[1,2,3] => "1|2|3")
ρi            ΅A   replace input with the character code of the match (΅ is string lambda)

17

Perl, 39 38 bayt

( -pBayrak için 1 bayt eklendi .)

$"="|";s/@{[65..90,97..122]}/chr$&/ge
s/                           /          replace...
  @{[                      ]}           this string, treated as a regex:
     join"|",65..90,97..122             65|66|67|68|...|121|122
                                   /ge  ...with this string, eval()'d:
                                 $&     the entirety of the last match
                              chr       convert to char from ASCII code

İş için Doğru Alet ™.

Açıklama, onu bir bayt daha kısa (ancak biraz daha az zarif) kılan küçük bir optimizasyondan sonra (teşekkürler dev !) Modası geçmiş : $"değişken join, bir diziyi bir dizgiye enterpolasyon yaparken neyin açık olacağını gösterir , bu nedenle ayar $"="|"gereksinimini ortadan kaldırır join.

Demo:

llama@llama:~$ perl -pe '$"="|";s/@{[65..90,97..122]}/chr$&/ge' 
1234567
12345C
3456789 
345CY
9865432
bA432
6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6711110010100071111108102
Code000Golf

Sanırım $"="|"katılmak yerine ayar yaparak tek bir bayt kaydedebilirsiniz .
andlrc

Örneğin. $"="|";s/@{[65..90,97..122]}/chr$&/ge
andlrc

@ dev-null Bu işe yarıyor, teşekkürler!
Doorknob

11

Javascript, 80 bayt

s=>s.replace(/6[5-9]|[78]\d|9[0789]|1[01]\d|12[012]/g,x=>String.fromCharCode(x))

Burada eylem regex bakın: https://regex101.com/r/iX8bJ2/1

Sadece merak için, burada öğrendiğim bir şey:

Ben değiştiremem x=>String.fromCharCode(x)için String.fromCharCode çünkü ...


6

CJam, 22 bayt

q{+'[,_el^{_is@\/*}/}*

Çevrimiçi deneyin!

Arka fon

Basitçe tüm basamak gruplarının oluşumunu karşılık gelen harflerle (hangi sırayla seçersek seçelim) soldan sağa kuralına uymadıkça değiştirmek yeterli olacaktır.

Bunun yerine, giriş dizesinin tüm öneklerini oluşturabilir ve bunları oluştururken tüm olası değişiklikleri yapmaya çalışabiliriz. Başka bir kod noktasında kod noktası bulunmadığından, bu girişimlerin sırası önemli değildir.

Örneğin:

67466

6     -> 6
67    -> C
 C4   -> C4
 C46  -> C46
 C467 -> C4B

C4B

Nasıl çalışır

q                       Read all input from STDIN.
 {                  }*  Fold; push the first character, and for each subsequent
                        character, push it and do the following:
  +                       Append the character to the string on the stack.
   '[,_el^                Push the string of all ASCII letters.
                          See: http://codegolf.stackexchange.com/a/54348
          {       }/      For each ASCII letter:
           _                Push a copy of the letter.
            i               Convert to integer, i.e., compute its code point.
             s              Cast to string.
              @\            Rotate and swap.
                /           Split the modified input characters at occurrences (at
                            most one) of the string repr. of the code point.
                 *          Join, separating by the corresponding letter.

4

PHP, 110 102 101 68 67 bayt

Oldukça zor bir mücadele. Bulabildiğim en iyi şey bu. Bu tamamen yeni bir versiyondur.

for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);

Bu şekilde koş:

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • Manatwork ctype_alphayerine preg_matchthx yerine 8 byte kurtarıldı
  • 0Boş olmayan dize denetlemek yerine dize hazırlayarak 1 bayt kaydedildi : girişin son karakteri 0 olduğunda, aldığım alt dize "0" olur, bu sahte, "00" ise acımasızdır, bu yüzden son 0 yazdırmayı atlamaz.
  • strtrDönüşüm çiftleri olan bir dizi oluşturduktan sonra kullanılarak büyük 33 bayt kaydedildi
  • Kısa baskı etiketi kullanarak bir bayt kaydedildi

1
Düzenli ifadeyi #[A-Z]#işu anki “92” nin “\” içine dönüştürülmesine izin verecek şekilde değiştirmesi gerekecektir. Veya ctype_alpha()yerine deneyin preg_match(). Şimdiye kadar iş gibi görünüyor.
Manatwork

"0", which is falsy, whereas "00" is truthyİyi gidiyor PHP.
kedi

3

Python 3, 211 189 188 bayt

def f(c,i=0,n=""):
 while i<len(c):a=1;x=int(c[i:i+2]);a=2 if 64<x<91 or 96<x<100 else a;x=int(c[i:i+3]) if a<2 else x;a=3 if 99<x<123 else a;x=chr(x) if a>1 else c[i];n+=x;i+=a
 return n
  • \ N ile değiştirerek 23 bayt kurtarıldı; Dennis sayesinde

Ölçek

görüntü tanımını buraya girin


1
;Satır sonları yerine kullanırsanız , tüm döngü sırasında tek bir satıra yerleştirebilirsiniz. Ayrıca, ilk satır olabilir def f(c,i=0,n=""):.
Dennis,

1
a=1;a=2 if 64<x<91 or 96<x<100 else a-> a=1+(64<x<91or 96<x<100)etc
seequ

2

Pyth, 20 18 bayt

.Uu:G`CHHsrBG1+bZz

@Dennis ile aynı algoritma. Telefonumda Pyth’i kodlamak Jelly’den çok daha kolay.

                implicit: z=input
.U              Reduce the following lambda b, Z over z
                b is the string being built; z is the next char
   u                Reduce the following lambda G,H over +bZ
                    G is the string, H is the next letter to match
     :                  Replace
       G                in G
       ` C H            the char code of H
       H                with H
     s rB            where H takes on values:
          G              the lowercase alphabet (that's the global value of G)
          1              concatenated to its uppercased self.
     +          
       b
       Z
   z

Teşekkürler @isaacg

Burada dene .


Telefonunda bu siteden uzak kalamazsın, değil mi?
Conor O'Brien,

1
Özellikle yazdırılabilir tüm ASCII kodlama
lüksüne sahipken

1
Bu doğrudur, muhtemelen tüm bu jöle bir mola vermek güzel ... Biliyorsunuz, dengeli bir diyet;)
Conor O'Brien,

0

05AB1E , 12 bayt

õsvy«žnvyÇy:

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

Açıklama:

õ             # Push an empty string ""
 sv           # Swap to get the (implicit) input-string, and loop over its characters:
   y«         #  Append the current character to the string
     žn       #  Push builtin "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
       v      #  Inner loop over each of these letters:
           :  #   Replace in the string all occurrences (should be either 0 or 1 occurrence)
        yÇ    #   of the ordinal value of the current letter
          y   #   by this letter
              # (after the loops, implicitly output the top of the stack as result)

Küçültmeyi kullanarak 12 bayt alternatif:

Å»«žnvyÇy:]θ

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın veya yalnızca ilk 10 bayt ile adım adım bir indirim görün .

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.