空白を埋める


14

入力

非負の整数n、およびs英数字とアンダースコアのみを含む空でない文字列_。の最初の文字はsです_。の下線はs、他の文字で埋めることができる空白スペースとして解釈されます。

「無限ストリング」の無限シーケンスを次のように定義します。文字列は、無限に何度も繰り返されます。すべての場合、文字列はの文字で空白スペースを埋めることから取得されます。したがって、最初のが、で置換され、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...

もう1つの置換:

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"

入力を逆の順序(順序が重要な言語で)で取得できますか?
マーティンエンダー

@MartinBüttner確かに、私はそれを許可します。
ズガルブ

回答:


4

Pyth、17

<ussC,cG\_GUQ*zQQ

入力は、STDINの1行目に文字列を、2行目に長さを指定する必要があります。例えば:

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で最初と2番目の文字列を取得します。

すべてのテストケースをそのまま入力に貼り付け(-> 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つの配列要素を交換しても配列サイズにはまったく影響しないが、\実際には2つの値をポップしてから逆の順序でプッシュすると考えるかもしれません。これが、配列の開始を2押し下げます。したがって、[\]配列内の上位2つのスタック要素をラップする最短の方法です。時々、逆の順序でそれらを収集する副作用は非常に迷惑ですが、この場合、まさに私が必要とするものです。


私はあなたが交換することができると思う_'_#) gI*。GolfScriptで動作します。
ピーターテイラー

@PeterTaylorああ、非常に良いアイデア、ありがとう!
マーティンエンダー

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から読み込みます。

楽しい部分は、ループの割り当てでコピーしbbリストの内包からポップを開始することです。割り当てが逆の場合、機能しません!



4

Java-162 174

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

私はこれに答えるつもりはありませんでしたが、他の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、結果の最初の文字を返します。各ループで少なくとも1つのアンダースコアが削除されるため、nアンダースコアのない文字が保証されます。


これを実行する正しい構文は何ですか?呼び出してf実行するとputs f[10,"ab_"]、次のエラーが表示されますin 'eval': undefined method 'next' for #<Array:...。ただし、文字列にアンダースコアがない場合は機能するようです。
テオフィル

ああ、興味深いことに、String#charsRuby 1.9.3とRuby 2.0の間で変更された動作のように見えます。Ruby 1ではブロックがないときに列挙子を返し、Ruby 2では配列を返します。コードをさらに4ネットバイト犠牲にcharsしてeach_char、に変更することでバージョンに依存しないようにできます。
-histocrat

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では、文字列は割り当てを許可しません。そのため、空白を目的の文字に置き換えるのは困難です。リストに変換して戻すことでこれを回避できますが、出力文字列をゼロから生成し、必要な文字を1つずつ追加する方が短いことがわかりました。

構築される出力はでS、空で始まります。sコピーされた入力の文字を何度もループして、円をシミュレートします。Booleanを使用して、空白かどうかを確認しbます。平等をチェックx=='_'アンダースコアは大文字と小文字の間にあるため、比較ではなくます。

文字が空白でない場合は、単にに追加しますS。空白の場合、output-so-farの次の未使用の文字を追加しSます。使用済みの文字をインデックスポインターで追跡しますcは、0から始まり、空白が検出されるたびに増加ます。

最後nに、結果の文字列の最初の文字を出力しますS

私たちは、使用する必要がS[c:c+b]短いの代わりにb*S[c]するとき、後者は範囲外のエラーを与えるのでS、空を開始し、c我々は最初の文字が保証しているので、それは重要なことはありません0です。sこれはので、非ブランクがあるがS[c]、必要とされることはありませんしかし、コードはそれを知りません。orショートサーキットに切り替えることでもこれを解決できますが、より多くのキャラクターが必要になります。


Python 2、83

isaacgのソリューションPythからPythonへの移植で、置換を使用splitzipて実行します。

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

驚いたことに、Pythonでは名前付きメソッドが長いため、時間が長くなりました。しかし、それは恐らくより短い方法で波打つこと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

Python 2-99 97バイト


4つのPythonベースの提出では十分ではないため...

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.