แทนที่ตัวเลขด้วยตัวอักษรที่เกี่ยวข้อง


23

สร้างฟังก์ชั่นหรือโปรแกรมที่ใช้ตัวเลขเป็นอินพุตและส่งออกสตริงที่มีรหัส ASCII สำหรับรหัสตัวอักษรตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แทนที่ด้วยอักขระที่เทียบเท่า

  • ตัวอักษรตัวพิมพ์ใหญ่ใช้จุดรหัส: 65-90
  • ตัวอักษรตัวพิมพ์เล็กใช้คะแนนรหัส: 97-122

หากตัวเลขใด ๆ ที่อยู่ติดกันในการป้อนข้อมูลเท่ากับจุดรหัสของตัวอักษรแล้วตัวอักษรนั้นจะแทนที่ตัวเลขในสายออก

กฎ:

  • อินพุตจะเป็นจำนวนเต็มบวกโดยมีค่าระหว่าง 1 ถึง 99 หลัก
  • คุณสามารถสันนิษฐานได้ว่ามีการป้อนข้อมูลที่ถูกต้องเท่านั้น
  • คุณเริ่มการแทนที่ที่จุดเริ่มต้นของจำนวนเต็ม ( 976-> a6ไม่ใช่9L)
  • อินพุตสามารถอยู่ในรูปแบบที่เหมาะสม (การแทนสตริงได้ตกลง)
  • เอาต์พุตสามารถอยู่ในรูปแบบที่เหมาะสม
  • ใช้กฎมาตรฐาน

ตัวอย่าง:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

โค้ดที่สั้นที่สุดเป็นไบต์จะชนะ!


ลีดเดอร์บอร์ด

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ a) เป็นรายการคำตอบสั้นที่สุดต่อภาษาและ b) เป็นลีดเดอร์บอร์ดโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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


2
"อินพุตจะเป็นจำนวนเต็มบวกโดยมีค่าระหว่าง 1 ถึง 99 หลัก"ในภาษาการเขียนโปรแกรมใด ๆ ที่ฉันรู้มันจะเป็นสตริงที่มีค่าระหว่าง 1 ถึง 99 หลักเนื่องจากแม้แต่ int 64- บิตสามารถถือได้ถึง 19 ทศนิยมเท่านั้น ตัวเลข ...
TJ Crowder

3
@TJCrowder ฉันคิดว่าเขาหมายถึงจำนวนเต็มในแง่คณิตศาสตร์ไม่ใช่ประเภทข้อมูล
เดนนิส

1
@TJCrowder จุดที่ถูกต้อง :-) ถึงแม้ว่าถ้าฉันไม่เข้าใจผิด 1e99 ในทางเทคนิคก็ยังคงเป็นจำนวนเต็ม ไม่เพียงพอที่คุณต้องการlong int super long int
Stewie Griffin

1
@StewieGriffin: ฮ่า ๆ ! :-) ฉันแน่ใจว่ามีบางภาษาด้วยสิ่งนี้
TJ Crowder

คำตอบ:


2

Jolf, 18 16 ไบต์

ลองที่นี่! ฉันรู้ว่าฟังก์ชั่น UpperLower จะมีประโยชน์สักวันหนึ่ง! แทนที่óด้วย΢หรือเพียงแค่ใช้ลิงก์ล่าม นี่คือการเข้ารหัสใน ISO 8859-7

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

(เพิ่ม 1 ไบต์สำหรับการ-pตั้งค่าสถานะ)

$"="|";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

เครื่องมือที่เหมาะสมสำหรับ Job ™

คำอธิบายนั้นล้าสมัยหลังจากการปรับให้เหมาะสมขนาดเล็กหนึ่งครั้ง (ขอบคุณdev-null !) ที่ทำให้มันสั้นลงหนึ่งไบต์ (แต่ค่อนข้างสง่างามกว่าเล็กน้อย): $"ตัวแปรแสดงสิ่งที่ต้องทำjoinเมื่อ interpolating อาร์เรย์เป็นสตริงดังนั้นการตั้งค่าจึงไม่$"="|"จำเป็นjoin.

การสาธิต:

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

ฉันเดาว่าคุณสามารถบันทึกไบต์เดียวได้โดยตั้งค่า$"="|"แทนที่จะเข้าร่วมหรือไม่
andlrc

เช่น. $"="|";s/@{[65..90,97..122]}/chr$&/ge
andlrc

