Tarefa:
Existem muitas respostas neste site que são organizadas em arte ascii, como esta . Normalmente, o arranjo é feito manualmente, mas um programa não ajudaria nisso? :)
Seu programa terá três entradas:
- O código, como uma única linha
- O número de linhas no padrão (pode ser omitido se não for necessário)
- O próprio padrão, como
*
s ou outro caractere
Regras:
- Você precisa escrever um programa (não uma função) que leia stdin
- O texto é colocado da esquerda para a direita por linha
- Se não houver texto suficiente para preencher o padrão, coloque
.
s nos espaços restantes - Se houver muito texto para preencher o padrão, imprima-o após a saída
- code-golf , então o código mais curto, em bytes, vence
Execuções de amostra:
Entrada (teste de ajuste exato) :
qwertyuiopasdfghjklzxcvbnm
4
***** * ***
* * * *
* * * *
***** * ***
Saída :
qwert y uio
p a s d
f g h j
klzxc v bnm
Entrada (teste de caracteres extras) :
qwertyuiopasdfghjklzxcvbnm12345
4
***** * ***
* * * *
* * * *
***** * ***
Saída :
qwert y uio
p a s d
f g h j
klzxc v bnm
12345
Entrada (teste de caracteres insuficientes) :
qwertyuiopasdfg
4
***** * ***
* * * *
* * * *
***** * ***
Saída :
qwert y uio
p a s d
f g . .
..... . ...
X
es para programa para trabalhar?Respostas:
GolfScript, 30 caracteres
Execute online .
Exemplos:
fonte
Edição 6:
60 caracteresPerl : 38 pontos (veja abaixo)Se você não aprecia minhas terríveis habilidades artísticas, aqui está o golfe:
Este faz coisas estranhas com os tempos de avaliação.
Primeiro, o
BEGIN
palavra chave força[get.comb, "." xx *]
a ser avaliada primeiro, colocando em uma matriz a lista de caracteres que compõem "o código", seguida por uma quantidade infinita de"."
s.Em seguida, o
get
final é avaliado, obtendo o número de linhas do modelo de arte ASCII. Oxx
operador repete a primeira parte do programa várias vezes. Isso faz mais sentido quando você percebe quecode() xx count()
é basicamente açúcar paracode() for 1..count()
:count()
deve ser avaliado primeiro.Finalmente,
get
no início do programa, obtém uma linha do modelo de arte ASCII e substitui todos os"*"
um com um valor deslocado do início da matriz que criamos antes de todo o resto ({shift BEGIN …}
).EDITAR:
Jogou até 37 caracteres, mais um para a opção de linha de comando:
Esse é o mesmo conceito que o original, o
-p
comutador iterando sobre cada linha (após aBEGIN
leitura do "código") e substituindo todos os*
s pela letra seguinte do "código" antes de imprimi-lo. O formato de entrada para isso não deve incluir o número de linhas do formato.fonte
Ruby 2.0,
5352 caracteresDe acordo com a especificação, não usa o paramater 'número de linhas'.
Exemplo de execução:
Resultado:
fonte
./ascii.rb: line 2: syntax error near unexpected token `(' ./ascii.rb: line 2: `puts gets($n).gsub(?*){c.slice!(0)||?.},c'
puts
com$><<
e mudando o,
no final para um+
PowerShell ,
63868382 bytes+20 bytes obrigado @Veskah
Experimente online!
Menos golfe:
fonte
Japonês , 18 bytes
Tente
fonte
sVl)iVr-@t°J1 ª'.
trabalha para 17T-SQL, 142 bytes
Experimente online
fonte
Perl 5
-plF
, 51 bytesExperimente online!
fonte
JavaScript - 199
Gera caracteres extras na entrada de texto, se não for usado no padrão, usa "." se não houver o suficiente.
EDIT: modificado para ser uma função que aceita texto e padrão
fonte
function p(a,c){x=c.split(s='*').length-1;for(i=x-a.length;i--;)a+='.';for(;i++<x;)c=c.replace(s,a[i]);console.log(c+'\n'+a.substring(x))}
JavaScript (ES6) -
9687Nota: Conforme sugerido pelo OP , estou usando uma função. Mas se for necessário ter um programa, aqui está uma solução de 93 caracteres .
EDIT1: Grande mudança, não sei por que não percebi isso pela primeira vez: P Salvei 40 caracteres.
Uso :
Entrada de teste : (sem número opcional desnecessário conforme a especificação)
Saída :
Código Ungolfed :
Seria muito bom ouvir sugestões de usuários :)
fonte
Perl, 70 caracteres
Ou, sem verificação de limite, 56 caracteres
Observe que este código não está usando a segunda linha como na especificação e pode ser reduzido por três caracteres
<>;
fonte
Bater,
166 156 111106Lê da entrada padrão, não leva uma contagem de linhas. A primeira linha de entrada é o código que você deseja inserir na arte ascii, todas as linhas subseqüentes são a arte ascii, consistindo no
@
caractere. A entrada tem um comprimento máximo de 999 caracteres e não tem permissão para conter barras . (Optei por não usar*
ou#
porque eles têm significados especiais no Bash).AVISO: Este programa usa um arquivo chamado
p
. Depois de executar o programa, excluap
- ele confundirá o programa na segunda vez em que você o executar.A maior parte do trabalho aqui é feita por
A primeira linha substitui a primeira
@
na técnica pelo primeiro caractere do código. A segunda linha remove o primeiro caractere do código.Se não houver código suficiente para preencher a forma, uma nova linha será impressa após a saída principal da arte ASCII
echo $i
.fonte
C,
98, 91 caracteresAqui está uma solução C bastante direta, com menos de 100 caracteres. Isso não usa a entrada de contagem de linhas. (Caso contrário, seria necessário um segundo get desnecessário ()).
ungolfed:
fonte
puts(s)
vez deprintf("%s",s)
salvar 7 bytes.\n
é um problema.Python 2.7,
165155150138119 caracteresOk, praticamente, mas acho que é a menor maneira de fazer isso com o Python.
Edit: nova versão 1.0.1 funcional com menos bytes usados:
Edit2: em
map(r,['']*input())
vez de[r()for _ in[1]*input()]
e removida importação não utilizadaEdit3: em
'>'*input()
vez de['']*input()
salvar um caractere e adicionar um caractere de prompt para o padrão :)fonte
(['.']+l).pop(0)
vez de(len(l)and l.pop(0)or'.')
salvar 9 bytes. E eminput()
vez deint(r())
salvar 1 byte.input
! Infelizmente, seu primeiro conselho não funciona porque gera pontos contanto que o comprimento da string seja> 0.(l+['.']).pop(0)
vez disso, mas se isso também não funcionar, você ainda poderá salvar 4 bytes usando eml and
vez delen(l)and
.(l+['.']).pop(0)
não remove elementos del
tão somente primeiro caractere é impresso, masl
condição funciona :)C # (compilador interativo do Visual C #) , 122 bytes
Experimente online!
fonte
"\n"+
arquivo para adicionar os caracteres extras à mesma linha05AB1E ,
181715 bytesPega o código como primeira entrada, padrão como segundo (com em
0
vez de#
).Experimente online ou verifique todos os casos de teste .
Alternativa de18bytes usando as entradas na ordem inversa:Experimente online .
Explicação:
fonte