Bir Harfte Sayıları Harfe ve Tersi Şekillere Dönüştür


12

Bir sayı listesine ve eşdeğer harflerine dayanarak, bir dize girişi alın, o dizenin karakterlerini eşdeğer sayı / harfle değiştirin ve sonucu alın.

Liste

  • 1 = a
  • 2 = b
  • 3 = c
  • 4 = d
  • 5 = e
  • 6 = f
  • 7 = g
  • 8 = s
  • 9 = i
  • 0 = j

Giriş

thisisastring1124

Çıktı

t89s9s1str9n7aabd

kurallar

  • Sayılar yalnızca küçük harflere eşittir.
  • Listenin dışındaki tüm karakterler olduğu gibi bırakılacaktır.
  • Giriş dizesi boşluk içermemelidir.
  • Tam programa veya işleve izin verilir.
  • Kod golf olduğu için en az bayt kazanır.

2
PPCG'ye hoş geldiniz. Güzel meydan okuma!
Adám

2
Bunun yerine büyük harfleri değiştirebilir miyiz?
Adám

Yalnızca küçük harfler, büyük harfler listenin dışında kalır.
Noir Antares

Giriş yalnızca harfler ve rakamlar içerecek mi, yoksa diğer boşluk olmayan karakterler (örn. Noktalama işaretleri) içeriyor olabilir mi?
sundar - Monica'yı

Giriş dizesi, boşluklar dışında başka bir karakter içerebilir, ancak listenin dışındaki herhangi bir şey çıkış dizesinde dokunulmaz.
Noir Antares

Yanıtlar:







5

Retina 0.8.2 , 12 bayt

T`a-j09-1`Ro

Çevrimiçi deneyin! Açıklama:

T``

Harf çevirisi gerçekleştirin.

a-j09-1

Kaynak listesi harflerdir a-j, sonra 0rakamlardır 9-1.

Ro

Hedef listesi, ters çevrilmiş kaynak listesidir, yani rakamlar 1-9, ardından 0harfler j-a.





3

R , 40 bayt

function(s)chartr("0-9ja-i","ja-i0-9",s)

Çevrimiçi deneyin!

Şaşırtıcı bir şekilde, R, bu tür mücadelesinde iyi, çünkü Bash cevabındatr olduğu gibi benzer bir işlevi var . Neden var olduğu hakkında hiçbir fikrim yok, ama bunun için minnettarım!


İnanılmaz! Chartr () regex anladı bilmiyordum.
snoram

@snoram oldukça normal değil; o belirten belgelerinde olduğu "Aralıkları şartnamede desteklenir, ancak karakter sınıfları ve tekrarlanan karakterler değiliz."
Giuseppe

3

MS-SQL, 71 bayt

SELECT TRANSLATE(v,'1234567890abcdefghij','abcdefghij1234567890')FROM t

Yeni SQL 2017 işlevi TRANSLATEbireysel karakter değiştirme gerçekleştirdiğinden, bu amaç için idealdir. Bkz önceki meydan benim benzer bir cevap .

Girdi önceden var olan bir tablo yoluyladır t varchar sütunu ile v , bizim ES kurallarına göre . Yalnızca küçük harfleri değiştirmek için, tablo büyük / küçük harfe duyarlı bir harmanlama kullanılarak oluşturulmalıdır :

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)


2

Pyth , 13 bayt

Xz+jk+0_S9<GT

Burada deneyin!

açıklama

Xz+jk+0_S9<GT – Full program.
       _S9    – Yield [9, 8, 7, ..., 1]
     +0       – Prepend a 0.
   jk         – Join to a single string.
  +       <GT – And append the first 10 letters of the alphabet to it.
                Yields 0987654321abcdefghij.
Xz            – Transliterates the input from the above to the above reversed.


1

REXX, 57 bayt

#=1234567890
a='abcdefghij'
say translate(arg(1),a #,# a)

1

C (gcc) , 81 72 bayt

Öneriler için Giacomo Garabello'ya teşekkürler.

f(char*s){for(;*s++=*s-97U<11?(*s-6)%10+48:*s-48U<11?(*s-9)%10+97:*s;);}

Çevrimiçi deneyin!


Sen girdi dizesini değiştirerek 6 karakter kaldırmak yerine onu yazdırabilirsiniz putchar(...)> - *s=...değiştirerek diğer 4 ve *s-48U<11birlikte *s<59 çevrimiçi deneyin!
Giacomo Garabello

@GiacomoGarabello *s<59gibi karakterler girişte yer alıyorsa kırılır $, bu yüzden yaptım *s-48U([0..47] [-48 ..- 1] olur, bu da büyük bir işaretsiz değer haline gelir.) -alnumlar geçerliydi, daha muhafazakar bir yorumla gittim.
ErikF

Yeterince adil. OP kısa süre önce diğer tüm karakterlerin geçerli olduğunu, ancak boşluk olmadığını yorumladı. Ama yine de ilk
önerimi

1

Powershell, 94 bayt

-join($args|% t*y|%{if(1+($p=($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_))){$s[$p-bxor1]}else{$_}})

Test komut dosyası:

$f = {
-join($args|% t*y|%{if(1+($p=($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_))){$s[$p-bxor1]}else{$_}})
}

&$f "thisisastring1124"

açıklama

  • $args - argüman dizeleri
  • $args|% t*y- |ForEach-Object -Method ToCharArrayeşdeğerine kadar genişler"$args".ToCharArray()
  • ($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_)- dizede bir karakter bulun, bir konum veya bulunmazsa -1 döndürür. $ S, eşleştirilmiş karakter içeren dizeyi son bite göre değişen komşu konumlarında saklar: 0 + 1, 2 + 3, 4 + 5 ....
  • if(1+($p=...)) - konum bulunursa
  • $p-bxor1 - konum biti x veya 1

Güzel hile ile -bxor1.
AdmBorkBork



0

K4 , 38 bayt

Çözüm:

{(,/|x,a)(,/a:0 1_'10 11#'.Q`a`n)?x}@'

Açıklama:

Listedeki her karakteri arayın "abcdefghij1234567890"ve ardından orijinal karakterin "1234567890abcdefghijX"olduğu listeye dizin Xekleyin.

Dizeleri oluşturmak için daha kısa bir yol bulmamız gerekiyor ...

{(,/|x,a)(,/a:0 1_'10 11#'.Q`a`n)?x}@'
{                                  }@' / apply (@) lambda {} to each (')
                                 ?x    / lookup x in
         (                      )      / do this together
                          .Q`a`n       / index into .Q with a (gives a-z) and n (gives 0-9)
                   10 11#'             / take 10 from first list and 11 from second list
              0 1_'                    / drop 0 from first list and 1 from second list
            a:                         / save as a
          ,/                           / flatten
 (      )                              / do this together
     x,a                               / prepend x to a
    |                                  / reverse it
  ,/                                   / flatten

Bonus:

38 bayt için başka bir çözüm :

{(a,b,x)?[(b:1_11#.Q.n),a:10#.Q.a]x}@'

0

Yabasic , 135 bayt

Konsoldan girdi alır ve konsola çıktılar.

Input""s$
For i=1To Len(s$)
c$=Mid$(s$,i,1)
n=asc(c$)-96
If-38>n Then?chr$(143+n+11^(n=-48));ElsIf n<11Then?n*(10>n),"";Else?c$;Fi
Next

Çevrimiçi deneyin!



0

sed, 44 bayt

y/1234567890abcdefghij/abcdefghij1234567890/

Biraz sıkıcı, itiraf ediyorum.

Test yapmak:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
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.