เติมในช่องว่าง


14

อินพุต

ติดลบnและสตริงว่างที่มีเพียงตัวอักษรและตัวเลขและขีดs _ตัวอักษรตัวแรกของไม่ได้s _ขีดล่างของsถูกตีความว่าเป็นช่องว่างที่สามารถเติมด้วยอักขระอื่น ๆ

เรากำหนดลำดับอนันต์ของ "สตริงอนันต์" ดังนี้ สตริงจะถูกทำซ้ำหลายครั้งอย่างไม่ จำกัด สำหรับทุกสตริงจะได้รับจากโดยการกรอกช่องว่างกับตัวละครของเพื่อให้คนแรกของจะถูกแทนที่ด้วยสองด้วยและอื่น ๆ เนื่องจากตัวอักษรตัวแรกของไม่ใช่ตัวอักษรทุกช่องว่างจะถูกเติมเต็มในที่สุดและเราแสดงด้วยสตริงที่ไม่มีที่สิ้นสุดซึ่งทุกตัวถูกแทนที่ด้วยค่าในที่สุดs1 = s s s...sk > 1sk+1sks1_sks1[0]s1[1]s_s_

เอาท์พุต

nอักขระตัวแรกของเป็นสตริงs

ตัวอย่าง

พิจารณาปัจจัยการผลิตและn = 30 s = ab_c_เรามี

s1 = ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_...

เพื่อทดแทนช่องว่างของเราs1s1

s2 = abacbab_ccab_caabbc_abcc_abacbab_cc...

เราแทนที่ช่องว่างอีกครั้งซึ่งส่งผลให้s1

s3 = abacbabaccabbcaabbc_abcccabacbab_cc...

การทดแทนอีกหนึ่งรายการ:

s4 = abacbabaccabbcaabbcaabcccabacbabbcc...

จากนี้เราสามารถอนุมานอักขระ 30 ตัวแรกของซึ่งคือs

abacbabaccabbcaabbcaabcccabacb

นี่เป็นเอาต์พุตที่ถูกต้อง

กฎระเบียบ

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

กรณีทดสอบ

0  "ab__"    -> ""
1  "ab__"    -> "a"
3  "ab__"    -> "aba"
20 "ab"      -> "abababababababababab"
20 "ab__"    -> "abababababababababab"
20 "ab_"     -> "abaabbabaabaabbabbab"
30 "ab_c_"   -> "abacbabaccabbcaabbcaabcccabacb"
50 "ab_a_cc" -> "abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca"
50 "abc____" -> "abcabcaabcbcaaabcbcbcabcaaababccbcbabccabcabcaaaba"

เราสามารถรับข้อมูลในลำดับตรงกันข้าม (ในภาษาที่ลำดับนั้นสำคัญ) ได้หรือไม่?
Martin Ender

@ MartinBüttnerแน่นอนว่าฉันจะอนุญาต
Zgarb

คำตอบ:


4

Pyth, 17

<ussC,cG\_GUQ*zQQ

อินพุตควรถูกกำหนดด้วยสตริงบนบรรทัดแรกและความยาวของวินาทีบน STDIN ตัวอย่างเช่น:

abc____
50

ลองที่นี่

คำอธิบาย:

                             Implicit:
                             z = input()              z is the string.
                             Q = eval(input())        Q is the length.

<               Q            First Q characters of
 u         UQ*zQ             Reduce, with an initial value of z repeated Q times, 
                             on the list range(len(Q)).
                             Since the reduce function doesn't use the sequence variable H
                             this function amounts to applying the inner code Q times to
                             the initial value, where the working variable is G.
  ss                         Sum from list of tuples of strings, to tuple of strings,
                             to string.
    C,                       Zip together
      cG\_                   G split on underscores
          G                  with G.
                             This inserts a character of G between every underscore
                             separated group of G, which amounts to replacing the
                             underscores with characters of G, after summation.

7

APL 29 28

{a⊣(b/a)←a↑⍨+/b←'_'=a←⍺⍴⍵}⍣≡

มันใช้แบบนี้:

fun←{a⊣(b/a)←a↑⍨+/b←'_'=a←⍺⍴⍵}⍣≡
20 fun 'ab_c_'
abacbabaccabbcaabbca

คำอธิบาย:

a←⍺⍴⍵           makes vector long as left argument using repeated chars in right argument
a↑⍨+/b←'_'=a   takes a string from the beginning of string a (a↑⍨), long as the number of _'s in a (+/b←'_'=a)
(b/a)←          puts those chars in place of the _'s in the original vector
a⊣             and returns a
{}⍣≡            repeats function ( {} ) until results doesn't change anymore

Tryapl.org


