Wypełnij puste pola

14

Wejście

Nieujemna liczba całkowita ni niepusty ciąg szawierający tylko znaki alfanumeryczne i podkreślenia _. Pierwsza postaćs nie jest _. Podkreślenia ssą interpretowane jako puste miejsca, które można wypełnić innymi znakami.

Definiujemy nieskończoną sekwencję „nieskończonych ciągów” w następujący sposób. Ciąg jest powtarzany nieskończenie wiele razy. Dla wszystkich ciąg jest uzyskiwany z wypełnienia pustych miejsc znakami , dzięki czemu pierwszy z nich jest zastąpiony przez , drugi z itd. Ponieważ pierwsza litera nie jest , każda pusta spacja zostaje ostatecznie wypełniona, a my oznaczamy nieskończonym ciągiem znaków, w którym każdy został zastąpiony jego ostateczną wartością.s1 = s s s...sk > 1sk+1sks1_sks1[0]s1[1]s_s_

Wynik

Pierwsze nznaki jako ciąg.s

Przykład

Rozważ dane wejściowe n = 30i s = ab_c_. Mamy

s1 = ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_...

Zastępując puste , mamys1s1

s2 = abacbab_ccab_caabbc_abcc_abacbab_cc...

Ponownie podstawiamy puste pola, co powodujes1

s3 = abacbabaccabbcaabbc_abcccabacbab_cc...

Jeszcze jedna zmiana:

s4 = abacbabaccabbcaabbcaabcccabacbabbcc...

Z tego możemy już wywnioskować pierwsze 30 znaków , które sąs

abacbabaccabbcaabbcaabcccabacb

To jest poprawny wynik.

Zasady

Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone. Awarie przy nieprawidłowym wprowadzaniu danych są dopuszczalne.

Przypadki testowe

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"
Zgarb
źródło
Czy możemy pobierać dane wejściowe w odwrotnej kolejności (w językach, w których kolejność ma znaczenie)?
Martin Ender
@ MartinBüttner Jasne, pozwolę na to.
Zgarb

Odpowiedzi:

4

Pyth, 17 lat

<ussC,cG\_GUQ*zQQ

Dane wejściowe należy podać w pierwszym wierszu z ciągiem znaków, a w drugim - na STDIN. Na przykład:

abc____
50

Wypróbuj tutaj.

Wyjaśnienie:

                             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.
isaacg
źródło
7

APL 29 28

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

jest używany w następujący sposób:

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

Wyjaśnienie:

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

Moris Zucca
źródło
⍣≡to fajny pomysł. Może powinienem spróbować przenieść to na J ...
FUZxxl
7

CJam, 26 24 20 bajtów

4 bajty zapisane dzięki Peterowi.

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

Sprawdź to tutaj. Pobiera ciąg pierwszy i ndrugi na STDIN.

Możesz uruchomić wszystkie przypadki testowe, wklejając je do danych wejściowych takimi, jakie są (włączając -> outputjeśli chcesz) i używając następującej wiązki testowej (która odwraca kolejność kodu):

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

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

]oNo}/

Wyjaśnienie

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

Wynik jest drukowany automatycznie na końcu programu.

Uwaga na temat [\]: Zasadniczo [zapamiętuje aktualny rozmiar stosu i ]zbiera wszystko do ostatniego zapamiętanego rozmiaru w tablicy. Jeśli jednak rozmiar tablicy spadnie poniżej zapamiętanego rozmiaru pomiędzy, wówczas odpowiednio dostosuje się początek tablicy. Teraz możesz pomyśleć, że zamiana dwóch górnych elementów tablicy wcale nie wpływa na rozmiar tablicy, ale w \rzeczywistości wyskakuje dwie wartości, a następnie przesuwa je w odwrotnej kolejności. To spycha początek tablicy o dwa. Dlatego [\]jest to najkrótszy sposób na zawinięcie dwóch górnych elementów stosu w tablicę. Czasami efekt uboczny ich zbierania w odwrotnej kolejności jest dość irytujący, ale w tym przypadku jest to dokładnie to, czego potrzebuję.

Martin Ender
źródło
Myślę, że można zastąpić _'_#) gz I*. Działa dla mnie w GolfScript.
Peter Taylor
@PeterTaylor oh, bardzo dobry pomysł, dzięki!
Martin Ender
6

Python 3, 110 bajtów

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

Potrzebuje trochę więcej gry w golfa, ale oto szaleństwo. Wczytuje nnastępnie sze STDIN.

Zabawne jest to, że w zadaniu pętli kopiujemy b, a następnie zaczynamy wyskakiwać bpodczas czytania listy . Gdyby zadanie było odwrotnie, nie działałoby!

Sp3000
źródło
4

k, 30

{{@[x;i;:;(#i:&"_"=x)#x]}/x#y}
tartin
źródło
4

Java - 162 174

Nie codziennie używam pętli do / while podczas gry w golfa w Javie: D

To tylko iteruje i wypełnia puste pola. Po prostu idzie dalej, dopóki nie będzie już _rezultatu.

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

Z podziałami linii:

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;
}
Geobity
źródło
Nie zamierzałem na to odpowiadać, ale druga odpowiedź Javy była zbyt długa, aby wytrzymać;)
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);}

Mniej golfa:

(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);
}
Ypnypn
źródło
3

