Konversi Angka menjadi Huruf, dan sebaliknya dalam string

12

Berdasarkan daftar angka dan huruf ekivalennya, ambil input string, ganti karakter string tersebut dengan angka / huruf yang sama dan hasilkan hasilnya.

Daftar

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

Memasukkan

thisisastring1124

Keluaran

t89s9s1str9n7aabd

Aturan

  • Angka setara dengan huruf kecil saja.
  • Karakter apa pun di luar daftar akan dibiarkan apa adanya.
  • String input tidak boleh mengandung spasi.
  • Program atau fungsi lengkap diizinkan.
  • Karena ini kode-golf, byte paling sedikit menang.
Noir Antares
sumber
2
Selamat datang di PPCG. Tantangan yang bagus!
Adám
2
Bisakah kita bertukar huruf besar saja?
Adám
Hanya huruf kecil, huruf besar akan berada di luar cakupan daftar.
Noir Antares
Apakah input hanya berisi huruf dan angka, atau karakter non-spasi lainnya (mis. Tanda baca) ada di dalamnya?
sundar - Reinstate Monica
String input dapat berisi karakter lain apa pun kecuali spasi, tetapi apa pun di luar daftar tidak akan tersentuh dalam string output.
Noir Antares

Jawaban:

14

bash, 18 byte

tr 1-90a-j a-j1-90

Cobalah online!

Gagang pintu
sumber
Bagaimana cara ini mengambil input / memberikan output? stdin dan stdout?
Dana Gugatan Monica
@NicHartley Ya.
Gagang pintu
10

Python 3 , 76 68 byte

lambda w:w.translate(dict(zip(s,s[::-1])))
s=b'1234567890jihgfedcba'

Cobalah online!

ovs
sumber
6

05AB1E , 13 9 byte

žmÁAT£J‡

Cobalah online!

Penjelasan

žmÁ         # push 0987654321
   AT£      # push abcdefghij
      J     # join strings
       Â    # bifurcate
        ‡   # transliterate
Emigna
sumber
5

Retina 0.8.2 , 12 byte

T`a-j09-1`Ro

Cobalah online! Penjelasan:

T``

Lakukan transliterasi.

a-j09-1

Daftar sumber adalah surat-surat a-j, lalu 0, kemudian digit 9-1.

Ro

Daftar tujuan adalah daftar sumber yang dibalik, yaitu digit 1-9, lalu 0, kemudian huruf j-a.

Neil
sumber
3

Python 2 , 82 78 byte

lambda i,l='1234567890jihgfedcba':''.join((x,l[~l.find(x)])[x in l]for x in i)

Cobalah online!

-4 dengan terima kasih kepada @ovs

ElPedro
sumber
3

JavaScript (ES6), 66 byte

s=>s.replace(e=/[1a2b3c4d5e6f7g8h9i0j]/g,c=>e[e.search(c)^1],e+=e)

Cobalah online!

Arnauld
sumber
3

R , 40 byte

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

Cobalah online!

Anehnya, R layak pada tantangan semacam ini , karena memiliki trfungsi seperti pada jawaban Bash . Tidak tahu mengapa itu ada, tapi saya bersyukur karenanya!

Giuseppe
sumber
Luar biasa! Tidak tahu chartr () mengerti regex.
snoram
@ snoram tidak cukup regex; itu menentukan dalam dokumentasi bahwa "Rentang didukung dalam spesifikasi, tetapi kelas karakter dan karakter berulang tidak."
Giuseppe
3

MS-SQL, 71 byte

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

Fungsi SQL 2017 baru TRANSLATEmelakukan penggantian karakter individu, sehingga sangat cocok untuk tujuan ini. Lihat jawaban saya yang serupa di tantangan sebelumnya .

Input adalah melalui tabel t yang sudah ada sebelumnya dengan kolom varchar v , sesuai aturan IO kami . Untuk mengganti hanya huruf kecil, tabel harus dibuat menggunakan susunan case-sensitive :

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)
BradC
sumber
2

Jelly , 16 byte

