String replicator


15

ในกลุ่มคุณสามารถทำซ้ำคำสั่งโดยก่อนหน้านั้นมีจำนวนเช่นเทียบเท่ากับ3dd dd dd ddรูปแบบการทำซ้ำนี้ไม่ได้ จำกัด อยู่ที่คำสั่ง Vim สตริงสามารถทำซ้ำในลักษณะนี้ได้เช่นกัน

รายละเอียด:

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

  • "word" แต่ละคำประกอบด้วยตัวเลขและตัวอักษร หากตัวอักษรนำหน้าด้วยตัวเลข (อาจมีมากกว่าหนึ่งหลักในตัวเลขหรือตัวเลขเป็นศูนย์) ให้ทำซ้ำตัวอักษรนั้นตามเวลาที่กำหนด ตัวอย่างเช่น:

    a2bc -> abbc
    3xx1yz -> xxxxyz
    10ab0c0d0e -> aaaaaaaaaab # No 'cde' because there's a zero
    2A2a2A2a -> AAaaAAaa
    
  • คำถูกคั่นด้วยช่องว่าง มีช่องว่างสูงสุดระหว่างคำสองคำที่อยู่ติดกันทุกช่อง

ง่ายใช่มั้ย นี่คือสิ่งเพิ่มเติม:

  • หากมีตัวเลขอยู่ข้างหน้าเว้นวรรคให้ทำซ้ำคำถัดไปตามเวลาที่กำหนด หมายเลขจะถูกแนบกับส่วนท้ายของคำก่อนหน้านี้เสมอหรือเมื่อเริ่มต้นของสตริง ตัวอย่าง:

    a2bc3 2d -> abbc dd dd dd
    3 3a -> aaa aaa aaa
    33a -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    0 abcd0 efgh3 2x -> xx xx xx
    a3 0xc b -> a c c c b
    
  • หากคำว่างเปล่าควรจะทำซ้ำอย่าส่งหลายช่องว่างในแถว สควอชพวกเขา:

    a3 0x2 b -> a b b   # NOT 'a    b b'
    

    กล่าวอีกนัยหนึ่งโปรแกรมของคุณไม่ควรเว้นช่องว่างสองช่องด้วยกัน

  • อินพุตไม่เคยว่างเปล่า แต่ไม่จำเป็นว่าเอาต์พุตจะไม่ว่างเปล่า:

    0 3x -> (empty)
    
  • อินพุตและเอาต์พุตสามารถทำได้ในรูปแบบที่ต้องการ ฟังก์ชั่นที่รับอินพุตจากอาร์กิวเมนต์และให้เอาต์พุตผ่านค่าส่งคืนเป็นที่ยอมรับเช่นกัน

    หากเป็นโปรแกรมจะต้องไม่ออกโดยมีข้อผิดพลาด (เช่นค่าส่งคืนเป็นศูนย์)

  • ตัวเลขเป็นทศนิยมเสมอและไม่เคยเริ่มต้นด้วยศูนย์เว้นแต่ตัวเลขจะเป็นศูนย์ในกรณีนี้มีเพียงศูนย์เดียว คือคุณไม่จำเป็นต้องพิจารณา077aหรือ000aให้เป็นอินพุต

  • ตัวเลขทั้งหมดต่ำกว่า 2 ^ 31 (2,147,483,648) ความยาวเอาต์พุตสูงสุดต่ำกว่า 2 ^ 32 (4,294,967,296) ไบต์

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

กล่าวสั้น ๆ อินพุตที่ถูกต้องตรงกับนิพจน์ทั่วไปนี้:

([0-9]+ )?([0-9A-Za-z]*[A-Za-z])([0-9]* [0-9A-Za-z]*[A-Za-z])*( ?\n?)

และสำหรับผลลัพธ์ที่ถูกต้อง:

([A-Za-z]+)( [A-Za-z]+)*( ?\n?)

กรณีทดสอบตัวอย่าง:

abcdefg -> abcdefg
a3bcd -> abbbcd
a3bbbc -> abbbbbc
3a0b -> aaa
abc 3d -> abc ddd
abc3 d -> abc d d d
5 1x5 1y0 z -> x x x x x y y y y y
a999 0x b -> a b
999 0s -> (empty)
0 999s -> (empty)
0 999s4 t -> t t t t
a3 0xc b -> a c c c b
ABC3 abc -> ABC abc abc abc

