빈칸 채우기


14

입력

음이 아닌 정수 ns영숫자 및 밑줄 만 포함 하는 비어 있지 않은 문자열 _입니다. 의 첫 번째 문자 s는 없습니다 _. 밑줄은 s다른 문자로 채울 수있는 공백으로 해석됩니다.

"무한 문자열"의 무한 시퀀스를 다음과 같이 정의합니다. 현 은 무한히 여러 번 반복됩니다. 모든 문자열은 에서 얻어진다 의 문자는 공백을 채움으로써 , 상기 제 1 저 의 대체되어 상기 제 2, 등. 의 첫 번째 문자가 있기 때문에 하지 않습니다 , 모든 빈 공간은 결국 채워집니다, 우리는에 의해 나타내는 모든이 무한 문자열 의 최종 값으로 대체되었습니다.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

피 이스, 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


⍣≡멋진 아이디어입니다. 어쩌면 나는 이것을 J로 포팅하려고 노력해야한다.
FUZxxl

7

CJam, 26 24 20 바이트

Peter 덕분에 4 바이트가 절약되었습니다.

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

여기에서 테스트하십시오. nSTDIN 에서 문자열을 첫 번째와 두 번째로 가져옵니다 .

모든 테스트 케이스를 그대로 입력에 붙여넣고 ( -> 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.";

결과는 프로그램 끝에서 자동으로 인쇄됩니다.

참고 사항 [\]: 원칙적으로 [스택의 현재 크기를 ]기억하고 배열에서 마지막으로 기억 된 크기까지 모든 것을 수집합니다. 그러나 배열 크기가 그 사이에 기억 된 크기 아래로 떨어지면 배열의 시작이 그에 따라 조정됩니다. 이제 상위 두 배열 요소를 바꾸더라도 배열 크기에는 전혀 영향을 미치지 않지만 \실제로 두 값을 팝한 다음 역순으로 푸시 한다고 생각할 수 있습니다 . 이것이 배열의 시작을 두 배로 낮추는 것입니다. 따라서 [\]상위 2 개의 스택 요소를 배열로 감싸는 가장 짧은 방법입니다. 때때로, 그것들을 역순으로 수집하는 부작용은 상당히 성가신 일이지만,이 경우에는 내가 필요한 것입니다.


나는 당신이 대체 할 수있는 생각 _'_#) g과 함께 I*. GolfScript에서 저에게 효과적입니다.
피터 테일러

@PeterTaylor 아, 아주 좋은 생각, 감사합니다!
Martin Ender 2019

6

파이썬 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다음 sSTDIN에서.

재미있는 부분은 루프의 할당에서 우리가 복사 b한 다음 b목록 이해 중에 터지기 시작하는 것 입니다. 과제가 다른 방법이라면 효과가 없을 것입니다!



4

자바 -162174

Java에서 골프를 칠 때 do / while 루프를 매일 사용하는 것은 아닙니다 : 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;
}

나는 이것에 대답하지 않을 것이지만, 다른 자바 대답은 너무 길어서
참기 힘들었다

3

자바 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루비 1.9.3과 루비 2.0 사이 에서 변경된 동작처럼 보입니다 . Ruby 1에서는 블록이 없을 때 열거 자, Ruby 2에서는 배열을 반환합니다. 순 바이트 코드를 4 바이트 더 추가하여 로 변경 chars하면 버전에 영향을받지 않습니다 each_char.
histocrat

3

파이썬 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_").

파이썬에서 문자열은 할당을 허용하지 않습니다. 따라서 공백을 원하는 문자로 바꾸는 것은 어렵습니다. 목록으로 변환하고 다시 변환 하여이 문제를 해결할 수 있지만 원하는 문자열을 한 번에 하나씩 추가하여 출력 문자열을 처음부터 새로 생성하는 것이 더 짧습니다.

생성되는 출력 S은입니다 (비어 있음). s원을 시뮬레이션하기 위해 여러 번 복사 된 입력 문자를 반복합니다. Boolean을 통해 공백인지 확인합니다 b. 평등을 확인한다x=='_'밑줄은 대문자와 소문자 사이에 있기 때문에 비교보다는 합니다.

문자가 공백이 아닌 경우에 추가합니다 S. 비어있는 경우, 다음에 사용되지 않는 다음 출력 문자를 추가합니다 S. 우리 c는 0에서 시작하고 공백이 생길 때마다 증가 하는 색인 ​​포인터로 사용한 문자를 추적 합니다.

마지막으로 n결과 문자열 의 첫 문자를 인쇄 합니다 S.

비어 있고 0이 시작될 때 후자가 범위를 벗어남 오류를주기 때문에 S[c:c+b]더 짧은 대신에 사용해야 합니다. 첫 번째 문자 가 공백 이 아니라고 보장되므로 결코 중요 하지 않습니다. 그러나 코드는 그것을 모른다. 를 뒤집기 단락으로도이 문제를 해결하지만, 더 많은 문자를 비용 수 있습니다.b*S[c]ScsS[c]or


파이썬 2, 83

isaacg 솔루션 의 Pyth-to-Python 포트는 다음 을 사용 split하고 zip교체를 수행합니다.

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

놀랍게도 명명 된 메소드는 파이썬에서 길기 때문에 더 길었습니다. 그러나 리플 링 ss.split('_')짧은 방식으로 함께 향상시킬 수 있습니다 .


좋은! 문자열을 재구성하는 것이 너무 짧을 것으로 기대하지 않았습니다!
Sp3000

3

하스켈 (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!

배치에는 제한이 있습니다-동의합니다. 예를 들어; 변수 구문 분석 구문의 한계로 인해 사용 가능한 형식으로 단일 변수를 얻으려면 for 루프를 사용해야했습니다. for %%b in (!c!)do... 그냥 존재하므로 %%b대신 사용할 !c!수 있으므로 실제로 문자열 조작을 수행 !s:~%%b,1!하고 변수가 올바른 시간에 확장 되도록 할 수 있습니다 .

이 골프를 더하기 위해 할 수있는 몇 가지 기본 사항이 있지만 아마도 400 바이트 미만은 아닙니다. 금방 다시 갈 게요


3
다른 사람이 더 나은 배치 답변을 게시하지 않는 한, 나는 이것을 잃는 것으로 부르지 않을 것입니다 :)
Sp3000

@ Sp3000 누군가 만 할 것입니다.
unclemeat

2

ECMAScript 6, 78

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

빈 문자열로 시작하고 밑줄이 나타날 때마다 현재 문자열의 다음 인덱스에있는 문자로 바꿉니다.


1

파이썬 2-99 97 바이트


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 솔루션을 훔쳐서 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.