Preencher os espaços


14

Entrada

Um número inteiro não negativo ne uma sequência não vazia scontendo apenas caracteres alfanuméricos e sublinhados _. O primeiro caractere de snão é _. Os sublinhados de ssão interpretados como espaços em branco que podem ser preenchidos com outros caracteres.

Definimos uma sequência infinita de "seqüências infinitas" da seguinte maneira. A corda é repetida apenas infinitamente várias vezes. Para todos , a string é obtida preenchendo seus espaços em branco com os caracteres de , para que o primeiro de seja substituído por , o segundo de , e assim por diante. Como a primeira letra de não é , todo espaço em branco é preenchido eventualmente, e nós denotamos pela cadeia infinita em que todos foram substituídos por seu valor final.s1 = s s s...sk > 1sk+1sks1_sks1[0]s1[1]s_s_

Resultado

Os primeiros ncaracteres de como uma sequência.s

Exemplo

Considere as entradas n = 30e s = ab_c_. Nós temos

s1 = ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_...

Substituindo os espaços em branco de , temoss1s1

s2 = abacbab_ccab_caabbc_abcc_abacbab_cc...

Substituímos novamente os espaços em branco, o que resulta ems1

s3 = abacbabaccabbcaabbc_abcccabacbab_cc...

Mais uma substituição:

s4 = abacbabaccabbcaabbcaabcccabacbabbcc...

A partir disso, já podemos deduzir os 30 primeiros caracteres , que sãos

abacbabaccabbcaabbcaabcccabacb

Esta é a saída correta.

Regras

Você pode escrever um programa completo ou uma função. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas. Falha na entrada incorreta é aceitável.

Casos de teste

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"

Podemos receber informações na ordem oposta (nos idiomas em que a ordem é importante)?
Martin Ender

@ MartinBüttner Claro, vou permitir isso.
Zgarb 02/02

Respostas:


4

Pyth, 17

<ussC,cG\_GUQ*zQQ

A entrada deve ser fornecida com a string na primeira linha e o comprimento na segunda, em STDIN. Por exemplo:

abc____
50

Experimente aqui.

Explicação:

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

é usado assim:

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

Explicação:

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


⍣≡é uma ideia bacana. Talvez eu devesse tentar portar isso para J ...
FUZxxl

7

CJam, 26 24 20 bytes

4 bytes salvos graças a Peter.

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

Teste aqui. Leva a corda primeiro e nsegundo em STDIN.

Você pode executar todos os casos de teste colando-os na entrada como estão (inclua o -> outputse desejar) e usando o seguinte equipamento de teste (que reverte a ordem do código):

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

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

]oNo}/

Explicação

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

O resultado é impresso automaticamente no final do programa.

Uma observação sobre [\]: em princípio, [lembra o tamanho atual da pilha e ]coleta tudo até o último tamanho lembrado em uma matriz. No entanto, se o tamanho da matriz ficar abaixo do tamanho lembrado no meio, o início da matriz será ajustado de acordo. Agora você pode pensar que a troca dos dois principais elementos da matriz não afeta o tamanho da matriz, mas \na verdade exibe dois valores e os pressiona na ordem inversa. É isso que empurra o início da matriz para baixo em dois. Portanto, [\]é a maneira mais curta de agrupar os dois principais elementos da pilha em uma matriz. Às vezes, o efeito colateral de colecioná-los em ordem inversa é bastante irritante, mas, neste caso, é exatamente o que eu preciso.


Eu acho que você poderia substituir _'_#) gpor I*. Funciona para mim no GolfScript.
22413 Peter Peter Taylor

@ PeterTaylor oh, muito boa ideia, obrigado!
Martin Ender

6

Python 3, 110 bytes

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

Precisa de um pouco mais de golfe, mas aqui está uma insanidade pura. Lê nentão a spartir de STDIN.

A parte divertida é que, na tarefa do loop que copiamos b, começamos a aparecer bdurante a compreensão da lista . Se a tarefa fosse inversa, não funcionaria!



4

Java - 162 174

Não é todo dia que uso um loop do / while ao jogar golfe em Java: D

Isso apenas itera e preenche os espaços em branco quando eles chegam. Ele continua até que não haja mais _resultado.

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

Com quebras de linha:

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

