Me deparei com esta pergunta no SO e pensei que seria um bom desafio para o golfe. Então aqui está:
Desafio:
Escreva um programa que leia uma sequência de cadeias de caracteres, uma por linha, e produza uma lista de todas as posições em que cada cadeia possui o mesmo caractere.
Entrada e saída:
A entrada consiste em uma ou mais linhas de caracteres ASCII sem espaço em branco imprimíveis, cada uma seguida por uma nova linha. Você pode supor que todas as linhas de entrada tenham o mesmo comprimento. A nova linha não deve ser considerada parte da entrada (ou seja, você não deve produzi-la como um caractere correspondente).
Exemplo de entrada (roubado descaradamente da pergunta SO):
abcdefg
avcddeg
acbdeeg
Depois de ler a entrada, seu programa deve imprimir as posições de cada coluna correspondente e os caracteres que eles contêm. (Seu programa pode, mas não precisa, parar de ler mais informações se puder determinar antecipadamente que não há colunas correspondentes.) Qualquer formato de saída razoável é permitido; em particular, você pode usar a indexação com base em 0 ou em 1 para as posições.
Exemplo de saída para a entrada acima (usando indexação baseada em 0):
0: a
3: d
6: g
Pontuação:
Isso é código de golfe, então a resposta mais curta vence. Em caso de empate, os caracteres fracionários do desempate podem ser concedidos por recursos adicionais:
- −½ caracteres para manipular corretamente linhas de entrada de comprimento desigual. (A saída não deve conter posições além do final da linha de entrada mais curta.)
- - chars para manipular corretamente a entrada que consiste em caracteres Unicode codificados UTF-8 arbitrários.
Para inspiração, você pode encontrar algumas soluções não destruídas na pergunta SO (veja acima).
Esclarecimentos:
Simplesmente concatenar as posições e os caracteres, como em
0a3d6g
, não conta como "resultado razoável". Você deve fornecer algum tipo de separador (como um espaço) entre cada elemento da saída, para que ele possa ser analisado sem ambiguidade.A entrada será fornecida no fluxo de entrada padrão (
stdin
), ou usando qualquer mecanismo de entrada de arquivo de texto mais natural para o seu idioma de escolha. (Se o idioma escolhido não tiver um mecanismo natural para a entrada de arquivos, faça o que parecer mais próximo em espírito.)A entrada termina quando não há mais dados a serem lidos (ou seja, quando ocorre uma condição de fim de arquivo). Se desejar, você pode exigir que a entrada seja finalizada por uma linha em branco (que você então não deve contar como parte da entrada, obviamente). Se você fizer isso, mencione-o na sua resposta para que outras pessoas possam fornecer a entrada correta para o teste.
Cada linha de entrada, incluindo a última, termina com um caractere de nova linha. Sua resposta não deve relatar esta nova linha como uma coluna correspondente. (Tudo bem se sua solução também puder manipular entradas onde a última linha não termina em uma nova linha, mas isso não é necessário.)