⁵Øaḣ,ØDṙ1¤ċÞ⁸Ṛy)

Cobalah online!

Erik the Outgolfer
sumber
2

Pyth , 13 byte

Xz+jk+0_S9<GT

Coba di sini!

Penjelasan

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.
Tuan Xcoder
sumber
2

Haskell , 80 66 byte

map(!"1a2b3c4d5e6f7g8h9i0j")
e!(a:b:y)|e==a=b|e==b=a|1<2=e!y
e!_=e

Cobalah online!

ovs
sumber
1

REXX, 57 byte

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

C (gcc) , 81 72 byte

Terima kasih kepada Giacomo Garabello untuk sarannya.

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

Cobalah online!

ErikF
sumber
Anda dapat menghapus 6 karakter dengan mengubah string input daripada mencetaknya putchar(...)-> *s=...dan 4 lainnya dengan mengganti *s-48U<11dengan *s<59 Coba online!
Giacomo Garabello
@GiacomoGarabello *s<59pecah jika karakter seperti $ada di input, itulah sebabnya saya melakukannya *s-48U([0..47] menjadi [-48 ..- 1], yang menjadi nilai tanpa tanda yang besar.) Karena pertanyaan tidak menentukan apakah tidak -Num yang valid, saya pergi dengan interpretasi yang lebih konservatif.
ErikF
Cukup adil. OP baru-baru ini berkomentar bahwa setiap karakter lain valid tetapi bukan spasi. Tetapi Anda masih dapat menggunakan saran pertama saya
Giacomo Garabello
1

Powershell, 94 byte

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

Skrip uji:

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

&$f "thisisastring1124"

Penjelasan

  • $args - string argumen
  • $args|% t*y- Perluas yang |ForEach-Object -Method ToCharArraysetara dengan"$args".ToCharArray()
  • ($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_)- temukan char di string, kembalikan posisi atau -1 jika tidak ditemukan. Biarkan $ s menyimpan string yang berisi char berpasangan pada posisi tetangga yang berbeda dengan bit terakhir: 0 + 1, 2 + 3, 4 + 5 ....
  • if(1+($p=...)) - jika posisi ditemukan
  • $p-bxor1 - posisi bit xor 1
mazzy
sumber
Trik yang bagus dengan -bxor1.
AdmBorkBork
0

R , 107 byte

function(s){a=utf8ToInt(s);l=a>96&a<107;n=a>47&a<58;a[n]=(a[n]-9)%%10+97;a[l]=(a[l]+4)%%10+48;intToUtf8(a)}

Cobalah online!

Upaya pertama, pasti dapat ditingkatkan ...

menggali semua
sumber
chartradalah temanmu di sini, kurasa.
Giuseppe
1
@Giuseppe: luar biasa! Saya tidak tahu fungsi chartr. Silakan posting sebagai jawaban Anda, pendekatannya benar-benar berbeda;)
digEmAll
0

Karat , 96 byte

|x|x.bytes().map(|x|match
x{49..=57=>x+48,97..=105=>x-48,48=>106,106=>48,x=>x}as
char).collect()

Cobalah online!

Bukan Unicode-safe, jika itu akan lebih lama.

Konrad Borowski
sumber
0

K4 , 38 byte

Larutan:

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

Penjelasan:

Cari setiap karakter dalam daftar "abcdefghij1234567890"dan kemudian indeks ke dalam daftar di "1234567890abcdefghijX"mana Xkarakter aslinya.

Perlu menemukan cara yang lebih singkat untuk membangun string ...

{(,/|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:

Solusi lain untuk 38 byte :

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

Yabasic , 135 byte

Membawa input dari konsol dan output ke konsol.

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

Cobalah online!

Taylor Scott
sumber
0

Japt , 44 42 byte

V=1oA q +0+"jihgfedcba"Um@W=VaX)¦É?Vw gW:X

Cobalah online!

Bejofo
sumber
0

sed, 44 byte

y/1234567890abcdefghij/abcdefghij1234567890/

Agak membosankan, saya akui.

Pengujian:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
Kusalananda
sumber