Điền vào chỗ trống


14

Đầu vào

Một số nguyên không âm nvà một chuỗi không trống schỉ chứa các ký tự chữ và số và dấu gạch dưới _. Các nhân vật đầu tiên slà không _. Các dấu gạch dưới sđược hiểu là khoảng trắng có thể được điền với các ký tự khác.

Chúng tôi định nghĩa một chuỗi vô hạn của "chuỗi vô hạn" như sau. Chuỗi chỉ được lặp lại vô hạn nhiều lần. Đối với tất cả , chuỗi được lấy từ bằng cách điền vào chỗ trống của nó với các nhân vật của , để là người đầu tiên của được thay thế bằng , thứ hai với , và vân vân. Vì chữ cái đầu tiên là không , cuối cùng mọi khoảng trống đều được lấp đầy và chúng tôi biểu thị bằng chuỗi vô hạn nơi mọi thứ đã được thay thế bằng giá trị cuối cùng của nó.s1 = s s s...sk > 1sk+1sks1_sks1[0]s1[1]s_s_

Đầu ra

Các nký tự đầu tiên như là một chuỗi.s

Thí dụ

Hãy xem xét các đầu vào n = 30s = ab_c_. Chúng ta có

s1 = ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_...

Thay thế vào chỗ trống của , chúng tôi cós1s1

s2 = abacbab_ccab_caabbc_abcc_abacbab_cc...

Chúng tôi một lần nữa thay thế cho khoảng trống, kết quả làs1

s3 = abacbabaccabbcaabbc_abcccabacbab_cc...

Thêm một sự thay thế:

s4 = abacbabaccabbcaabbcaabcccabacbabbcc...

Từ đó, chúng ta có thể suy ra 30 ký tự đầu tiên , đó làs

abacbabaccabbcaabbcaabcccabacb

Đây là đầu ra chính xác.

Quy tắc

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép. Đâm vào đầu vào không chính xác là chấp nhận được.

Các trường hợp thử nghiệm

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"

Chúng ta có thể nhận đầu vào theo thứ tự ngược lại (trong các ngôn ngữ mà thứ tự quan trọng) không?
Martin Ender

@ MartinBüttner Chắc chắn, tôi sẽ cho phép điều đó.
Zgarb 2/2/2015

Câu trả lời:


4

Bình thường, 17

<ussC,cG\_GUQ*zQQ

Đầu vào phải được cung cấp với chuỗi trên dòng đầu tiên và độ dài trên giây, trên STDIN. Ví dụ:

abc____
50

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

Giải trình:

                             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←⍺⍴⍵}⍣≡

nó được sử dụng như thế này:

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

Giải trình:

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

Dùng thử


⍣≡là một ý tưởng tiện lợi. Có lẽ tôi nên thử chuyển cái này sang J ...
FUZxxl

7

CJam, 26 24 20 byte

4 byte được lưu nhờ Peter.

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

Kiểm tra nó ở đây. Lấy chuỗi đầu tiên và nthứ hai trên STDIN.

Bạn có thể chạy tất cả các trường hợp kiểm tra bằng cách dán chúng vào đầu vào như hiện tại (bao gồm -> outputnếu bạn muốn) và sử dụng khai thác kiểm tra sau (đảo ngược thứ tự cho mã):

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

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

]oNo}/

Giải trình

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.";

Kết quả được in tự động vào cuối chương trình.

Một lưu ý về [\]: Về nguyên tắc, [hãy nhớ kích thước hiện tại của ngăn xếp và ]thu thập mọi thứ xuống kích thước được nhớ cuối cùng trong một mảng. Tuy nhiên, nếu kích thước mảng giảm xuống dưới kích thước được ghi nhớ ở giữa, thì bắt đầu của mảng sẽ được điều chỉnh tương ứng. Bây giờ bạn có thể nghĩ rằng việc hoán đổi hai phần tử mảng trên cùng không ảnh hưởng đến kích thước mảng, nhưng \thực tế sẽ bật hai giá trị và sau đó đẩy chúng theo thứ tự ngược lại. Đây là những gì đẩy sự bắt đầu của mảng xuống hai. Do đó, [\]là cách ngắn nhất để bọc hai phần tử ngăn xếp trên cùng trong một mảng. Đôi khi, tác dụng phụ của việc thu thập chúng theo thứ tự ngược lại khá khó chịu, nhưng trong trường hợp này, đó chính xác là những gì tôi cần.


Tôi nghĩ bạn có thể thay thế _'_#) gbằng I*. Làm việc cho tôi trong GolfScript.
Peter Taylor

@PeterTaylor oh, ý kiến ​​rất hay, cảm ơn!
Martin Ender

6

Python 3, 110 byte

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

Cần chơi golf nhiều hơn một chút, nhưng đây là một sự điên rồ tuyệt đối. Đọc nsau đó stừ STDIN.

Phần thú vị là, trong bài tập của vòng lặp, chúng tôi sao chép b, sau đó bắt đầu xuất hiện btrong quá trình hiểu danh sách . Nếu nhiệm vụ là cách khác, nó sẽ không hoạt động!



4

Java - 162 174

Không phải ngày nào tôi cũng có thể sử dụng vòng lặp do / while khi chơi golf trong Java: D

Điều này chỉ lặp đi lặp lại và điền vào chỗ trống khi họ đến. Nó chỉ tiếp tục cho đến khi không có thêm _kết quả.

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

Với ngắt dòng:

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

Tôi sẽ không trả lời câu hỏi này, nhưng câu trả lời Java khác quá dài để có thể đứng vững;)
Geobits 2/215

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

Ít chơi gôn hơ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

Hồng ngọc, 60

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

