Je suis tombé sur cette question sur SO et j'ai pensé que cela ferait un beau défi de golf. Voici donc:
Défi:
Écrivez un programme qui lit une séquence de chaînes de caractères, une par ligne, et génère une liste de toutes les positions où chaque chaîne a le même caractère.
Entrée et sortie:
L'entrée consiste en une ou plusieurs lignes de caractères ASCII non blancs imprimables, chacune suivie d'une nouvelle ligne. Vous pouvez supposer que toutes les lignes d'entrée ont la même longueur. La nouvelle ligne ne doit pas être considérée comme faisant partie de l'entrée (c'est-à-dire que vous ne devez pas la sortir en tant que caractère correspondant).
Exemple d'entrée (sans vergogne volé à la question SO):
abcdefg
avcddeg
acbdeeg
Après avoir lu l'entrée, votre programme doit imprimer les positions de chaque colonne correspondante et les caractères qu'elles contiennent. (Votre programme peut, mais pas nécessairement, arrêter de lire d'autres entrées s'il peut déterminer tôt qu'il n'y a pas de colonnes correspondantes.) Tout format de sortie raisonnable est autorisé; en particulier, vous pouvez utiliser une indexation basée sur 0 ou 1 pour les positions.
Exemple de sortie pour l'entrée ci-dessus (en utilisant l'indexation basée sur 0):
0: a
3: d
6: g
Notation:
C'est le golf de code, donc la réponse la plus courte l'emporte. En cas d'égalité, des caractères de bris d'égalité fractionnaires peuvent être attribués pour des fonctionnalités supplémentaires:
- −½ caractères pour gérer correctement les lignes d'entrée de longueur inégale. (La sortie ne doit pas contenir de positions après la fin de la ligne d'entrée la plus courte.)
- −¼ caractères pour gérer correctement l'entrée composée de caractères Unicode codés UTF-8 arbitraires.
Pour vous inspirer, vous pouvez trouver des solutions non golfées à la question SO (voir ci-dessus).
Clarifications:
La simple concaténation des positions et des caractères, comme dans
0a3d6g, ne compte pas comme "sortie raisonnable". Vous devez fournir une sorte de séparateur (tel qu'un espace) entre chaque élément de la sortie afin qu'il puisse être analysé sans ambiguïté.L'entrée sera fournie sur le flux d'entrée standard (
stdin), ou en utilisant le mécanisme d'entrée de fichier texte le plus naturel pour la langue de votre choix. (Si la langue que vous avez choisie n'a pas de mécanisme naturel pour la saisie de fichiers, faites ce qui vous semble le plus proche dans l'esprit.)L'entrée se termine lorsqu'il n'y a plus de données à lire (c'est-à-dire lorsqu'une condition de fin de fichier se produit). Si vous le souhaitez, vous pouvez exiger que l'entrée soit terminée par une ligne vierge (que vous ne devez alors pas compter comme partie de l'entrée, évidemment). Si vous le faites, veuillez le mentionner dans votre réponse afin que d'autres puissent fournir une entrée correcte pour les tests.
Chaque ligne d'entrée, y compris la dernière, se termine par un caractère de nouvelle ligne. Votre réponse ne doit pas signaler cette nouvelle ligne comme colonne correspondante. (Ce n'est pas grave si votre solution peut également gérer des entrées où la dernière ligne ne se termine pas par une nouvelle ligne, mais ce n'est pas obligatoire.)