Vous devez écrire un programme ou une fonction qui reçoit une chaîne représentant un polygone ascii-art en entrée et en sortie ot renvoie la zone du polygone.
L'entrée est une chaîne composée des caractères _ / \ L V space
et newline
définissant un polygone simple (ce qui signifie pas de segments supplémentaires, pas d'auto-toucher et pas d'auto-intersection).
L'aire d'une cellule à caractère unique est 2
_
divise la cellule en tailles0
et2
\
divise la cellule en tailles1
et1
/
divise la cellule en tailles1
et1
L
divise la cellule en tailles0
et2
V
divise la cellule en tailles1
et1
(les deux côtés de laV
seront toujours du même côté du polygone afin qu'ils soient traités ensemble dans la liste.)
Chaque personnage relie les deux coins de sa cellule de personnage que vous attendez (par exemple en haut à gauche et en haut à droite en cas de V
).
Un exemple avec une zone de 7 ( 1+2+1
dans la deuxième rangée et 1+1+1
dans la troisième):
_
/ \
V\/
Contribution
- L'entrée formera un rectangle, c'est-à-dire qu'il y aura le même nombre de caractères entre les retours à la ligne.
- Il peut y avoir des espaces supplémentaires sur n'importe quel côté du polygone.
- Le retour à la ligne est facultatif.
Sortie
- Un seul entier positif, l'aire du polygone.
Exemples
Les sorties se trouvent après la dernière ligne de leurs entrées.
_
V
1
/L
\/
3
/VV\
L /
L/
14
____/\
\ /
/\/ /
\____/
32
/V\
/ \__
\ /
/\/ /V
L____/
45
Il s'agit de code-golf, donc l'entrée la plus courte l'emporte.
^
intentionnellement?Réponses:
CJam,
48 4329 octetsMise à jour : beaucoup joué au golf en utilisant les mathématiques et l'astuce state * 2 de la réponse de orlp.
Comment cela fonctionne (obsolète, mise à jour bientôt)
Nous avons divisé l'entrée sur les nouvelles lignes et puis pour chaque partie , nous maintenons un compteur d'occurrences de caractères limites
L\/
. Ce compteur% 2 nous indiquera laquelle des deux partitions revient à choisir pour tous les caractères. Ensuite, nous trouvons l'index de chaque caractère dans la chaîneL _
.\/V
donnera-1
référence au dernier élément d'un tableau. Après avoir obtenu l'index, nous utilisons4558Zb2/
pour créer le tableau[[2 0] [0 2] [0 2] [1 1]]
, puis choisissons le bon nombre en utilisant le compteur.Essayez-le en ligne ici
la source
Pyth,
4746453630Explication:
Nous avons deux états, "dans le polygone" et "hors du polygone". Les caractères suivants effectuent chacun les opérations suivantes lors de leur lecture de haut en bas à bas à droite:
Notez que «ajouter un à la zone» et «si dans un polygone, ajouter deux à la zone» s'excluent mutuellement.
la source
x=
fonctionnement. Est-ce documenté quelque part?+=
ou*=
ou quoi que ce soit. Dans ce cas,x
est utilisé comme xor, c'est donc exactement la même chose que Python^=
.Rétine , 293 + 15 = 308
314385octetsChaque ligne va dans un fichier séparé, j'ai donc ajouté 13 au nombre d'octets. Alternativement, vous pouvez mettre tout cela dans un seul fichier et utiliser l'
-s
indicateur. Le<empty>
support pour les fichiers ou lignes réellement vides.Malheureusement, j'ai besoin de 187 octets juste pour convertir le résultat de unaire en décimal. Je suppose que je devrais vraiment l' implémenter très bientôt .
Explication
Retina est un langage basé sur l'expression régulière (que j'ai écrit exactement pour pouvoir faire des choses comme ça avec l'expression régulière). Chaque paire de fichiers / lignes définit une étape de remplacement, la première ligne étant le modèle et la deuxième ligne la chaîne de remplacement. Les modèles peuvent être précédés d'une
`
chaîne de configuration délimitée, qui peut contenir les modificateurs d'expression régulière habituels, ainsi que certaines options spécifiques à Retina. Pour le programme ci-dessus, les options pertinentes sont;
, ce qui supprime la sortie de cette étape et+
, qui applique le remplacement dans une boucle jusqu'à ce que le résultat cesse de changer.L'idée de la solution est de compter chaque ligne séparément, car nous pouvons toujours décider par les caractères déjà rencontrés si nous sommes à l'intérieur ou à l'extérieur du polygone. Cela signifie également que je peux joindre le tout en une seule ligne, car le début et la fin d'une ligne sont toujours en dehors du polygone. Nous pouvons également noter que
_
et l'espace sont complètement identiques pour un algorithme de balayage de ligne, ainsi que\
et/
. Donc , dans un premier temps je remplace tous les espaces et les sauts de ligne par_
et tout\
en/
simplifier un code plus tard.Je garde une trace de l'état intérieur / extérieur actuel avec les personnages
i
eto
, tout en utilisant lei
s pour cadrer la zone. Pour ce faire, je commence par ajouter uno
à la ligne jointe pour marquer que nous sommes en dehors du polygone. J'ajoute également uniio
à la toute fin de l'entrée, que j'utiliserai comme recherche pour générer de nouveaux caractères.Ensuite, le premier grand remplacement remplace simplement un
i
ouo
suivi par un/V_L
avec le jeu de caractères suivant, inondant et comptant ainsi le tout. La table de remplacement se présente comme suit, où les colonnes correspondent au dernier caractère de cette ligne et les lignes au caractère suivant (oùS
est pour l'espace et<>
pour une chaîne vide). J'ai inclus tous les caractères de l'entrée pour montrer les équivalences que j'ai déjà utilisées:Notez que le caractère final indique alors toujours si après le caractère nous sommes à l'intérieur ou à l'extérieur du polygone, tandis que le nombre de
i
s correspond à la zone qui doit être ajoutée au polygone. À titre d'exemple, voici les résultats des quatre premières itérations sur le dernier exemple d'entrée (cela a été généré par une ancienne version qui inondait réellement chaque ligne séparément, mais le principe est toujours le même):Enfin, je me débarrasse de tous les
o
s et des sauts de ligne en supprimant tout ce qui correspond[^i]
, et le reste est la conversion décimale-unaire qui est plutôt ennuyeuse.la source
Perl,
6558 octetsla source
$/=\1;$-^=2*y,/\\L,,,$a+=y,/\\V,,||$-for<>;print$a
GNU sed, 290 + 1
Le + 1 tient compte du
-r
passage passé à sed. Les commentaires et les espaces supplémentaires ne sont pas pris en compte dans la partition.Je n'ai pas regardé en détail, mais je pense que cela est probablement similaire à la réponse de Martin's Retina :
Vue d'ensemble
:
Remarques
sed
est orienté ligne et nécessite donc un certain travail pour traiter plusieurs lignes à la fois. LaN
commande fait cela en ajoutant une nouvelle ligne puis la ligne suivante à l'espace de motif actuel. Le problèmeN
est qu'une fois arrivé au flux d'entrée EOF, il se fermesed
complètement sans aucune option pour poursuivre le traitement. Pour contourner ce problème, nous comptons l'ensemble actuel de deux points à la fin de chaque ligne, juste avant de lire la ligne suivante.Sortie:
la source
C, 93
96 108octetsEdit: pris en compte les suggestions dans les commentaires, converti le while en une seule instruction for loop et supprimé complètement la variable "i".
Message d'origine:
Cela ressemblait à un problème amusant et assez simple pour enfin me faire créer un compte ici.
Le texte du polygone doit être transmis comme premier argument de ligne de commande; cela devrait fonctionner avec ou sans aucune quantité de nouvelles lignes / espaces.
Cela lit juste dans le polygone un caractère à la fois, s bascule actuellement dans ou en dehors du polygone sur '/', 'L' ou '\', et t augmente de 1 sur '/', 'V', et '\', ou par 2 si à l'intérieur / 0 si à l'extérieur sur 'L', '_', espace et nouvelle ligne.
C'est la première fois que je m'essaie à n'importe quelle sorte de "golf" (ou C, dans la mesure où il diffère du C ++), donc toutes les critiques sont appréciées!
la source
i=t=s=0;
je pense que C initialise tous lesint
s à 0 de toute façon. Vérifiez également si vous pouvez transformer lawhile
boucle enfor
boucle; qui économise souvent quelques octets....int i,t,s;for(i=t=s=0;c=v[1][i++];t+=s+(c>46^!(c%19)^s))s^=c>13^c%9>4;...
qui devrait économiser 4 octets; un {, un} et deux;int i,t,v;
mettre devant etmain
non à l'intérieur, nous pourrions nous débarrasser dei=t=s=0
7 autres octets.POSIX sed,
245244POSIX sed, aucune extension ou regexps étendue. L'entrée est limitée à la taille maximale de l'espace de maintien des mandats sed - POSIX au moins 8192; GNU gère plus. Cette version suppose qu'il n'y aura pas de lignes vides avant ou après la forme; 10 octets de code supplémentaires, indiqués dans l'extension, peuvent y répondre si c'est une exigence (la question d'origine ne le précise pas).
Développé et annoté
la source
C, 84 octets
Nous changeons de côté chaque fois que nous voyons
\
,/
ouL
; nous en ajoutons toujours un pour\\
,/
ouV
, mais ajoutons 2 (si à l'intérieur) ou 0 (si à l'extérieur) pour l'espace, la nouvelle ligneL
ou_
.Les variables
a
eti
sont supposées être nulles à l'entrée - elles doivent être réinitialisées si la fonction doit être appelée plus d'une fois.Ungolfed:
Programme de test:
la source