Kết hợp svới nthời gian của chính nó , sau đó tạo các nbản sao mã thay thế dấu gạch dưới s, đánh giá các bản sao đó và trả về các nký tự đầu tiên của kết quả. Vì ít nhất một dấu gạch dưới được xóa trong mỗi vòng lặp, điều này được đảm bảo để cung cấp cho chúng ta ncác ký tự không gạch dưới.


Cú pháp đúng để chạy này là gì? Khi tôi gọi nó fvà chạy puts f[10,"ab_"], tôi gặp lỗi sau : in 'eval': undefined method 'next' for #<Array:.... Nó dường như hoạt động khi không có dấu gạch dưới trong chuỗi.
Théophile

Thật thú vị, có vẻ như hành vi String#charsthay đổi giữa Ruby 1.9.3 và Ruby 2.0; trong Ruby 1, nó trả về một liệt kê khi không có khối, trong Ruby 2 một mảng. Nó có thể được làm cho phiên bản không nhạy cảm bằng cách thay đổi charsthành each_char, với chi phí thêm 4 byte mã.
lịch sử

3

Con trăn 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]

Điều này mong đợi đầu vào như thế nào (30,"ab_c_").

Trong Python, chuỗi không cho phép gán. Vì vậy, thay thế khoảng trống bằng ký tự mong muốn là khó. Người ta có thể khắc phục điều này bằng cách chuyển đổi thành một danh sách và quay lại, nhưng tôi thấy nó ngắn hơn khi chỉ tạo chuỗi đầu ra từ đầu, thêm vào từng ký tự mong muốn.

Đầu ra đang được xây dựng là S, bắt đầu trống. Chúng tôi lặp qua các ký tự của đầu vào sđược sao chép nhiều lần để mô phỏng một vòng tròn. Chúng tôi kiểm tra xem nó có trống qua Boolean không b. Chúng tôi kiểm tra sự bình đẳng x=='_'thay vì so sánh vì dấu gạch dưới nằm giữa chữ in hoa và chữ thường.

Nếu ký tự không trống, chúng ta chỉ cần thêm nó vào S. Nếu nó trống, chúng tôi thêm chữ cái không sử dụng tiếp theo của đầu ra cho đến nay S. Chúng tôi theo dõi các chữ cái được sử dụng bởi một con trỏ chỉ mục cbắt đầu từ 0 và được tăng lên mỗi khi chúng tôi gặp một khoảng trống.

Cuối cùng, chúng tôi in các nký tự đầu tiên của chuỗi kết quả S.

Chúng tôi phải sử dụng S[c:c+b]thay cho ngắn hơn b*S[c]bởi vì cái sau có lỗi ngoài giới hạn khi Sbắt đầu trống và clà 0. Nó không bao giờ quan trọng bởi vì chúng tôi đảm bảo ký tự đầu tiên slà không trống, vì vậy điều này S[c]không bao giờ cần thiết, nhưng mã không biết điều đó. Việc orchuyển sang trạng thái ngắn mạch cũng có thể giải quyết điều này, nhưng tốn nhiều ký tự hơn.


Con trăn 2, 83

Một cổng Pyth-to-Python của giải pháp isaacg , sử dụng splitzipthực hiện thay thế:

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

Nó bật ra lâu hơn bởi vì, bất ngờ, các phương thức được đặt tên là dài trong python. Nhưng nó có lẽ có thể được cải thiện bằng cách rifflingss.split('_')cùng nhau một cách ngắn hơn.


Đẹp! Không mong đợi việc xây dựng lại chuỗi sẽ ngắn hơn nhiều!
Sp3000

3

Haskell (93) 67

Tôi đã không viết bất kỳ Haskell nào trong một thời gian, vì vậy điều này có thể được rút ngắn rất nhiều. nhưng nó rất tốt, chúng tôi phải rút ngắn nó và làm cho nó tốt hơn!

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

Sử dụng:

*Main> f 50 "ab_a_cc"
"abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca"

2

Mẻ - 425

Tôi có thua không?

@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!

Batch có những hạn chế - Tôi chấp nhận điều này. Ví dụ; Tôi đã phải sử dụng một vòng lặp for để có được một biến ở định dạng có thể sử dụng được do các hạn chế của cú pháp phân tích cú pháp biến. for %%b in (!c!)do... chỉ tồn tại để tôi có thể sử dụng %%bthay vì !c!vậy tôi thực sự có thể thực hiện thao tác chuỗi !s:~%%b,1!và mở rộng các biến vào đúng thời điểm.

Có một vài điều khá cơ bản tôi có thể làm để chơi gôn hơn nữa, nhưng có lẽ không dưới 400 byte. Tôi sẽ có một vết nứt khác sớm thôi.


3
Trừ khi có người khác đăng câu trả lời Batch tốt hơn, tôi sẽ không gọi điều này là thua :)
Sp3000

@ Sp3000 Nếu chỉ có ai đó sẽ.
khai mạc

2

Bản thảo 6, 78

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

Bắt đầu với một chuỗi trống và cho mỗi lần xuất hiện của dấu gạch dưới, thay thế nó bằng ký tự ở chỉ mục tiếp theo của chuỗi hiện tại.


1

Python 2 - 99 97 byte


Bởi vì 4 bài nộp dựa trên python không đủ ...

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]

Thí dụ:

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

0

Bản thảo 6, 93 91

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

Cạo sạch 2 ký tự từ phiên bản đầu tiên.

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

0

C # - 162

Tôi đã đánh cắp giải pháp Geobits và thay đổi nó thành 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 char tốt hơn, vì vậy bạn có thể cải thiện Geobits;)

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.