Introdução
A maioria dos jogadores de código aqui adiciona explicações aos envios, para que seja mais fácil entender o que está acontecendo. Normalmente, as linhas de código vão à esquerda e a explicação correspondente à direita com algum tipo de separador. Para torná-lo bonito, os separadores estão todos na mesma coluna. Além disso, o texto de explicação longo geralmente é agrupado na próxima linha, para que os leitores não precisem rolar horizontalmente para ler tudo.
No entanto, quando você deseja editar esta explicação porque criou alguns golfinhos malucos, muitas vezes acaba gastando tempo para torná-la bonita novamente. Como essa é uma tarefa muito repetitiva, você deseja escrever um programa para isso.
O desafio
Dadas várias linhas de código com explicação e um separador, imprima o código bem formatado com explicação.
Exemplo
Entrada
shM-crz1dc4. "ANDBYOROF # z = entrada rz1 # converte entrada para maiúscula cd # split input nos espaços c4. "ANDBYOROF # cria uma lista de palavras de uma sequência compactada que deve ser ignorada - # filtrar essas palavras hM # leva apenas a primeira letra de todas as palavras s # junte-os em uma sequência
Resultado
shM-crz1dc4. "ANDBYOROF # z = entrada rz1 # converte entrada para maiúscula cd # split input nos espaços c4. "ANDBYOROF # cria uma lista de palavras de uma string empacotada que deve ser # ignorado - # filtrar essas palavras hM # leva apenas a primeira letra de todas as palavras s # junte-os em uma sequência
Um cookie para o primeiro que pode descobrir o que esse código faz.
O algoritmo de formatação
- Encontre a linha de código mais longa (excluindo a explicação e os espaços entre o código e o separador).
- Adicione 5 espaços após essa linha de código e acrescente o separador correspondente com a explicação. Agora é a linha de referência.
- Ajuste todas as outras linhas a essa linha de referência, para que os separadores estejam todos na mesma coluna.
- Quebra todas as linhas com mais de 93 caracteres em uma nova linha da seguinte maneira:
- Encontre a última palavra cujo final está na coluna 93 ou inferior.
- Pegue todas as palavras após esta e envolva-as em uma nova linha com o separador à esquerda e o espaçamento correto. O espaço entre essas duas palavras deve ser excluído; portanto, a primeira linha termina com um caractere de palavra e a segunda linha inicia com uma após o separador.
- Se a linha resultante ainda tiver mais de 93 caracteres, faça o mesmo novamente até que cada linha esteja abaixo de 94 caracteres.
Notas
- Uma palavra consiste em caracteres que não são espaços em branco. As palavras são separadas por um único espaço.
- A quebra de linha é sempre possível. Isso significa que nenhuma palavra é tão longa que tornaria a embalagem impossível.
- A entrada conterá apenas ASCII imprimível e não terá espaços em branco à direita
- O separador aparecerá apenas uma vez por linha.
- Embora a explicação possa ter tamanho ilimitado, o separador e o código podem ter apenas um comprimento máximo combinado de
93 - 5 = 87
caracteres. Os 5 caracteres são os espaços entre o código e o separador. O código e o separador sempre terão pelo menos um caractere. - A entrada pode conter linhas vazias. Esses nunca conterão nenhum caractere (exceto uma nova linha se você receber a entrada como sequência de múltiplas linhas). Essas linhas vazias também devem estar presentes na saída.
- Cada linha terá algum código, um separador e uma explicação. Exceções são linhas vazias.
- Você pode receber a entrada em qualquer formato razoável, desde que não seja pré-processada. Deixe claro em sua resposta qual você usa.
- A saída pode ser uma sequência multilinha ou uma lista de sequências.
Regras
- Função ou programa completo permitido.
- Regras padrão para entrada / saída.
- Aplicam-se brechas padrão .
- Isso é código-golfe , portanto, a menor contagem de bytes vence. O desempate é uma submissão anterior.
Casos de teste
O formato de entrada aqui é uma lista de cadeias que representam as linhas e uma única cadeia para o separador. Ambos são separados por vírgula. Saída é uma lista de strings.
['shM-crz1dc4. "ANDBYOROF # z = entrada', '', 'rz1 # converte entrada em maiúscula', 'cd # entrada dividida em espaços', 'c4." ANDBYOROF # cria uma lista de palavras de um pacote string que deve ser ignorada ',' - # filtrar essas palavras ',' hM # pega apenas a primeira letra de todas as palavras ',' s # junta-as a uma string '], "#" -> [' shM-crz1dc4 . "ANDBYOROF # z = entrada ',' ',' rz1 # converte entrada em maiúscula ',' cd # entrada dividida em espaços ',' c4." ANDBYOROF # cria uma lista de palavras de uma sequência compactada que deve ser ' , '# ignorado', '- # filtra essas palavras ',' hM # pega apenas a primeira letra de todas as palavras ',' s # junta-as a uma sequência '] ['codecodecode e # Explanation', 'sdf dsf sdf e # A Explicação Muito, muito, muito muito muito muito muito muito muito longo longo longo longo longo longo longo longo longo longo longo explicação longa e cada vez mais longa' '' ',' alguns mais código # e mais algumas explicações '], "e #" -> [' codecodecode e # Explicação ',' sdf dsf sdf e # A Muito muito muito muito muito muito muito muito muito muito muito muito tempo muito tempo muito longo ',' e # long longo longo longo longo longo explicação e ele fica cada vez mais longo ',' e # e mais ',' ',' mais código e # e mais explicação ']
Feliz codificação!
length of the longest code-line + 5
. Isso também se aplicava a linhas que contêm apenas uma explicação, porque foram quebradas.Respostas:
Ruby,
245237220216212209205 bytesFunção anônima. Abordagem bastante básica (encontre comprimento máximo, adicione 5 e faça o processamento em cada linha, com recursão para lidar com quebra automática) e pode haver outra abordagem que economize mais bytes.
Excluí a resposta anterior que não atendia a todos os requisitos; Eu não queria ter um código semi-respondido como resposta (também estava diminuindo a votação por estar incompleto), mas ele deve fazer tudo o que a pergunta pede agora.
Changelog:
map
chamada e removendo algumas desnecessáriasstrip
funções base na promessa de que as palavras na explicação sempre têm exatamente um espaço entre elas. Além disso," "
é atribuído a uma constante agora, já que eu a uso muito.map
chamadas em conjunto, aproveitando o poder das funções de ordem superior, o que significa que a primeira chamada de mapa definirá a variável lengthl
corretamente, mesmo que seja chamada após a declaração da função auxiliars
. -4 bytes.\n
linhas múltiplas abusadas para substituir por novas linhas reais, além de um pequeno truque usandoif
operadores ternários (quandojoin
chamados em uma matriz comnil
valores, eles se tornam cadeias vazias).join
aparentemente pode ser substituído por um*
.fonte
93 - 5 = 87
caracteres. Os 5 caracteres são os espaços entre o código e o separador. O código e o separador sempre terão pelo menos um caractere." Sua seção de código está muito além do limite, com 97 caracteres, portanto o programa tem um comportamento indefinido.LiveScript,
243236233228219225 bytesComo funciona: principalmente como o código Java. Comece com o tamanho do alias (o LiveScript permite criar uma função dos operadores usando parênteses).
.=
éa = a.b
- que usamos aqui para mapear.=> blabla ..
é a construção em cascata Smalltalk-ish: o lado esquerdo=>
é acessível como..
no resto do bloco; e será devolvido. Aqui, é o elemento dividido em k. Nota: estou usando interpolação de string, porque/
significa apenas "split" com uma string literal.O LS também nos permite usar
a-=/regexp/
neste lambda (também funciona com literais de string): é apenas açúcar para uma.replace
chamada.Finalmente, o
>?=
é o>?
operador combinator -assin, que retorna o maior de dois operandos.O LS tem estilo Python / Haskell para compreensão, sem nada sofisticado, exceto o "string * times" para repetir o espaço por tempo suficiente.
Isso para compreensão serve como o tópico (veja o bloco sobre cascatas acima).
Em seguida, fazemos um loop em cada elemento da matriz (aquele que acabamos de construir com a compreensão) e, se alguma linha for maior que 93chars, encontramos o último índice de, dividido lá e pressionamos a linha separada logo após a iteração atual ( ... Para que a próxima iteração seja dividida novamente se a linha for muito grande).
A última coisa que chama a atenção
a[j to]
é um intervalo (de j até o final), mas como ele usa os métodos Array, é necessário juntá-lo novamente a uma string, o que fazemos usando sobrecarregado*
:*''
.exemplo
resultado:
fonte
Java, 347 + 19 = 366 bytes
Requer
Assim, os +19 bytes.
Toma no formato
f.accept(List<String> code, String seperator)
. Formatos no local. Uma versão que cria e retorna um novoList<String>
seria trivial de implementar, mas custaria alguns bytes.Recuo + uso de exemplo:
... Eu provavelmente deveria executar isso sozinho: P
fonte
replace(" *"+s)
não está funcionando, masreplaceAll(" *"+s)
é que eu adoraria ouvi-lo - não consigo descobrir.replace
usa cadeias, masreplaceAll
usa expressões regulares. </badguess>PowerShell,
224217235 bytesAtualizado a lógica para determinar o tamanho máximo da sequência de códigos. Atualizado para permitir vários separadores que incluem meta caracteres regex.
Pouca explicação
Isso inclui uma string delimitada por uma nova linha inteira para entrada.
Exemplo de saída com algum Lorem Ipsum
fonte
MATLAB,
270265262 bytesO programa aceita a entrada
I
na forma de uma matriz de células, em que cada elemento da matriz de células é uma linha separada da entrada. Também aceita uma segunda entrada que indica qual é o caractere de comentário (ou seja#
). A função retorna uma seqüência de várias linhas que está formatada corretamente.Breve explicação
Exemplo de entrada
Saída de exemplo
fonte