Eu não estava indo para responder a esta, mas a outra resposta Java foi muito tempo para deixar repousar;)
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);}

Menos golfe:

(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

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

Concatena spara si próprio nvezes, depois gera ncópias de código que substituem sublinhados s, avalia essas cópias e retorna os primeiros ncaracteres do resultado. Como pelo menos um sublinhado é removido em cada loop, é garantido que ele nos dê ncaracteres sem sublinhado.


Qual é a sintaxe correta para executar isso? Quando eu chamá-lo fe correr puts f[10,"ab_"], eu recebo o seguinte erro: in 'eval': undefined method 'next' for #<Array:.... Parece funcionar quando não há sublinhados na string.
Théophile

Oh, interessante, parece que o comportamento de String#chars mudou entre Ruby 1.9.3 e Ruby 2.0; no Ruby 1, ele retorna um enumerador quando não há bloco; no Ruby 2, uma matriz. Ele pode ser tornado insensível à versão alterando charspara each_char, ao custo de mais 4 bytes líquidos de código.
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]

Isso espera entrada como (30,"ab_c_").

No Python, strings não permitem atribuição. Portanto, é difícil substituir os espaços em branco pelo caractere desejado. Pode-se contornar isso convertendo para uma lista e retornando, mas achei mais curto gerar apenas a sequência de saída do zero, adicionando os caracteres desejados um de cada vez.

A saída que está sendo construída é S, que começa vazia. Percorremos os caracteres da entrada scopiados várias vezes para simular um círculo. Verificamos se está em branco através do Boolean b. Verificamos a igualdade x=='_'em vez da comparação porque o sublinhado está entre letras maiúsculas e minúsculas.

Se o personagem não estiver em branco, basta adicioná-lo S. Se estiver em branco, adicionamos a próxima letra não utilizada da saída até o momento S. Rastreamos as letras usadas por um ponteiro de índice cque começa em 0 e é incrementado cada vez que encontramos um espaço em branco.

No final, imprimimos os primeiros ncaracteres da sequência resultante S.

Temos que usar S[c:c+b]no lugar do mais curto, b*S[c]porque o último gera um erro fora dos limites quandoS começa vazio e cé 0. Isso nunca importa, porque temos a garantia de que o primeiro caractere snão está em branco; portanto, isso S[c]nunca é necessário, mas o código não sabe disso. Ativar o orcurto-circuito também pode resolver isso, mas custa mais caracteres.


Python 2, 83

Uma porta Pyth-to-Python da solução de isaacg , que usa splite zipexecuta a substituição:

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

Ficou mais tempo porque, surpresa, os métodos nomeados são longos em python. Mas talvez possa ser melhorado riffling se s.split('_')juntos de uma maneira mais curta.


Agradável! Não esperava que a reconstrução da corda fosse muito mais curta!
Sp3000

3

Haskell (93) 67

Eu não escrevo nenhum Haskell há algum tempo, então isso provavelmente pode ser reduzido em muito. mas foi tão bom que tivemos que encurtar e melhorar!

('_':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

Lote - 425

Eu perco?

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

O lote tem limitações - eu aceito isso. Por exemplo; Eu tive que usar um loop for para obter uma única variável em um formato utilizável devido a limitações da sintaxe de análise de variáveis. for %%b in (!c!)do... existe apenas para que eu possa usar em %%bvez de !c!poder fazer a manipulação de strings !s:~%%b,1!e fazer com que as variáveis ​​se expandam no momento correto.

Há algumas coisas bem básicas que eu poderia fazer para jogar ainda mais, mas provavelmente não abaixo de 400 bytes. Vou ter outra rachadura em breve.


3
A menos que alguém envia uma resposta melhor do lote, eu não chamaria isso de perder :)
SP3000

@ Sp3000 Se ao menos alguém o fizesse.
unclemeat

2

ECMAScript 6, 78

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

Começa com uma string vazia e, para cada ocorrência de sublinhado, a substitui pelo caractere no próximo índice da string atual.


1

Python 2 - 99 97 bytes


Como 4 envios baseados em python não são suficientes ...

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]

Exemplo:

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

Raspou 2 caracteres da primeira versão.

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

0

C # - 162

Eu roubei a solução Geobits e mudei para 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 caractere melhor, para que você possa melhorar os Geobits;)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.