Chuyển đổi số thành chữ cái và ngược lại trong một chuỗi


12

Dựa trên danh sách các số và chữ cái tương đương của chúng, lấy đầu vào chuỗi, thay thế các ký tự của chuỗi đó bằng số / chữ cái tương đương và xuất kết quả.

Danh sách

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

Đầu vào

thisisastring1124

Đầu ra

t89s9s1str9n7aabd

Quy tắc

  • Các số chỉ tương đương với chữ thường.
  • Bất kỳ nhân vật ngoài danh sách sẽ được để lại như vậy.
  • Chuỗi đầu vào không được chứa khoảng trắng.
  • Chương trình hoặc chức năng đầy đủ được cho phép.
  • Vì nó là môn đánh gôn, nên ít byte nhất sẽ thắng.

2
Chào mừng đến với PPCG. Thử thách tốt đẹp!
Adám

2
Chúng ta có thể trao đổi chữ hoa thay thế?
Adám

Chỉ các chữ cái viết thường, chữ in hoa sẽ nằm ngoài phạm vi của danh sách.
Noir Antares

Đầu vào sẽ chỉ chứa các chữ cái và số, hoặc các ký tự không phải khoảng trắng khác (ví dụ: dấu chấm câu) có trong đó không?
- Phục hồi Monica

Chuỗi đầu vào có thể chứa bất kỳ ký tự nào khác ngoại trừ khoảng trắng, nhưng mọi thứ nằm ngoài danh sách sẽ không được chạm tới trong chuỗi đầu ra.
Noir Antares

Câu trả lời:







5

Võng mạc 0.8.2 , 12 byte

T`a-j09-1`Ro

Hãy thử trực tuyến! Giải trình:

T``

Thực hiện phiên âm.

a-j09-1

Danh sách nguồn là các chữ cái a-j, sau 0đó là các chữ số 9-1.

Ro

Danh sách đích là danh sách nguồn được đảo ngược, tức là các chữ số 1-9, sau đó 0, sau đó là các chữ cái j-a.





3

R , 40 byte

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

Hãy thử trực tuyến!

Đáng ngạc nhiên, R là khá tốt ở loại thách thức , bởi vì nó có trchức năng giống như trong câu trả lời Bash . Không biết tại sao nó tồn tại, nhưng tôi biết ơn vì điều đó!


Kinh ngạc! Không biết biểu đồ regr () đã hiểu regex.
snoram

@snoram không hoàn toàn regex; nó chỉ rõ trong tài liệu rằng "Phạm vi được hỗ trợ trong thông số kỹ thuật, nhưng các lớp ký tự và ký tự lặp lại thì không."
Giuseppe

3

MS-SQL, 71 byte

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

Hàm SQL 2017 mới TRANSLATEthực hiện thay thế ký tự riêng lẻ, vì vậy rất phù hợp cho mục đích này. Xem câu trả lời tương tự của tôi trong một thử thách trước .

Đầu vào là thông qua một bảng t có sẵn với cột varar v , theo quy tắc IO của chúng tôi . Để chỉ thay thế các chữ cái viết thường, bảng phải được tạo bằng cách sử dụng đối chiếu phân biệt chữ hoa chữ thường :

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


2

Bình thường , 13 byte

Xz+jk+0_S9<GT

Hãy thử nó ở đây!

Giải trình

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

C (gcc) , 81 72 byte

Cảm ơn Giacomo Garabello cho những gợi ý.

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

Hãy thử trực tuyến!


Bạn có thể xóa 6 ký tự bằng cách thay đổi chuỗi đầu vào thay vì in ra putchar(...)-> *s=...và 4 ký tự khác bằng cách thay thế *s-48U<11bằng*s<59 Dùng thử trực tuyến!
Giacomo Garabello

@GiacomoGarabello *s<59phá vỡ nếu các ký tự như $trong đầu vào, đó là lý do tại sao tôi đã làm*s-48U ([0..47] trở thành [-48 ..- 1], trở thành giá trị không dấu lớn.) Vì câu hỏi không chỉ định có không -alnums là hợp lệ, tôi đã đi với sự giải thích bảo thủ hơn.
ErikF

Đủ công bằng. OP nhận xét gần đây rằng mọi nhân vật khác đều hợp lệ nhưng không phải là không gian. Nhưng bạn vẫn có thể sử dụng đề xuất đầu tiên của tôi
Giacomo Garabello

1

Powershell, 94 byte

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

Kịch bản thử nghiệm:

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

&$f "thisisastring1124"

Giải trình

  • $args - chuỗi đối số
  • $args|% t*y- mở rộng |ForEach-Object -Method ToCharArraytương đương với"$args".ToCharArray()
  • ($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_)- tìm một char trong chuỗi, trả về vị trí hoặc -1 nếu không tìm thấy. Hãy để $ s lưu trữ chuỗi chứa char được ghép nối trên các vị trí lân cận khác nhau bởi bit cuối cùng: 0 + 1, 2 + 3, 4 + 5 ....
  • if(1+($p=...)) - nếu vị trí được tìm thấy
  • $p-bxor1 - vị trí bit xor 1

Thủ thuật hay với -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)}

Hãy thử trực tuyến!

Nỗ lực đầu tiên, chắc chắn là ngẫu hứng ...


chartrlà bạn của bạn ở đây, tôi nghĩ.
Giuseppe


1
@Giuseppe: tuyệt vời! Tôi không biết chức năng chartr. Xin vui lòng gửi nó như câu trả lời của bạn, cách tiếp cận hoàn toàn khác nhau;)
digEmAll


0

K4 , 38 byte

Giải pháp:

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

Giải trình:

Tra cứu từng ký tự trong danh sách "abcdefghij1234567890"và sau đó lập chỉ mục vào danh sách"1234567890abcdefghijX" nơi Xlà nhân vật ban đầu.

Cần tìm một cách ngắn hơn để xây dựng chuỗi ...

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

Tặng kem:

Một giải pháp khác cho 38 byte :

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

0

Yabasic , 135 byte

Đưa đầu vào từ bàn điều khiển và đầu ra cho bàn điều khiển.

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

Hãy thử trực tuyến!



0

sed, 44 byte

y/1234567890abcdefghij/abcdefghij1234567890/

Một chút nhàm chán, tôi thừa nhận.

Kiểm tra:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.