Riempi gli spazi vuoti


14

Ingresso

Un numero intero non negativo ne una stringa non vuota scontenente solo caratteri alfanumerici e caratteri di sottolineatura _. Il primo personaggio di snon lo è _. I caratteri di sottolineatura di svengono interpretati come spazi vuoti che possono essere riempiti con altri caratteri.

Definiamo una sequenza infinita di "stringhe infinite" come segue. La stringa viene ripetuta all'infinito molte volte. Per tutti , la stringa viene ottenuta riempiendo i suoi spazi vuoti con i caratteri di , in modo che il primo di venga sostituito con , il secondo con e così via. Dal momento che la prima lettera di non lo ès1 = s s s...sk > 1sk+1sks1_sks1[0]s1[1]s_ , ogni spazio vuoto alla fine viene riempito, e denotiamo con la stringa infinita dove ogni è stato sostituito dal suo valore finale.s_

Produzione

I primi ncaratteri come stringa.s

Esempio

Considera gli input n = 30e s = ab_c_. abbiamo

s1 = ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_...

Sostituendo gli spazi vuoti di , abbiamos1s1

s2 = abacbab_ccab_caabbc_abcc_abacbab_cc...

Sostituiamo nuovamente gli spazi vuoti, che si traducono ins1

s3 = abacbabaccabbcaabbc_abcccabacbab_cc...

Un'altra sostituzione:

s4 = abacbabaccabbcaabbcaabcccabacbabbcc...

Da questo possiamo già dedurre i primi 30 caratteri di , che sonos

abacbabaccabbcaabbcaabcccabacb

Questo è l'output corretto.

Regole

È possibile scrivere un programma completo o una funzione. Vince il conteggio di byte più basso e non sono consentite scappatoie standard. Arresto anomalo su input errati è accettabile.

Casi test

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"

Possiamo prendere input nell'ordine opposto (nelle lingue in cui l'ordine conta)?
Martin Ender,

@ MartinBüttner Certo, lo permetterò.
Zgarb,

Risposte:


4

Pyth, 17

<ussC,cG\_GUQ*zQQ

L'input deve essere dato con la stringa sulla prima riga e la lunghezza sulla seconda, su STDIN. Per esempio:

abc____
50

Provalo qui.

Spiegazione:

                             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

29 APL 28

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

è usato così:

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

Spiegazione:

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


⍣≡è un'idea elegante. Forse dovrei provare a
portarlo

7

CJam, 26 24 20 byte

4 byte salvati grazie a Peter.

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

Provalo qui. Prende la stringa prima e nseconda su STDIN.

È possibile eseguire tutti i casi di test incollandoli nell'input così come sono (includendo -> outputse si desidera) e utilizzando il seguente cablaggio di test (che inverte l'ordine per il codice):

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

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

]oNo}/

Spiegazione

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

Il risultato viene stampato automaticamente alla fine del programma.

Una nota su [\]: in linea di principio, [ricorda la dimensione corrente della pila e ]raccoglie tutto fino all'ultima dimensione ricordata in un array. Tuttavia, se la dimensione dell'array scende al di sotto della dimensione ricordata, l'inizio dell'array viene regolato di conseguenza. Ora potresti pensare che lo scambio dei primi due elementi dell'array non influisca affatto sulla dimensione dell'array, ma in \realtà apre due valori e li spinge in ordine inverso. Questo è ciò che spinge l'inizio dell'array di due. Pertanto, [\]è il modo più breve per avvolgere i primi due elementi dello stack in un array. A volte, l'effetto collaterale di raccoglierli in ordine inverso è piuttosto fastidioso, ma in questo caso è esattamente quello di cui ho bisogno.


Penso che potresti sostituirlo _'_#) gcon I*. Funziona per me in GolfScript.
Peter Taylor,

@PeterTaylor oh, ottima idea, grazie!
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))

Ha bisogno di un po 'più di golf, ma ecco un po' di follia. Legge npoi sda STDIN.

La parte divertente è che nell'incarico del loop copiamo b, quindi iniziamo a saltar fuori bdurante una comprensione della lista . Se il compito fosse il contrario, non funzionerebbe!



4

Java - 162 174

Non capita tutti i giorni di usare un ciclo do / while durante il golf in Java: D

Questo solo itera e riempie gli spazi vuoti man mano che arrivano. Continua fino a quando non ci sono più_ risultati.

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

Con interruzioni di riga:

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

Non avevo intenzione di rispondere a questa domanda, ma l'altra risposta di Java era troppo lunga per lasciarla stare;)
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);}

Meno 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

