Os envios bem-sucedidos de golfe por código são, por natureza, preenchidos com símbolos malucos em todo o lugar. Para facilitar sua compreensão, muitos golfistas de código optam por incluir uma explicação de seu código. Na explicação deles, a linha de código é transformada em um diagrama explodido verticalmente.
Por exemplo, se este fosse o meu código:
1_'[3:~2@+]`
Um dos muitos diagramas possíveis que eu poderia criar ficaria assim:
1
_'
[ ]
[3: ]
[ ~ ]
[ 2@ ]
[ +]
`
O objetivo
Neste desafio, você escreverá uma ferramenta de formatação automática de explicações que utiliza uma linha de código e cria um diagrama ao qual o texto explicativo pode ser facilmente adicionado.
Para tornar esse desafio mais útil , o usuário poderá especificar o conteúdo de cada linha, fornecendo uma string de formatação. A cadeia de formatação será uma segunda linha, contendo apenas letras A-Za-z
, que é do mesmo tamanho que o programa. As letras mostram a ordem em que os caracteres do programa devem ser impressos na explicação.
Aqui está um exemplo de E / S sem formatação de colchete :
123423
AabcBC
1
2
3
2
3
4
Suportes
Se mais de um caractere no programa tiver o mesmo nível de prioridade, esse conjunto de caracteres funcionará como um único bloco de código (se formarem um grupo) ou um conjunto de colchetes (se eles contiverem outros caracteres no meio). As regras gerais são simples:
Os caracteres não aparecem em uma linha do diagrama até que todos os outros caracteres de maior prioridade já apareçam nas linhas acima dele no diagrama.
Caracteres de igual prioridade são sempre impressos nas mesmas linhas. Se um determinado caractere aparecer em uma linha, todos os outros caracteres de igual prioridade aparecerão na linha.
Um conjunto de caracteres de igual prioridade continua a aparecer em cada linha até que todos os outros caracteres contidos nela apareçam pelo menos uma vez. Isso permite construções "entre parênteses". Se
bceab
forem as prioridades, osb
caracteres aparecerão na segunda linha (são a segunda maior prioridade) e continuarão a aparecer até que todos oscea
caracteres apareçam . Se a seqüência de prioridade forabcadeafga
, todosbcdefg
serão considerados contidos nela, e todos os 4a
s continuarão a aparecer até que apareçag
.
Mais requisitos de formatação
Todas as linhas de saída devem ter o mesmo comprimento (o comprimento das linhas de entrada), preenchidas com espaços conforme necessário. A linha do programa de entrada pode conter espaços, embora esses espaços também recebam uma letra prioritária. Novas linhas à direita na saída / entrada são opcionais.
Pontuação
Isso é código de golfe, o menor número de bytes vence.
Exemplos
Aqui está um exemplo comentado de um pedaço de código com formatação mais complexa.
1_'[3:~2@+]`
abbcddeffgch
1 #highest priority is denoted by the lowercase letter a
_' #priority b
[ ] #all characters with priority c
[3: ] #priority d, but priority c still printed because it encloses more
[ ~ ] #priority e
[ 2@ ] #priority f
[ +] #priority g, last line of c because all enclosed characters have appeared
` #priority h
Um exemplo em Perl:
$_=<>;s/[^aeiou\W]/$&o$&/gi;print
aaaaaabbccccccccccbdddddbbbbeeeee
$_=<>;
s/ / /gi;
s/[^aeiou\W]/ /gi;
s/ /$&o$&/gi;
print
Aqui estão alguns exemplos no CJam, cortesia de Martin Büttner:
l~2*{_2%{3*)}{2/}?_p_(}g;
aabbcdddefffeeggeehhiiccj
l~
2*
{ }g
{_2% }g
{ { }{ }? }g
{ {3*)}{ }? }g
{ { }{2/}? }g
{ _p }g
{ _(}g
;
q{_eu'[,66>"EIOU"-#)g{'o1$}*}/
abcccddddddeeeeeeefgghiijjhhbb
q
{ }/
{_eu }/
{ '[,66> }/
{ "EIOU"- }/
{ # }/
{ )g }/
{ { }*}/
{ {'o }*}/
{ { 1$}*}/
Aqui está um exemplo maluco só para mexer com você:
1_'[3:~2@+]`
azTABACBDCAT
[ : ]
[3: 2 ]
[3:~2 +]
[ :~ @+]
' `
1
_
Aqui está um exemplo mais explícito do que acontece quando os colchetes se sobrepõem abab
. (Normalmente, não é dessa maneira que você escolheria formatar sua explicação.)
aabbccddaaeebb
aabbccddaaeebb
aa aa
aabb aa bb
aabbcc aa bb
aabb ddaa bb
bb eebb #"aa" no longer appears because all of "bbccdd" have already appeared.
fonte
oNo
pode ser substituído porn
no TIO .CJam, 48 bytes
Explicação
fonte
IDL 8.4,
316318304 bytesNova versão, ainda muito longa, mas mais curta! E, no verdadeiro espírito do IDL, completamente vetorizado, o que significa (já que não há loop for) que agora eu posso fazê-lo como uma linha e executá-lo sozinho, depois que minha versão for atualizada completamente para 8.4. Isso será editado mais tarde.
Versão de uma linha:
Com quebras de linha (o mesmo número de bytes, subbing \ n vs &) e comentou:
Aqui está um detalhamento algorítmico da linha 9:
... e 10:
As linhas 9 e 10 realizam o trabalho real, o restante configura as variáveis necessárias para o final. Eu acho que isso é o mais golfe possível, não consigo encontrar outro lugar para fazê-lo melhor.
Versão antiga (tudo abaixo aqui está desatualizado):
Isso está longe de ser curto o suficiente para ganhar, porque essa é uma linguagem terrível para o golfe, mas ninguém nunca responde no IDL, então eu vou tentar.
Não tenho certeza se há alguma maneira de reduzi-lo mais ... Eu poderia chamar strmid em aeb ao mesmo tempo, mas passo mais bytes indexando d e funciona da mesma maneira. Vou continuar trabalhando nisso! (E amanhã vou editar uma explicação do algoritmo.)
fonte