⍣≡เป็นความคิดที่ดี บางทีฉันควรพยายามที่จะพอร์ตนี้กับเจ ...
FUZxxl

7

CJam, 26 24 20 ไบต์

บันทึกได้ 4 ไบต์ขอบคุณ Peter

l~:I*{_'_/[\]zsI<}I*

ทดสอบที่นี่รับสายเป็นอันดับแรกและnอันดับที่สองบน STDIN

คุณสามารถเรียกใช้กรณีทดสอบทั้งหมดโดยวางลงในอินพุตตามที่เป็น (รวมถึง-> outputกรณีที่คุณต้องการ) และใช้ชุดทดสอบทดสอบต่อไปนี้ (ซึ่งกลับคำสั่งสำหรับรหัส):

qN/{"->"/0=S/W%S*

~:I*{_'_/[\]zsI<}I*

]oNo}/

คำอธิบาย

l~:I*{_'_/[\]zsI<}I*
l~                       "Read the input and evaluate.";
  :I                     "Store n in I for future use.";
    *                    "Repeat s n times to ensure it's long enough for the output.";
     {           }I*     "Repeat this block n times. This will always be enough passes.";
      _                  "Duplicate the string.";
       '_/               "Split the string on underscores.";
          [\]            "Swap with the other copy, putting both in an array.";
             z           "Zip the two arrays together, interleaving substrings from the split
                          copy with characters from the unsplit copy. Extraneous
                          characters from the unsplit copy just go at the end and
                          can be ignored.";
              s          "Convert the result into a string, flattening the array in the
                          process. This basically joins the two interleaved strings together.";
               I<        "Truncate to n characters.";

ผลลัพธ์จะถูกพิมพ์โดยอัตโนมัติเมื่อสิ้นสุดโปรแกรม

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


ฉันคิดว่าคุณสามารถแทนที่ด้วย_'_#) g I*เหมาะกับฉันใน GolfScript
ปีเตอร์เทย์เลอร์

@ PeterTaylor โอ้ความคิดที่ดีมากขอบคุณ!
Martin Ender

6

Python 3, 110 ไบต์

n=int(input())
*b,=input()*n
a=b[:n]
while"_"in a:b,a=b[:],[x*(x!="_")or b.pop(0)for x in a]
print("".join(a))

ต้องการการเล่นกอล์ฟที่ค่อนข้างยุติธรรม แต่นี่คือความวิกลจริตบางส่วน อ่านมาnแล้วsจาก STDIN

ส่วนที่สนุกคือในการกำหนดวงของเราคัดลอกbแล้วเริ่ม popping จากbช่วงเข้าใจรายการ หากการมอบหมายเป็นวิธีอื่นมันจะไม่ทำงาน!



4

Java - 162 174

ไม่ใช่ทุกวันที่ฉันต้องใช้วง do / while ในการเล่นกอล์ฟใน Java: D

นี่เป็นเพียงการวนซ้ำและเติมลงในช่องว่างตามที่มา มันจะดำเนินต่อไปจนกว่าจะไม่มี_ผลลัพธ์อีกต่อไป

char[]a(int n,char[]s){char[]o=new char[n];if(n>0)do for(int i=0,j=0;i<n;i++)if(o[i]==95|o[i]<1)o[i]=s[j++%s.length];while(new String(o).contains("_"));return o;}

ด้วยตัวแบ่งบรรทัด:

char[]a(int n,char[]s){
    char[]o=new char[n];
    if(n>0)
        do
            for(int i=0,j=0;i<n;i++)
                if(o[i]==95|o[i]<1)
                    o[i]=s[j++%s.length];
        while(new String(o).contains("_"));
    return o;
}

ฉันจะไม่ตอบคำถามนี้ แต่คำตอบอื่น ๆ ของ Java ยาวเกินกว่าจะปล่อยให้ยืนได้)
Geobits

3

Java 8, 238

(n,s)->{int i=0,j=0;for(s=String.join("",java.util.Collections.nCopies(n,new String(s))).toCharArray();j<1;){for(i=0;i<n;i++){for(;s[++j]!=95&j<n;);if(j<n)s[j]=s[i];}for(j=1,i=0;i<n;)j=s[++i]==95?0:1;}return java.util.Arrays.copyOf(s,n);}

หักกอล์ฟ:

(Integer n, char[] s) -> {
    int i = 0, j = 0;
    for (s = String.join("", java.util.Collections.nCopies(n, new String(s))).toCharArray(); j < 1;) {
        for (i = 0; i < n; i++) {
            for (; s[j] != 95 & j < n; j++);
            if (j < n) {
                s[j] = s[i];
            }
        }
        for (j = 1, i = 0; i < n;) {
            j = s[++i] == 95 ? 0 : 1;
        }
    }
    return java.util.Arrays.copyOf(s, n);
}

3

ทับทิม, 60

->n,s{eval"r=%1$p.chars;s.gsub!(?_){r.next};"*n%s*=n;s[0,n]}

เชื่อมsต่อกับnเวลาของตัวเองจากนั้นสร้างnสำเนาของรหัสที่แทนที่ขีดล่างด้วยsประเมินการคัดลอกเหล่านั้นและส่งกลับnอักขระแรกของผลลัพธ์ เนื่องจากมีการขีดเส้นใต้อย่างน้อยหนึ่งอันในแต่ละลูปจึงรับประกันได้ว่าจะให้nขีดล่างที่ไม่มีอักขระ


ไวยากรณ์ที่ถูกต้องในการเรียกใช้นี้คืออะไร? เมื่อผมเรียกมันว่าfและเรียกใช้ผมได้รับข้อผิดพลาดต่อไปนี้:puts f[10,"ab_"] in 'eval': undefined method 'next' for #<Array:...มันดูเหมือนจะทำงานเมื่อไม่มีขีดเส้นใต้ในสตริงแม้ว่า
Théophile

โอ้น่าสนใจดูเหมือนว่าพฤติกรรมของการString#charsเปลี่ยนแปลงระหว่าง Ruby 1.9.3 และ Ruby 2.0; ใน Ruby 1 จะส่งคืนตัวแจงนับเมื่อไม่มีบล็อกใน Ruby 2 อาร์เรย์ มันสามารถทำให้รุ่นตายโดยการเปลี่ยนcharsเป็นeach_charรหัสสุทธิ 4 ไบต์ของรหัสเพิ่มเติม
ฮิสโทแกต

3

Python 2, 75

n,s=input()
S='';c=0
for x in s*n:b=x=='_';S+=S[c:c+b]or x;c+=b
print S[:n]

สิ่งนี้คาดว่าจะมีการป้อนข้อมูลเช่น (30,"ab_c_")การป้อนข้อมูลนี้คาดว่าเหมือน

ใน Python สตริงไม่อนุญาตให้มีการมอบหมาย ดังนั้นการแทนที่ช่องว่างด้วยตัวละครที่ต้องการนั้นยาก เราสามารถแก้ไขมันได้ด้วยการแปลงเป็นลิสต์และย้อนกลับ แต่ฉันคิดว่ามันสั้นกว่าที่จะเพียงแค่สร้างเอาท์พุทสตริงตั้งแต่เริ่มต้นและเพิ่มตัวอักษรที่ต้องการทีละตัว

เอาต์พุตที่กำลังสร้างคือSซึ่งเริ่มว่างเปล่า เราวนซ้ำอักขระของอินพุตที่sคัดลอกหลายครั้งเพื่อจำลองวงกลม เราตรวจสอบว่ามันว่างเปล่าผ่านบูลีนbหรือไม่ เราตรวจสอบความเท่าเทียมกันx=='_'มากกว่าการเปรียบเทียบเนื่องจากขีดเส้นใต้อยู่ระหว่างตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก

Sถ้าตัวละครไม่ว่างเราเพียงแค่เพิ่มมันลงบน Sถ้ามันเป็นความว่างเปล่าเราเพิ่มตัวอักษรที่ไม่ได้ใช้ต่อไปของการส่งออกให้ไกล เราติดตามตัวอักษรที่ใช้โดยตัวชี้ดัชนีcที่เริ่มต้นที่ 0 และเพิ่มขึ้นทุกครั้งที่เราพบช่องว่าง

ในตอนท้ายเราพิมพ์nอักขระตัวแรกของสตริงผลลัพธ์Sตัวละครของสตริงที่เกิด

เราต้องใช้งานS[c:c+b]แทนที่สั้นกว่าb*S[c]เพราะหลังให้ข้อผิดพลาดนอกขอบเขตเมื่อSเริ่มว่างเปล่าและcเป็น 0 มันไม่สำคัญเพราะเรารับประกันได้ว่าอักขระตัวแรกของsไม่ว่างเปล่าดังนั้นจึงS[c]ไม่จำเป็น แต่รหัสไม่ทราบ การorลัดวงจรไปยังการลัดวงจรอาจช่วยแก้ปัญหานี้ได้เช่นกัน แต่มีค่าใช้จ่ายมากกว่า


Python 2, 83

พอร์ตPyth -to-Python ของโซลูชันของisaacgซึ่งใช้splitและzipดำเนินการเปลี่ยน:

n,s=input()
s*=n
exec"s=''.join(a+b for a,b in zip(s.split('_'),s));"*n
print s[:n]

มันกลับกลายเป็นว่านานกว่าเพราะแปลกใจวิธีการตั้งชื่อมีความยาวในหลาม แต่มันสามารถปรับปรุงให้ดีขึ้นได้ด้วยการ riffling sและs.split('_')รวมกันในวิธีที่สั้นกว่า


ดี! ไม่คาดหวังว่าการสร้างสตริงใหม่จะสั้นกว่านี้มาก!
Sp3000

3

Haskell (93) 67

ฉันยังไม่ได้เขียน Haskell ใด ๆ ในขณะนี้ดังนั้นอาจสั้นลงได้มาก แต่มันก็ดีมากเราต้องย่อให้สั้นลงและทำให้ดีขึ้น!

('_':b)&(d:e)=d:b&e;(a:b)&c=a:b&c
f n s=take n$q where q=cycle s&q

การใช้งาน:

*Main> f 50 "ab_a_cc"
"abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca"

2

รุ่นที่ - 425

ฉันจะสูญเสียหรือไม่

@echo off&setLocal enableDelayedExpansion&set s=%2
if "%3"=="" (for /l %%a in (1,1,%1)do set o=!o!%s%)else set o=%3
set o=!o:~0,%1!&set l=0
:c
if defined s set/al+=1&set "s=%s:~1%"&goto c
set s=%2&set/ap=%1-1
set y=&set c=0&for /l %%a in (0,1,%p%)do set x=!o:~%%a,1!&if !x!==_ (for %%b in (!c!)do set y=!y!!s:~%%b,1!&set/ac+=1)else (set y=!y!!x!)&if !c!==%l% set c=0
if "!y:_=!"=="!y!" echo !y!&goto :EOF
%0 %1 %2 !y!

แบทช์มีข้อ จำกัด - ฉันยอมรับสิ่งนี้ ตัวอย่างเช่น; ฉันต้องใช้ a สำหรับ loop เพื่อรับตัวแปรเดี่ยวในรูปแบบที่ใช้งานได้เนื่องจากข้อ จำกัด ของการแยกวิเคราะห์ไวยากรณ์ for %%b in (!c!)do... มีอยู่แล้วเพื่อให้ฉันสามารถใช้%%bแทน!c!ดังนั้นฉันจึงสามารถทำการจัดการสตริง!s:~%%b,1!และขยายตัวแปรในเวลาที่ถูกต้อง

มีสองสิ่งพื้นฐานที่ฉันสามารถทำได้เพื่อตีกอล์ฟต่อไป แต่อาจไม่ต่ำกว่า 400 ไบต์ ฉันจะมีรอยแตกอีกเร็ว ๆ นี้


3
ยกเว้นในกรณีที่คนอื่นโพสต์คำตอบชุดที่ดีกว่าฉันจะไม่เรียกการสูญเสียนี้ :)
SP3000

