A arte de moldar palavras
Dada uma matriz binária e uma sequência de letras, substitua todos os 1s da matriz da esquerda para a direita pelas letras da sequência. Depois que as letras forem formadas na forma da matriz, imprima a matriz, substituindo os zeros por espaços. Provavelmente é mais fácil apenas dar um exemplo ou dois.
Caso: Caso base ...
Entrada Um:
[0,0,1,0,0]
[0,1,0,1,0]
[1,0,0,0,1]
[0,1,0,1,0]
[0,0,1,0,0]
"PPCGPPCG"
Saída um:
P
P C
G P
P C
G
Caso: Se a sequência de entrada for maior que o número de unidades ...
Entrada dois:
[1,0,0]
[0,1,0]
[1,0,1]
lambda
Saída dois:
l
a
m b
Caso: Se a sequência de entrada for menor que o número de unidades ...
Entrada três:
[1,1,1]
[1,0,1]
[1,1,1]
PPCG
Saída três:
PPC
G P
PCG
Premissas Disponíveis
- Você pode assumir que a sequência de entrada nunca está vazia.
- Você pode assumir que a matriz nunca estará vazia.
- Você não pode assumir que a matriz binária nunca será todos os zeros.
Regras
- Se a sequência for menor que o número de unidades, repita a sequência; todos devem ser substituídos.
- Se a sequência for maior que o número de unidades, use apenas o necessário.
- Você pode usar Verdadeiro / Falso no lugar de números inteiros / bits para a entrada.
- Os espaços à direita SÃO NECESSÁRIOS, todos os zeros devem ser substituídos por espaços.
- Uma única nova linha à direita é aceitável.
- Isso é código-golfe, menor número de bytes ganhos.
Respostas:
MATL , 11 bytes
As entradas são uma matriz numérica (com o
;
separador de linhas) e uma sequência.Experimente online! Ou verifique os casos de teste: 1 , 2 , 3 .
fonte
Vim,
4442 bytesGuardado 2 bytes graças a @DjMcMoylex !
Aqui, o
^M
é uma nova linha literal e o^V
éCTRL-VAceita a entrada neste formato:
Aviso Legal: Se a string tiver mais de ~ 40 caracteres, o computador poderá ficar sem memória RAM.
Explicação:
Aqui está um gif meu "executando" o "programa":
fonte
{
no lugar degg
tirar algumas.Retina ,
4133 bytesExperimente online!
A string de entrada é fornecida na primeira linha da entrada, seguida pela matriz. Como o Retina não tem conceito de listas (ou realmente qualquer coisa, exceto cadeias), não há separadores na matriz binária, exceto os feeds de linha para separar as linhas.
Explicação
Transforma zeros em espaços.
Substitua repetidamente o primeiro
1
pelo primeiro caractere da sequência de entrada enquanto gira esse caractere até o final da sequência de entrada. Isso cuida dos casos em que há mais1
s do que caracteres na sequência de entrada.Descarte a primeira linha, ou seja, a sequência de entrada.
fonte
(.)(.*)
- Teehee ...JavaScript ES6,
67535049 bytesGuardado 3 bytes graças a @ETHproductions Guardado mais 1 graças a @Neil
Código antigo antes que eu soubesse que as matrizes de string são um formato de entrada válido:
Mostrar snippet de código
fonte
c=>' '[c]||b[i++%b.length]
, mas, infelizmente, é um byte mais longo ...(a,b,i)=>a.replace(/\d/g,c=>+c?b[++i]||b[i=0]:' ')
i
éundefined
, então++i
retornaNaN
. Desdeb
não temNaN
propriedade,b[++i]
retornosundefined
, eo||
operador explore seu argumento do lado direito, a criaçãoi
de0
e retornando o primeiro caractere emb
.\d
? Certamente.
é suficiente, já que você só precisa lidar com0
s e1
s (.
não corresponde a novas linhas).Perl, 40 bytes
36 bytes de código +
-i -p
sinalizadores.(observe o espaço final e a falta de nova linha final).
Para executá-lo, escreva a sequência de entrada após o
-i
sinalizador e forneça a matriz na entrada:Se o seu Perl for um pouco antigo, talvez seja necessário adicionar um ponto e vírgula final (após o espaço).
fonte
Python 2,
11471 bytesAcontece que eu estava reinventando a roda, uma simples substituição dupla em uma corda de várias linhas funciona muito bem. A string tem o benefício adicional de poder contar zeros diretamente, em vez de precisar fazer o realmente feio
s*len(L)*len(L[0])
para uma lista aninhadaSolução antiga:
Primeiro convertemos tudo + 32 com
chr
(todos os zeros se tornam espaços), depois substituímos todos!
por{}
para permitir o uso deformat
função.SeSe eu decidir trapacear e usar emNULL
puder ser contado como um espaçoNULL
vez do espaço, posso pular a adição de 32 para salvar 12 bytes. (print
exibido'\x00'
como um espaço)fonte
.replace('\x00',' ')
na extremidade adiciona 20 bytesAPL, 18 bytes
Essa é uma função que usa uma matriz booleana como argumento à esquerda e uma string como argumento à direita.
Explicação:
O APL possui um built-in que faz algo assim,
\
(expanda). No entanto, ele funciona apenas em vetores e exige que cada caractere seja realmente usado.X←,⍺
: achatar a matriz e armazenar o resultado em X.⍵⍴⍨+/X
: reformule o vetor de caracteres para que ele tenha a quantidade necessária de elementos (isso também ajuda a prolongar a sequência repetindo caracteres, se necessário).X\
: Tomar um dos caracteres para cada1
e um espaço para cada0
noX
.(⍴⍺)⍴
: reformule o resultado para que ele tenha o formato da matriz original.fonte
PHP,
11091978882818075 byteseconomizou 6 bytes graças a @ user59178
Corra com
-r
. Espera matriz como sequência multilinha no primeiro argumento, sequência no segundo argumento.fonte
foreach(str_split($argv[1])as$c)echo$c<1?$c?:" ":($s=$argv[2])[$k++%strlen($s)];
Eu troquei a ordem dos dois ternários e, assim, deixou cair os suportes a partir do segundo, usando<1
, em vez de>0
for(;""!=$c=$argv[1][$i++];)
vez deforeach(...)
PowerShell v2 +, 70 bytes
Leva a palavra de entrada como
$a
e a matriz como uma matriz de matrizes como$b
(veja exemplos abaixo). Faz um$b
loop através dos elementos de cada linha$_|%{...}
. O loop interno é uma condiçãoif
/else
, onde produzimos$a[$n++]
e modificamos igual ao comprimento da string ou produzimos um espaço' '
. Esses são-join
reunidos novamente em uma sequência. Cada uma das seqüências é deixada no pipeline e a saída implícita com novas linhas entre acontece atravésWrite-Output
da conclusão do programa.fonte
Groovy, 63
fonte
Python 3, 104 (ou 83) bytes
Há uma opção mais curta (83 bytes), mas falhará se a sequência for mais de 999 vezes menor que o necessário:
fonte
next
uma lista. Se você fizers=iter(list(s)*999)
isso acontecer (89 bytes)s.pop(0)
. Parece que eu copiei a versão errada, consertei isso.s[i++%s.length()]
é uma boa metodologia, embora eu não conheça python.i++
em PythonPitão, 12 bytes
Experimente online: Demonstração
Explicação:
fonte
ES6, 78 bytes
eu tentei
fonte
Lisp comum, 152 bytes
Uso:
Essa função percorre cada elemento de cada linha da grade. A
format
cadeia de controle imprime um espaço se o elemento for 0 ou consome o argumento de caractere se o elemento for 1. Uma nova linha é impressa após cada linha da grade. Se a string for muito curta, ela se repete desde o início; se for muito longo, apenas a parte apropriada será exibida.fonte
Pip , 18 bytes
17 bytes de código, +1 para
-l
sinalizador.Aceita a matriz como o primeiro argumento da linha de comando, assim:
100 010 101
(precisa ser citado em shells) e a string como o segundo argumento da linha de comando.Experimente online!Explicação
fonte
Java,
237233 bytesEditar: salvou 4 bytes graças a Mukul Kumar
Golfe:
Ungolfed:
Teste:
fonte
Pyke, 12 bytes
Experimente aqui!
Produz uma matriz de caracteres
Ou 9 bytes, não competitivo.
Experimente aqui!
Ainda mais não competitivo, 8 bytes
Experimente aqui!
print_grid
agora alinha cordas vazias corretamentedeep_for
agora adivinhar tipos de falsidades de um tipo diferente das verdadesO que outras pessoas estão dizendo
fonte
Java, 122 bytes
fonte
Mathematica, 76 bytes
Sem nome função de dois argumentos, a primeira das quais (
#
) é uma matriz deTrue
s eFalse
s, e o segundo dos quais (s
) é uma lista de caracteres. A função auxiliaré definido, o que coloca os movimentos do primeiro caractere
s
no final e, em seguida, retorna esse caractere recém-movido. Ligarf
várias vezes retornará ciclicamente os caracteres des
em ordem.A função principal é
que chama
f
cadaTrue
valor na matriz de entrada e retorna um espaço em cada entrada falsa. (O{2}
dizMap
para trabalhar em elementos das listas de componentes da matriz, em vez das próprias listas.)Esses 60 bytes retornam uma matriz de caracteres de
s
e espaços. O invólucrocoloca novas linhas entre as listas dessa matriz e concatena tudo.
fonte
C ++, 61 bytes
fonte