Ruby, 60 anni

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

Si concatena sa se stesson volte, quindi genera ncopie di codice che sostituisce i caratteri di sottolineatura con s, valuta tali copie e restituisce i primi ncaratteri del risultato. Dal momento che almeno un carattere di sottolineatura viene rimosso in ogni ciclo, questo è garantito per darci ncaratteri senza carattere di sottolineatura.


Qual è la sintassi giusta per eseguire questo? Quando io lo chiamo fe corsa puts f[10,"ab_"], ottengo il seguente errore: in 'eval': undefined method 'next' for #<Array:.... Sembra funzionare anche se non ci sono caratteri di sottolineatura nella stringa.
Théophile,

Oh, interessante, sembra che il comportamento sia String#charscambiato tra Ruby 1.9.3 e Ruby 2.0; in Ruby 1 restituisce un enumeratore quando non ci sono blocchi, in Ruby 2 un array. Può essere reso insensibile alla versione cambiando charsin each_char, al costo di altri 4 byte netti di codice.
istocrato

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]

Questo si aspetta input simili (30,"ab_c_") .

In Python, le stringhe non consentono l'assegnazione. Quindi, sostituire gli spazi vuoti con il personaggio desiderato è difficile. Si può aggirare questo convertendo in un elenco e viceversa, ma ho trovato più breve generare semplicemente la stringa di output da zero, aggiungendo i caratteri desiderati uno alla volta.

L'output in costruzione è S, che inizia vuoto. sEsaminiamo più volte i caratteri dell'input copiati per simulare un cerchio. Controlliamo se è un vuoto tramite il booleano b. Controlliamo l'uguaglianzax=='_' piuttosto che il confronto perché il trattino basso si trova tra lettere maiuscole e minuscole.

Se il personaggio non è vuoto, lo aggiungiamo semplicemente a S. Se è vuoto, aggiungiamo la successiva lettera inutilizzata dell'output-finora S. Tracciamo le lettere usate da un puntatore indicec che inizia da 0 e viene incrementato ogni volta che incontriamo uno spazio vuoto.

Alla fine, stampiamo i primi ncaratteri della stringa risultanteS .

Dobbiamo usare S[c:c+b]al posto del più corto b*S[c]perché quest'ultimo dà un errore fuori limite quando Sinizia vuoto ed cè 0. Non importa mai perché ci viene garantito che il primo carattere di snon è vuoto, quindi S[c]non è mai necessario, ma il codice non lo sa. Anche capovolgere il orcortocircuito potrebbe risolvere questo problema, ma costa più personaggi.


Python 2, 83

Una porta Pyth -to-Python della soluzione di isaacg , che utilizza splite zipper eseguire la sostituzione:

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

Si è scoperto più a lungo perché, a sorpresa, i metodi denominati sono lunghi in Python. Ma può forse essere migliorato sfogliando se s.split('_')insieme in modo più breve.


Bello! Non mi aspettavo che ricostruire la stringa fosse molto più breve!
Sp3000,

3

Haskell (93) 67

Non scrivo Haskell da un po 'di tempo, quindi questo può probabilmente essere abbreviato di molto. ma è stato così bello, abbiamo dovuto accorciarlo e renderlo migliore!

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

Uso:

*Main> f 50 "ab_a_cc"
"abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca"

2

Lotto - 425

Perdo?

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

Il batch ha delle limitazioni: lo accetto. Per esempio; Ho dovuto usare un ciclo for per ottenere una singola variabile in un formato utilizzabile a causa dei limiti della sintassi di analisi delle variabili. for %%b in (!c!)do... esiste solo così posso usare %%binvece di !c!così posso effettivamente fare la manipolazione di stringhe !s:~%%b,1!e far espandere le variabili al momento giusto.

Ci sono un paio di cose piuttosto basilari che potrei fare per continuare a giocare a golf, ma probabilmente non sotto i 400 byte. Presto un'altra crepa.


3
A meno che qualcun altro non
pubblichi

@ Sp3000 Se solo qualcuno lo farebbe.
salato

2

ECMAScript 6, 78

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

Inizia con una stringa vuota e per ogni occorrenza del carattere di sottolineatura, lo sostituisce con il carattere nell'indice successivo della stringa corrente.


1

Python 2 - 99 97 byte


Perché 4 invii basati su Python non sono sufficienti ...

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]

Esempio:

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

Rasato 2 caratteri dalla prima versione.

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

0

C # - 162

Ho rubato la soluzione Geobits e l'ho cambiata in 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 carattere migliore, in modo da poter migliorare i geobit;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.