Boşlukları doldurun


14

Giriş

Negatif olmayan bir tam sayı nve syalnızca alfasayısal karakterler ve alt çizgiler içeren boş olmayan bir dize _. İlk karakteri sdeğil _. Alt sçizgileri, diğer karakterlerle doldurulabilen boş alanlar olarak yorumlanır.

Sonsuz bir "sonsuz dizgiler" dizisini aşağıdaki gibi tanımlarız. Dize sadece bir sonsuz birçok kez tekrarladı. Hepsi için , dize elde edilir karakter ile boş alanlar doldurularak , önce söz konusu arasında değiştirilir ile ikinci, vb. İlk harfi olmadığı için , her boşluk sonunda doldurulur ve her birinin yerine nihai değeri konmuş olan sonsuz dizgiyi gösteririz .s1 = s s s...sk > 1sk+1sks1_sks1[0]s1[1]s_s_

Çıktı

Dize olarak ilk nkarakterleri .s

Misal

Girişleri n = 30ve s = ab_c_. Sahibiz

s1 = ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_...

İkame boşlukları için , elimizdekis1s1

s2 = abacbab_ccab_caabbc_abcc_abacbab_cc...

Yine boşlukları değiştiririz .s1

s3 = abacbabaccabbcaabbc_abcccabacbab_cc...

Bir değişiklik daha:

s4 = abacbabaccabbcaabbcaabcccabacbabbcc...

Bundan, ilk 30 karakterini ,s

abacbabaccabbcaabbcaabcccabacb

Bu doğru çıktıdır.

kurallar

Tam bir program veya işlev yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez. Yanlış girişte kilitlenme kabul edilebilir.

Test Durumları

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"

Girişi ters sırada alabilir miyiz (siparişin önemli olduğu dillerde)?
Martin Ender

@ MartinBüttner Elbette, buna izin vereceğim.
Zgarb

Yanıtlar:


4

Pyth, 17

<ussC,cG\_GUQ*zQQ

Giriş ilk satırdaki dize ve ikinci satırdaki uzunluk STDIN'de verilmelidir. Örneğin:

abc____
50

Burada deneyin.

Açıklama:

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

şu şekilde kullanılır:

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

Açıklama:

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


⍣≡şık bir fikir. Belki ben bu port için denemek gerekir ...
FUZxxl

7

CJam, 26 24 20 bayt

Peter sayesinde 4 bayt kurtardı.

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

Burada test edin. nDizeyi birinci ve ikinci STDIN'de alır.

Tüm test senaryolarını girişe oldukları gibi yapıştırarak ( -> outputisterseniz dahil edin ) ve aşağıdaki test kayışını kullanarak (kodun sırasını tersine çevirerek) çalıştırabilirsiniz:

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

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

]oNo}/

açıklama

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

Sonuç, programın sonunda otomatik olarak yazdırılır.

Bir not [\]: Prensip olarak, [yığının geçerli boyutunu hatırlar ve ]her şeyi bir dizideki en son hatırlanan boyuta kadar toplar. Ancak, dizi boyutu aradaki hatırlanan boyutun altına düşerse, dizinin başlangıcı buna göre ayarlanır. Şimdi, en üstteki iki dizi öğesinin değiştirilmesinin dizi boyutunu etkilemediğini düşünebilirsiniz, ancak \aslında iki değer çıkarır ve bunları ters sırada iter. Dizinin başlangıcını ikiye iten şey budur. Bu nedenle, [\]bir dizideki en üstteki iki yığın öğesini kaydırmanın en kısa yoludur. Bazen, onları ters sırada toplamanın yan etkisi oldukça sinir bozucu, ancak bu durumda tam olarak ihtiyacım olan şey.


Ben değiştirmek düşünüyorum _'_#) gile I*. GolfScript'te benim için çalışıyor.
Peter Taylor

@PeterTaylor oh, çok iyi fikir, teşekkürler!
Martin Ender

6

Python 3, 110 bayt

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

Biraz daha golf gerekiyor, ama işte bazı delilik. İçinde okur n, sonra sSTDIN'den.

Eğlenceli kısmı biz döngünün atamasında olduğu kopyalamak b, o andan itibaren çıkmaya başladığını bbir liste anlayışı sırasında . Ödev başka bir yol olsaydı işe yaramazdı!



4

Java - 162173

Java: D'de golf yaparken bir do / while döngüsü kullanmak her gün değil

Bu sadece tekrarlar ve geldiklerinde boşlukları doldurur. Sonuçta daha fazla yok olana kadar devam ediyor _.

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

Satır kesmeleri ile:

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

Buna cevap vermeyecektim, ancak diğer Java yanıtı durmak için çok uzundu;)
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);}

Daha az golf:

(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

Yakut, 60

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

Bitiştirir skendisine nkez, daha sonra üretir ndeÄŸiÅŸtirecektir alt çizgiler o kodun kopyalarını s, bu kopyaları değerlendirir ve ilk döndürür nsonucun karakterleri. Her döngüde en az bir alt çizgi kaldırıldığından, bunun bize nalt çizgi içermeyen karakterler sağlaması garanti edilir .


Bunu çalıştırmak için doğru sözdizimi nedir? Onu aradığınızda fve çalıştırmak puts f[10,"ab_"], aşağıdaki hatayı alıyorum: in 'eval': undefined method 'next' for #<Array:.... Bununla birlikte, dizede alt çizgi olmadığında işe yarıyor gibi görünüyor.
Théophile

İlginç, String#charsRuby 1.9.3 ve Ruby 2.0 arasında değişmiş gibi görünüyor ; Ruby 1'de blok olmadığında bir numaralandırıcı, Ruby 2'de bir dizi döndürür. Bu değiştirerek versiyon-duyarsız hale getirilebilir charsiçin each_charkod 4 daha net bayt pahasına.
histokrat

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]

Bu gibi girdi bekler (30,"ab_c_").

Python'da, dizeler atamaya izin vermez. Bu nedenle, boşlukları istenen karakterle değiştirmek zordur. Bir liste ve geri dönüştürerek bu alabilirsiniz, ama ben sadece çıktı dizesini sıfırdan oluşturmak için daha kısa buldum, bir kerede istenen karakterleri ekleyerek.

Oluşturulmakta olan çıktı Sboş başlar. sBir çemberi simüle etmek için birçok kez kopyalanan girdinin karakterleri arasında dolaşırız. Boolean üzerinden boş olup olmadığını kontrol ediyoruz b. Eşitlemeyi x=='_'karşılaştırma yerine kontrol ederiz, çünkü alt çizgi büyük ve küçük harfler arasındadır.

Karakter boş değilse, üzerine ekleriz S. Boşsa, şimdiye kadar çıktının bir sonraki kullanılmayan harfini ekleriz S. Kullanılmış harfleri c0 ile başlayan ve her boşlukla karşılaştığımızda artan bir indeks işaretçisi ile izleriz.

Sonunda, nortaya çıkan dizenin ilk karakterlerini yazdırıyoruz S.

Daha S[c:c+b]kısa yerine kullanmalıyız , b*S[c]çünkü ikincisi Sboş başladığında c0 olduğunda sınır dışı bir hata verir. Asla önemli değildir, çünkü ilk karakterinin sboş olmadığı garanti edilmez, bu yüzden bu S[c]asla gerekli değildir, ancak kod bunu bilmiyor. Lanetleme orkısa devre de bu çözmek, ancak daha fazla karakter maliyeti olabilir.


Python 2, 83

Değiştirmeyi kullanan splitve zipgerçekleştirmek için isaacg çözümünün Pyth-Python bağlantı noktası :

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

Daha uzun ortaya çıktı, çünkü sürpriz, adlandırılmış yöntemler python'da uzun. Ancak belki de daha kısa bir şekilde sve s.split('_')daha kısa sürede birlikte geliştirilebilir .


Güzel! Dize yeniden inşa çok daha kısa olmasını beklemiyorduk!
Sp3000

3

Haskell (93) 67

Bir süredir Haskell yazmadım, bu muhtemelen çok kısaltılabilir. ama çok iyiydi, kısaltmak ve daha iyi hale getirmek zorunda kaldık!

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

Kullanımı:

*Main> f 50 "ab_a_cc"
"abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca"

2

Parti - 425

Kaybeder miyim

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

Toplu iş sınırlamaları vardır - Bunu kabul ediyorum. Örneğin; Değişken ayrıştırma sözdizimi sınırlamaları nedeniyle kullanılabilir bir biçimde tek bir değişken almak için bir for döngüsü kullanmak zorunda kaldı. for %%b in (!c!)do... sadece dize manipülasyon yapmak ve değişkenleri doğru zamanda genişletmek %%byerine kullanabilirsiniz .!c!!s:~%%b,1!

Bunu daha da golf için yapabileceğim oldukça basit şeyler birkaç, ama muhtemelen 400 bayt altında değil. Yakında başka bir çatlak daha olacak.


3
Birisi daha iyi bir Toplu cevap
yayınlamadığı

@ Sp3000 Keşke birileri.
unclemeat

2

ECMAScript 6, 78

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

Boş bir dize ile başlar ve alt çizgilerin her tekrarında, onu geçerli dizenin bir sonraki dizinindeki karakterle değiştirir.


1

Python 2-99 97 bayt


4 python tabanlı gönderim yeterli olmadığından ...

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]

Misal:

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

İlk sürümden 2 karakter çıkarıldı.

(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 çözümünü çaldım ve C # olarak değiştirdim

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 karakter daha iyi, böylece Geobits'i geliştirebilirsiniz;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.