@ dev-null ทำงานได้ดีขอบคุณ!
Doorknob

11

Javascript, 80 ไบต์

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

ดูการทำงานของ regex ได้ที่นี่: https://regex101.com/r/iX8bJ2/1

แค่อยากรู้อยากเห็นสิ่งหนึ่งที่ฉันเรียนรู้ที่นี่:

ฉันไม่สามารถเปลี่ยนx=>String.fromCharCode(x)ไปString.fromCharCode เพราะ ...


6

CJam, 22 ไบต์

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

ลองออนไลน์!

พื้นหลัง

เพียงแค่แทนที่การเกิดขึ้นของกลุ่มหลักทั้งหมดด้วยตัวอักษรที่เกี่ยวข้อง (ไม่ว่าเราจะเลือกตามลำดับใด) จะล้มเหลวในการปฏิบัติตามกฎจากซ้ายไปขวา

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

ตัวอย่างเช่น:

67466

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

C4B

มันทำงานอย่างไร

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

ความท้าทายที่ค่อนข้างยาก นี่คือสิ่งที่ดีที่สุดที่ฉันสามารถทำได้ นี่เป็นเวอร์ชั่นใหม่ที่สมบูรณ์

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

ทำงานแบบนี้:

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • บันทึกแล้ว 8 ไบต์โดยใช้ctype_alphaแทนpreg_matchขอบคุณการจัดการ
  • บันทึก 1 ไบต์โดย0ใส่เครื่องหมายสตริงแทนการตรวจสอบสตริงที่ไม่ว่าง: เมื่ออักขระตัวสุดท้ายของอินพุตเป็น 0 สตริงย่อยที่ฉันกำลังจะเป็น "0" ซึ่งเป็นเท็จในขณะที่ "00" เป็นความจริง ดังนั้นมันจะไม่ข้ามการพิมพ์ 0 ล่าสุด
  • บันทึกขนาดใหญ่ 33 ไบต์โดยใช้strtrหลังจากสร้างอาร์เรย์ด้วยคู่การแปลง
  • บันทึกเป็นไบต์โดยใช้แท็กพิมพ์แบบสั้น

1
โย่จะต้องเปลี่ยนการแสดงออกปกติ#[A-Z]#iเป็นปัจจุบันจะมีความสุขจะช่วยให้ "92" จะถูกเปลี่ยนใน "\" หรือลองแทนctype_alpha() preg_match()จนถึงตอนนี้ดูเหมือนว่าจะทำงาน
จัดการ

"0", which is falsy, whereas "00" is truthyดีไปแล้ว PHP
แมว

3

Python 3, 211 189 188 ไบต์

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
  • บันทึก 23 ไบต์โดยแทนที่ \ n ด้วย; ขอบคุณเดนนิส

ทดสอบ

ป้อนคำอธิบายรูปภาพที่นี่


1
หากคุณใช้;แทนการขึ้นบรรทัดใหม่คุณสามารถใส่ทั้งวงขณะที่ลูปบนบรรทัดเดียว def f(c,i=0,n=""):นอกจากนี้ยังบรรทัดแรกจะกลายเป็น
เดนนิส

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

2

Pyth, 20 18 ไบต์

.Uu:G`CHHsrBG1+bZz

อัลกอริทึมเช่นเดียวกับ @Dennis มันง่ายกว่าการเขียนโค้ดใน Pyth บนโทรศัพท์ของฉันมากกว่าใน Jelly

                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

ขอบคุณ @isaacg

ลองมันนี่


คุณไม่สามารถอยู่นอกไซต์นี้ในโทรศัพท์ของคุณได้ไหม ...
Conor O'Brien

1
โดยเฉพาะอย่างยิ่งเมื่อฉันมีความหรูหราของการเข้ารหัสใน ASCII ที่พิมพ์ได้ทั้งหมด: D
lirtosiast

1
นั่นเป็นความจริงอาจจะดีที่จะหยุดพักจากเยลลี่ที่ ... คุณรู้ว่าอาหารที่สมดุล;)
Conor O'Brien

0

05AB1E , 12 ไบต์

õsvy«žnvyÇy:

ลองออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

õ             # 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)

12 ไบต์ทางเลือกโดยใช้ลดขนาด:

Å»«žnvyÇy:]θ

ลองใช้แบบออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมดหรือดูการลดทีละขั้นตอนโดยมีเพียง 10 ไบต์แรก

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