Ruby, 60 lat

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

Łączy czasy z ssobą n, a następnie generuje nkopie kodu, który zastępuje podkreślenia s, ocenia te kopie i zwraca pierwsze nznaki wyniku. Ponieważ w każdej pętli usuwany jest co najmniej jeden nznak podkreślenia, gwarantujemy, że otrzymamy znaki bez znaku podkreślenia.

histocrat
źródło
Jaka jest właściwa składnia, aby to uruchomić? Kiedy ja nazywam go fi uruchomić puts f[10,"ab_"], pojawia się następujący błąd: in 'eval': undefined method 'next' for #<Array:.... Wydaje się jednak, że działa, gdy w ciągu nie ma podkreślników.
Théophile,
Och, ciekawe, wygląda na to, że String#charszmieniło się zachowanie między Ruby 1.9.3 i Ruby 2.0; w Ruby 1 zwraca moduł wyliczający, gdy nie ma bloku, w Ruby 2 tablica. Może być niewrażliwy na wersję, zmieniając charsna each_char, kosztem 4 dodatkowych bajtów netto kodu.
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]

To oczekuje wejścia jak (30,"ab_c_").

W Pythonie ciągi nie pozwalają na przypisanie. Tak więc zastąpienie pustych miejsc pożądaną postacią jest trudne. Można to obejść, konwertując na listę iz powrotem, ale znalazłem krótsze, aby wygenerować ciąg wyjściowy od zera, dodając pożądane znaki pojedynczo.

Powstaje wyjście S, które zaczyna się puste. Przechodzimy przez znaki wejściowe skopiowane wiele razy, aby symulować okrąg. Sprawdzamy, czy jest to pusty przez wartość logiczną b. Sprawdzamy równośćx=='_' zamiast porównania, ponieważ podkreślenie leży między dużymi i małymi literami.

Jeśli postać nie jest pusta, po prostu dodajemy ją S. Jeśli jest puste, dodajemy następną nieużywaną literę dotychczasowego wyniku S. Śledzimy używane litery za pomocą wskaźnika indeksuc który zaczyna się od 0 i jest zwiększany za każdym razem, gdy napotykamy spację.

Na koniec wypisujemy pierwsze nznaki wynikowego ciąguS .

Musimy użyć S[c:c+b]zamiast krótszego, b*S[c]ponieważ ten drugi powoduje błąd przekroczenia granicy, gdy Szaczyna się pusty i cwynosi 0. To nigdy nie ma znaczenia, ponieważ gwarantujemy pierwszą postaćs jest niepusty, więc S[c]nigdy nie jest potrzebny, ale kod tego nie wie. Przełączenie na orzwarcie może również rozwiązać ten problem, ale kosztuje więcej postaci.


Python 2, 83

Port Pyth-to-Python rozwiązania isaacg , który używa splitizip wykonuje zamianę:

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

Okazało się to dłużej, ponieważ, o dziwo, nazwane metody są długie w Pythonie. Ale być może można to poprawić poprzez riffling si s.split('_')razem w krótszy sposób.

xnor
źródło
Ładny! Nie spodziewałem się, że odtworzenie struny będzie o wiele krótsze!
Sp3000,
3

Haskell (93) 67

Od jakiegoś czasu nie pisałem żadnego Haskella, więc prawdopodobnie można go znacznie skrócić. ale było tak dobrze, że musieliśmy go skrócić i ulepszyć!

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

Stosowanie:

*Main> f 50 "ab_a_cc"
"abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca"
marinus
źródło
2

Partia - 425

Czy przegrywam

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

Partia ma ograniczenia - akceptuję to. Na przykład; Musiałem użyć pętli for, aby uzyskać pojedynczą zmienną w użytecznym formacie ze względu na ograniczenia składni parsowania zmiennych. for %%b in (!c!)do... po prostu istnieje, więc mogę używać %%bzamiast, !c!więc mogę faktycznie manipulować ciągiem !s:~%%b,1!i mieć zmienne rozwinięte we właściwym czasie.

Jest kilka podstawowych rzeczy, które mógłbym zrobić, aby zagrać w golfa dalej, ale prawdopodobnie nie poniżej 400 bajtów. Niedługo będę miał kolejny crack.

nieszczęście
źródło
3
Chyba że ktoś inny opublikuje lepszą odpowiedź
wsadową
@ Sp3000 Gdyby tylko ktoś chciał.
niepomyślnie
2

ECMAScript 6, 78

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

Zaczyna się od pustego łańcucha i przy każdym wystąpieniu podkreślenia zastępuje go znakiem przy następnym indeksie bieżącego łańcucha.

cPu1
źródło
1

Python 2 - 99 97 bajtów


Ponieważ 4 zapytania oparte na pythonie nie wystarczą ...

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]

Przykład:

$ python2 t.py 
(50, "ab_a_cc")
abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca
matsjoyce
źródło
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}

Ogolono 2 znaki z pierwszej wersji.

(n,s)=>{x="_".repeat(n);while(/_/.test(x)){n=0,x=x.replace(/_/g,a=>s[n++%s.length])}return x}
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
źródło
0

C # - 162

Ukradłem rozwiązanie Geobits i zmieniłem na 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 lepiej, więc możesz ulepszać Geobity;)

mike m
źródło