Défi
Vous recevrez un tableau en entrée, dessiné avec ASCII |
et _
. Votre tâche est de placer les chaises autour.
Exemple
Contribution:
____
| |
| |
| |
| |
|____|
Sortie:
_^_^_
< >
| |
< >
| |
<_ _ _>
v v
Ces chaises sont faites de <>
et v^
.
Un autre exemple:
La ligne doit avoir autant de chaises que possible.
_____
| |_____
| |
| |
| |
| _____|
|_____|
_^_^_
< |_^_^_
| >
< |
| |
< _ _ _>
|_ _ _| v v
v v
Il doit y avoir des espaces entre chaque chaise. Et >_^_^_<
est invalide, il devrait être |_^_^_|
.
_____ _____
| |_____| |
| |
| |
| |
| ___________|
|_____|
_^_^_ _^_^_
< |_^_^_| >
| |
< >
| |
< _ _ _ _ _ _>
|_ _ _| v v v v v
v v
Aucune chaise ne peut être à l'intérieur d'un "beignet".
_________________
| _____ |
| | | |
| | | |
| |_____| |
|_________________|
_^_^_^_^_^_^_^_^_
< _____ >
| | | |
< | | >
| |_____| |
<_ _ _ _ _ _ _ _ _>
v v v v v v v v
^
et v
prioriser <
et >
. Aucune chaise seule (elle doit en avoir au moins une |
ou _
dans la rangée).
_________________
| _____ |
| | | |
| | |_____|
| |_____
|___________|
_^_^_^_^_^_^_^_^_
< _ _ _ >
| | v v | |
< > <_ _ _>
| |_^_^_ v v
<_ _ _ _ _ _|
v v v v v
C'est le code de golf, donc le code le plus court gagne.
Réponses:
Python 2,
10331007924879829787713699692691688687672670664659654648643642630625623620570560554545518514513510505492476454451443 partes6 octets économisés grâce à Riley
6 octets économisés grâce à Adnan
Depuis que cette question a plus d'un an et n'a toujours pas de réponse, je pensais essayer.
Essayez-le en ligne!
Le programme lit dans la table un fichier nommé
I
et l’imprime avec ses chaisesstd::out
. Je n'étais pas sûr de la plupart des cas critiques, j'ai donc pris mon meilleur jugement (celui qui demandait le moins d'effort), mais il semble que tous les tests soient satisfaisants. Certaines des sorties ne correspondent pas exactement mais elles ont toutes le même nombre de chaises.Explication
La première ligne définit assez simplement quelques définitions qui nous permettront d’économiser des octets à l’avenir:
(Je vais décompresser ces macros pour plus de lisibilité dans les lignes futures)
Ensuite, nous allons ouvrir un fichier nommé
I
parce que nous avons déjà une variable qui est courte pour cela, donc cela économise quelques octets.Nous nous sommes séparés le long des nouvelles lignes pour créer une liste de chaînes (les lignes de l'image)
Je trouve ensuite la longueur de la plus longue ligne afin de pouvoir remplir toutes les lignes avec cette longueur. (J'ajoute aussi 3 car nous avons besoin d'un peu de rembourrage supplémentaire)
Ensuite, nous effectuons le remplissage réel et créons une bordure de
I
caractères autour du bord. En effet, nous devrons faire la différence plus tard entre l'intérieur et l'extérieur de la forme. Nous allons également modifier le type de données d’une liste de chaînes en une liste de caractères (longueur de 1 chaîne).La ligne suivante est juste une autre définition d’économie d’octets.
(Je vais aussi déballer celui-ci)
Maintenant, nous voulons diffuser les
I
caractères partout en dehors de la forme. Nous pouvons le faire avec un automate pseudo-cellulaire. ChacunI
se propagera à tous lespersonnages adjacents . Nous pourrions faire une boucle jusqu'à ce que l'automate se stabilise, mais cela ne peut pas prendre plus d'itérations qu'il n'y a de caractères, donc nous passons en boucle à travers chaque caractère
b
(l'entrée d'origine)Pour chaque itération, nous voulons passer par-dessus chaque caractère de la liste 2D (à l'exception du remplissage le plus à l'extérieur)
Pour chaque position, nous lançons le code suivant:
Permet de décomposer cela.
Nous avons un si avec deux conditions séparées par un
&
(bit à bitand
)Le premier vérifie simplement s'il y a une
I
dans l'une des cellules adjacentes et le second vérifie simplement si la cellule en cours est a" "
. Si nous remplissons ces conditions, nous définissons la cellule actuelle comme unI
.Maintenant que nous avons déterminé l'extérieur et l'intérieur de la forme, nous pouvons commencer à placer les chaises autour de la table.
Encore une fois, nous parcourons toutes les cellules (et définissons quelques raccourcis)
Maintenant voici ma partie préférée. Si vous avez traversé mon golf ennuyeux, principalement basé sur la définition à ce jour, je vais vous récompenser avec une belle friandise de golf intelligent (si je le dis moi-même).
Un petit fond en python:
En Python, si vous essayez d’attribuer deux fois une clé de dictionnaire, elle l’indique. Par exemple
Nous abuserons de cette propriété pour attribuer la cellule actuelle à un caractère particulier.
La première condition est
Si la cellule est au milieu d'un bord de 3
_
caractères, nous réaffecterons la cellule actuelle et la cellule située en dessous. Nous l'attribuerons au résultat de l'indexation d'un dictionnaire surchargé parI
. Nous définissons d'abord notre valeur par défaut avec la paire,"I":"_"+a[x+1][y]
ce qui signifie que s'il n'y a pas de changement, nous attribuerons les deux cellules à leurs valeurs d'origine. Ensuite, nous ajoutons la pairea[x-1][y]:"^ "
. Cela ne fera rien (important) à moins que la cellule au-dessus de la cellule actuelle (a[x-1][y]
) ne soit remplie par unI
. S'il y en a unI
, il remplacera la valeur par défaut en nous demandant de placer une chaise dans la cellule en cours. Ensuite, nous passons à la cellule située en dessous de la cellule actuelle si cette cellule estI
remplacée par une nouvelle position afin de placer un fauteuil orienté vers le haut sous le point actuel.La condition suivante est un peu plus simple
Nous vérifions si la cellule en cours et la cellule au-dessus sont les deux
|
. Si c'est le cas, nous mettons en place un dictionnaire.La première paire du dictionnaire
"I":"|"
définit la valeur par défaut. Puisque nous allons accéder à la cléI
si elleI
n’est pas réaffectée, elle reviendra par défaut à|
(le personnage qu’elle est déjà) et ne fait rien.Nous ajoutons les deux clés
A[y+1]:">",A[y-1]:"<"
Si l'une ou l'autre des deux cellules situées à gauche et à droite le sont,I
la cellule actuelle sera réaffectée à une chaise pointant dans la direction de l'extérieur.Il ne reste plus qu’à sortir. Cependant, nous ne pouvons pas simplement imprimer, nous devons commencer par quelques tâches d’entretien. Nous devons reconvertir en chaîne et supprimer tous les
I
s que nous avons créés. Ceci est fait dans une ligne.la source
i,o="I "
au lieu dei="I";o=" "
travailler?n
costs.