นี่คือดังนั้นโปรแกรมที่สั้นที่สุดเป็นไบต์ในแต่ละภาษาจะชนะ!


3
ไม่ต้องป้อนโปรแกรม "" ด้วยความผิดพลาด "" เป็นรายชื่อตัวละคร ... "เหตุผลใด ๆ (ดังที่คุณทราบแล้ว) โดยทั่วไปเราอนุญาตให้ใช้รูปแบบ I / O ที่ยืดหยุ่นได้
user202729

@ user202729 ฉันจะลบส่วนหลังออก สำหรับผลลัพธ์การออกจากโปรแกรมฉันต้องการเก็บไว้ แก้ไข : เสร็จแล้ว
iBug

1
คล้ายคลึงกัน
โคล


ฉันคิดว่าควรเพิ่มการทดสอบเช่นa3 0xc b-> a c c c bเนื่องจากเดิมฉันมีรหัสที่ใช้กับกรณีทดสอบทั้งหมดข้างต้น แต่ไม่สามารถทำงานได้อย่างถูกต้อง
แบรดกิลเบิร์ต b2gills

คำตอบ:



2

Perl 6, 88 ไบต์

{$_=$^a;s:g/(\d+):(\w)/{$1 x$0||'_'}/;s:g/(\d+)\s([\w& \D]+)/ {$1 xx$0}/;~S:g/_//.words}

ทดสอบมัน

ขยาย:

{ # bare block lambda with placeholder parameter 「$a」

  # store a copy of the argument in 「$_」
  # (shorter than 「-> $_ is copy {…}」)
  $_ = $^a;
  # note that 「$_」 is the default scalar,
  # and many things operate on it by default (like 「s///」)


  # do the character repeats
  s :global
  /

    (\d+)           # repeat count
    :               # don't backtrack (prevents it from matching word repeats)
    (\w)            # character to repeat

  /{

    $1 x $0         # do the repeat

    || '_'          # replace with 「_」 if the repeat was 0 (matched by [\w & \D])
                    # this is so “words” don't get removed yet

  }/;


  # do the word repeats
  s :global
  /

    (\d+)           # repeat count

    \s              # shortest way to match a space

    ([
      \w & \D       # word character and not a digit (doesn't match next repeat)
    ]+)             # match that at least once

  / {               # add a space (as we removed it by matching it)

    $1 xx $0        # list repeat (adds a space between values when stringified)

  }/;


  # the following is the result
  ~                 # stringify (adds spaces between values in a list) # (3)
    S :global /_//  # remove all _ not in-place                        # (1)
    .words          # get a list of words                              # (2)
}

~(…).wordsรวมกันเอาช่องว่างภายนอกซึ่งจะเป็นประโยชน์ถ้าเป็น“คำว่า” จะถูกนำออก


1

Python 2, 286 275 260 257 238 ไบต์

-19 ไบต์ขอบคุณovs

def f(s,j=' '.join):exec"s=s.split(%s[-1]):s[i]=s[i][:-1];s[i-1]=j([s[i-1]]*int(w[-1]))\ns=list(j(s[::-1])%s):s[i]='';s[i-1]*=int(w)\nprint j(''.join(s[::-1]).strip().split())"%((')[::-1]\nfor i,w in enumerate(s):\n if str.isdigit(w',)*2)

f รับสายเป็นอาร์กิวเมนต์และพิมพ์สตริงที่จัดรูปแบบ

นี่คือ repl.itกับกรณีทดสอบ

รหัสไม่ได้รับการตอบกลับ:

def f(s, j=' '.join):
    s = s.split()[::-1]
    for i, w in enumerate(s):
        if str.isdigit(w[-1]):
            s[i] = s[i][:-1]
            s[i - 1] = j([s[i - 1]] * int(w[-1]))
    s = list(j(s[::-1]))[::-1]
    for i, w in enumerate(s):
        if str.isdigit(w):
            s[i] = ''
            s[i - 1] *= int(w)
    print j(''.join(s[::-1]).strip().split())

ยังคงทำงานเกี่ยวกับการปรับปรุง



@ovs ขอบคุณ ไม่อยากจะเชื่อเลยว่าฉันไม่ได้คิดจะกำจัดบรรทัดใหม่และเยื้องสำหรับexecเพราะมันเป็นบรรทัดเดียวในฟังก์ชั่น
nog642



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