แปลงตัวเลขเป็นตัวอักษรและในทางกลับกันเป็นสตริง


12

ขึ้นอยู่กับรายการของตัวเลขและตัวอักษรที่เทียบเท่ากันใช้อินพุตสตริงแทนที่อักขระของสตริงนั้นด้วยตัวเลข / ตัวอักษรและผลลัพธ์ผลลัพธ์ที่เทียบเท่ากัน

รายการ

  • 1 = a
  • 2 = b
  • 3 = c
  • 4 = d
  • 5 = e
  • 6 = f
  • 7 = g
  • 8 = ชม
  • 9 = ฉัน
  • 0 = j

อินพุต

thisisastring1124

เอาท์พุต

t89s9s1str9n7aabd

กฎระเบียบ

  • ตัวเลขเทียบเท่ากับตัวอักษรตัวพิมพ์เล็กเท่านั้น
  • ตัวละครใด ๆ นอกรายการจะถูกทิ้งไว้ตามที่เป็น
  • สตริงอินพุตต้องไม่มีช่องว่าง
  • อนุญาตให้ใช้โปรแกรมหรือฟังก์ชั่นเต็มรูปแบบได้
  • เนื่องจากเป็น code-golf ไบต์ที่น้อยที่สุดจึงชนะ

2
ยินดีต้อนรับสู่ PPCG ท้าทายมาก!
Adám

2
เราจะสลับอักษรตัวพิมพ์ใหญ่แทนได้ไหม
Adám

เฉพาะอักษรตัวพิมพ์เล็กตัวอักษรตัวพิมพ์ใหญ่จะอยู่นอกขอบเขตของรายการ
Noir Antares

อินพุตจะมีเฉพาะตัวอักษรและตัวเลขหรืออาจมีอักขระที่ไม่ใช่ช่องว่างอื่น ๆ (เช่นเครื่องหมายวรรคตอน) อยู่ในนั้นหรือไม่
sundar - Reinstate Monica

สายป้อนข้อมูลสามารถมีตัวละครอื่น ๆ ยกเว้นช่องว่าง แต่สิ่งที่อยู่นอกรายการจะถูกทิ้งไว้ในสตริงการส่งออก
Noir Antares

คำตอบ:






6

Perl 6 , 45 23 ไบต์

tr/1..90a..j/a..j1..90/

ลองออนไลน์!

เพียง regex การทับศัพท์ธรรมดา


1
ใช้ TR จะสั้นกว่าที่นี่คุณยังไม่ได้มีการแยกชิ้นส่วนเหล่านั้นทั้งหมดของลำดับ: TR/1..90a..j/a..j1..90/ tio.run/##K0gtyjH7n1upoJamYKvwvzokSN9QT8/SIFFPL0sfRIB5@rX/...
ฟิล H

@ ฟิลฮ่าฮ่าฉันแค่ค้นหาผู้ดำเนินการนั้นอย่างแท้จริง! ขอบคุณ!
Jo King

5

เรติน่า 0.8.2 , 12 ไบต์

T`a-j09-1`Ro

ลองออนไลน์! คำอธิบาย:

T``

ทำการทับศัพท์

a-j09-1

รายการมาเป็นตัวอักษรa-jแล้วแล้วตัวเลข09-1

Ro

รายการปลายทางเป็นรายการที่มาตรงกันข้ามคือตัวเลข1-9แล้วแล้วตัวอักษร0j-a





3

R , 40 ไบต์

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

ลองออนไลน์!

น่าแปลกที่ R คือดีในชนิดของท้าทายเพราะมีtrฟังก์ชั่นเหมือนเช่นเดียวกับในคำตอบทุบตี ไม่รู้เลยว่าทำไมมันถึงมีอยู่ แต่ฉันรู้สึกขอบคุณมัน


! ที่น่าตื่นตาตื่นใจ ไม่ทราบ chartr () ที่เข้าใจ regex
snoram

@snoram ไม่ค่อย regex; มันระบุในเอกสารประกอบว่า "ช่วงได้รับการสนับสนุนในข้อกำหนด แต่คลาสตัวอักษรและตัวละครซ้ำไม่ได้"
จูเซปเป้

3

MS-SQL, 71 ไบต์

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

