Votre objectif est d'écrire un encodeur de sémaphore de drapeau , qui convertira une phrase donnée en caractères de sémaphore de drapeau correspondants, selon le système de sémaphore décrit sur Wikipedia .
Supposons que l'entrée est une seule phrase fournie via stdin (ou équivalent). Votre sortie doit être une série de caractères sémaphores, chaque ligne représentant un mot de la phrase. Vous devez uniquement gérer l'alphabet (AZ) et devez ignorer tous les autres caractères non-espace, mais vous devez être capable de gérer à la fois les majuscules et les minuscules. Votre sortie est autorisée à contenir des espaces supplémentaires.
Les caractères du sémaphore doivent être affichés sous la forme d'un carré 3x3, avec un O
au milieu et les positions du drapeau représentées par les caractères | - / \
. Chaque caractère sémaphore doit être séparé des caractères adjacents par un espace et chaque ligne doit être séparée par une ligne vierge. Ne vous inquiétez pas de l'habillage des mots qui peuvent être trop longs pour votre affichage - faites comme si vos lignes avaient une longueur infinie.
Exemple d'entrée:
abcdefg hijklmn opqrstu vwxyz
Exemple de sortie:
\ | /
O -O O O O O- O
/| | | | | | |\
\ | | /
-O O O- O O O- O
/ / / / / / \
\ | / \| \ /
-O -O -O -O- -O O O
\
| / / \
O O- O O- O-
\ \ \
Exemple d'entrée:
This is Code Golf.
Exemple de sortie:
\| \
O -O O -O
/ / \
\
O -O
/ \
\ \ | /
O -O O O
| | |
\ /
O -O O O-
|\ / |
Puisqu'il s'agit de code-golf , la solution la plus courte l'emporte.
and each row must be separated by a blank line
=> chaque mot est destiné, n'est-ce pas?Réponses:
Perl,
282264251247245243241240236233229227220218216214 214 caractèresAvec quelques jolis sauts de ligne:
Il m'a fallu un certain temps pour que cela fonctionne (ma première tentative de réponse Perl). Il est basé sur une idée similaire à beaucoup d'autres réponses. Chaque drapeau peut être dans l'une des 8 positions, il y a deux drapeaux et les deux drapeaux ne peuvent jamais être dans la même position. Cela signifie que je peux encoder la position des deux drapeaux dans un octet - ce qui signifie également que je peux traduire directement d'un caractère à son encodage en utilisant la
y///
fonction Perl (opérateur?). Donc:-Donc:
J'ai échappé à un bon nombre de caractères qui se trouvent en dehors de la plage normale utilisée pour faciliter la copie et le collage du programme - mais je suis presque sûr que je pourrais écrire un programme pour remplacer les codes d'échappement par les caractères eux-mêmes me sauvant environ 30 caractères.
la source
Python,
244238233232Cela utilise une de mes astuces préférées: l'encodage à piste unique. J'ai étiqueté les bits de sémaphore (sbits)
pour obtenir le graphique suivant dont les sbits se produisent pour quelle lettre:
chaque lettre apparaît exactement deux fois dans la carte, car le signaleur a deux bras. Ensuite, je vois cela comme un graphique sur les lettres az, avec des bords entre les lettres partageant des sbits, avec les bords étiquetés en fonction du sbit partagé. Idéalement, je trouverais un chemin Hamilton à travers ce graphique, de sorte que les bords suivants n'ont pas la même étiquette. Aucun chemin de ce type n'existe ... vous remarquerez donc que la variable
e
contientb
deux fois la lettre .Avec mon chemin presque Hamilton
e
, je construis un tableaud
d'étiquettes sbit utilisées dans la traversée dee
. Ensuite, pour savoir où mettre ses bras, le signaleur n'a qu'à trouver la lettre souhaitée dans le tableau pratique suivantd'où ses bras vont dans la position directement en dessous, en dessous et à droite de la lettre.
la source
to_lower()
pourlower()
. En outre, il a donné une erreur lorsque j'ai essayé de lui donner une entrée non alphabétique.Scala, 272 caractères
Non golfé (enfin, moins golfé):
la source
Rubis, 287 caractères
L'entrée doit être donnée sur STDIN.
la source
Scala
494 sans retour à la ligne520 avec retour à la ligne:non golfé:
Explication:
J'ai observé un modèle d'horloge, mais pas avec 12 heures, mais 8. Et Starttime est 0 est, où 6 heures est, et a, b, c sont les premiers codes, avec le premier (un) drapeau sur le Sud.
Étant donné que les drapeaux 1 et 2 sont indiscernables, nous pouvons d'abord trier toutes les combinaisons avec le numéro le plus bas pour le premier drapeau. Malheureusement, l'ordre fin du début est perturbé, lorsque j ne suit pas i, mais k, l, m, et plus tard, c'est un gâchis.
Par conséquent, je réorganise mes clés pour le mappage:
Si nous soustrayons 'a' de chaque caractère, nous obtenons les nombres de (0 à 7 + 6 + 5 + ... + 1). Nous pouvons cartographier les nombres d'une grille de caractères
Une paire de deux nombres peut mapper deux drapeaux, où le premier nombre est l'index de 0 à 6 pour le premier drapeau, et le deuxième drapeau n'est pas un nombre de 1 à 7 pour le deuxième drapeau, mais pour la distance du premier au deuxième drapeau. (2,2) signifierait que le premier drapeau est à l'OUEST et le second est à deux pas dans le sens des aiguilles d'une montre de là, vers le NORD.
la source
object Main extends Application
bloc, mais cela ne semble pas être suffisant.readLine
dans la dernière ligne avec"readLine"
cela devrait fonctionner (le code est compatible 2.8).Haskell
331357339 caractèresGolfé:
Non golfé:
L'encodage est l'
[hour, minute]
endroit où les horloges ont 8 heures et 8 minutes. Les minutes avancent plus vite que les heures. Si une horloge coche où l'heure et la minute seraient égales, ajoutez également 1 à l'heure et 2 à la minute (voir le deuxième exemple de coche ci-dessus). C'est la seule façon d'augmenter les heures. Les heures n'augmentent PAS lorsque la minute atteint une minute arbitraire. Seulement quand les minutes seraient égales aux heures. Dans le code non golfé,clock
transforme les lettres en horloges qui représentent le sémaphore. La plupart des horloges sont construites sur la base du tic-tac des précédentes. Les autres sont codés en dur. Il n'y a rien de plus dans le code.la source
Perl,
356, 275 caractèresUn grand nombre de caractères a été enregistré en remplaçant «sinon» par «? :' construction.
la source
<>
place de$ARGV[0]
vous pouvez prendre l'entrée de stdin et utiliserlc
pour convertir tous les caractères en minuscules. Cela a l'avantage supplémentaire de vous faire économiser 4 caractères. Il ne gère pas non plus les caractères non alphabétiques, mais sans douteYou only need to deal with the alphabet (A-Z) and should ignore all other non-space characters
pas très clair sur ce qu'il faut en faire ...PowerShell ,
198192191188 octetsEssayez-le en ligne!
La sortie contient une ligne vide de queue.
Moins golfé:
la source
Fusain , 70 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Divisez l'entrée en minuscules sur les espaces et bouclez sur chaque mot.
Faites une boucle sur chaque personnage.
Divisez la chaîne compressée
fjmrwyz gnsvxz abcdefg ahiklmn bhopqrs ciotuy djkptv elquwx
sur les espaces et bouclez sur chaque groupe de lettres.Si le groupe contient la lettre actuelle, tracez une ligne dans la direction actuelle.
Tournez de 45 ° dans le sens des aiguilles d'une montre.
Sortez le centre
o
et passez à la position de la lettre suivante.Passez au début du mot suivant.
la source