@ Sp3000 ถ้ามีใครบางคนเท่านั้นที่จะ
ลุง

2

ECMAScript 6, 78

f=(s,n,i=0)=>[...s.repeat(n)].reduce((s,x)=>s+(x=='_'?s[i++]:x),'').slice(0,n)

เริ่มต้นด้วยสตริงว่างและสำหรับการเกิดขีดล่างทุกครั้งจะแทนที่ด้วยอักขระที่ดัชนีถัดไปของสตริงปัจจุบัน


1

Python 2 - 99 97 ไบต์


เนื่องจากการส่งจาก python 4 ครั้งไม่เพียงพอ ...

n,s=input();S=s=s*n
while"_"in S:x=iter(s);S="".join(j>"_"and j or next(x)for j in S)
print S[:n]

ตัวอย่าง:

$ python2 t.py 
(50, "ab_a_cc")
abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca

0

ECMAScript 6, 93 91

(n,s)=>{for(x="_".repeat(n);n=0,/_/.test(x);)x=x.replace(/_/g,a=>s[n++%s.length]);return x}

ปลดล็อค 2 ตัวละครจากเวอร์ชั่นแรก

(n,s)=>{x="_".repeat(n);while(/_/.test(x)){n=0,x=x.replace(/_/g,a=>s[n++%s.length])}return x}

0

C # - 162

ฉันขโมย Geobits solution และเปลี่ยนเป็น C #

char[]p(int n,string s){var r=new char[n];if(n>0)do for(int i=0,j=0;i<n;i++)if(r[i]=='_'||r[i]<1)r[i]=s[j++%s.Length];while(r.ToList().IndexOf('_')>=0);return r;}

1 ถ่านดีขึ้นดังนั้นคุณสามารถปรับปรุง Geobits;)

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