ฟังก์ชัน SQL 2017 ใหม่TRANSLATEดำเนินการแทนที่อักขระแต่ละตัวดังนั้นจึงเหมาะอย่างยิ่งสำหรับวัตถุประสงค์นี้ ดูคำตอบที่คล้ายกันของฉันในความท้าทายก่อน

การป้อนข้อมูลผ่านทางตารางที่มีอยู่ก่อนทีกับคอลัมน์ varchar วี , ต่อกฎ IO ของเรา หากต้องการแทนที่อักษรตัวพิมพ์เล็กเท่านั้นคุณต้องสร้างตารางโดยใช้การเปรียบเทียบตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่:

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


2

Pyth , 13 ไบต์

Xz+jk+0_S9<GT

ลองที่นี่!

คำอธิบาย

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 ไบต์

ขอบคุณ Giacomo Garabello สำหรับคำแนะนำ

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

ลองออนไลน์!


คุณสามารถลบ 6 ตัวอักษรโดยการเปลี่ยนสายป้อนแทนที่จะพิมพ์ออกputchar(...)-> *s=...และอีก 4 ตัวโดยแทนที่*s-48U<11ด้วย*s<59 ลองออนไลน์!
Giacomo Garabello

@GiacomoGarabello *s<59หยุดพักหากตัวละครที่ชอบ$อยู่ในอินพุตซึ่งเป็นสาเหตุที่ฉันทำ*s-48U([0..47] กลายเป็น [-48 ..- 1] ซึ่งกลายเป็นค่าที่ไม่ได้ลงนามขนาดใหญ่) เนื่องจากคำถามไม่ได้ระบุว่าไม่ใช่ - เลขถูกต้องฉันไปกับการตีความที่อนุรักษ์นิยมมากขึ้น
ErikF

ยุติธรรมพอสมควร OP แสดงความคิดเห็นเมื่อเร็ว ๆ นี้ว่าตัวละครอื่น ๆ ทุกตัวใช้ได้ แต่ไม่ใช่ช่องว่าง แต่คุณยังสามารถใช้คำแนะนำแรกของฉัน
Giacomo Garabello

1

Powershell, 94 ไบต์

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

สคริปต์ทดสอบ:

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

&$f "thisisastring1124"

คำอธิบาย

  • $args - สตริงอาร์กิวเมนต์
  • $args|% t*y- ขยายเป็น|ForEach-Object -Method ToCharArrayเทียบเท่า"$args".ToCharArray()
  • ($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_)- หาถ่านในสตริงส่งกลับตำแหน่งหรือ -1 ถ้าไม่พบ ให้ $ s เก็บสตริงซึ่งบรรจุถ่านที่จับคู่กับตำแหน่งเพื่อนบ้านที่แตกต่างกันไปตามบิตสุดท้าย: 0 + 1, 2 + 3, 4 + 5 ....
  • if(1+($p=...)) - หากพบตำแหน่ง
  • $p-bxor1 - ตำแหน่งบิต xor 1

-bxor1เคล็ดลับที่ดีกับ
AdmBorkBork

0

R , 107 ไบต์

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

ลองออนไลน์!

ความพยายามครั้งแรก, แก้ไขได้แน่นอน ...


chartrเป็นเพื่อนของคุณที่นี่ฉันคิดว่า
Giuseppe


1
@Giuseppe: ยอดเยี่ยม! ฉันไม่รู้ฟังก์ชัน chartr กรุณาโพสต์เป็นคำตอบของคุณวิธีการที่แตกต่างกันโดยสิ้นเชิง;)
digEmAll


0

K4 , 38 ไบต์

วิธีการแก้:

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

คำอธิบาย:

ค้นหาอักขระแต่ละตัวในรายการ"abcdefghij1234567890"แล้วสร้างดัชนีลงในรายการ"1234567890abcdefghijX"ที่Xเป็นอักขระดั้งเดิม

ต้องการหาวิธีที่สั้นกว่าในการสร้างสตริง ...

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

โบนัส:

วิธีแก้ปัญหาอื่นสำหรับ38 ไบต์ :

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



0

sed, 44 ไบต์

y/1234567890abcdefghij/abcdefghij1234567890/

น่าเบื่อนิดหน่อยฉันยอมรับ

การทดสอบ:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.