Votre défi est d'interpréter un schéma de circuit, avec des portes logiques.
Portes logiques (vous n'avez pas vraiment besoin de savoir ce qu'elles font / sont pour relever ce défi):
- et porte:
a
- ou portail:
o
- porte nand:
A
- ni porte:
O
- xor porte:
x
- Porte xnor:
X
- pas de porte:
~
Chaque porte mais la dernière prend deux entrées. Les entrées proviennent d'un .
dans les coins supérieur gauche et inférieur gauche du carré 3 x 3 centré sur la porte. Sinon, l'entrée est directement à sa gauche. La sortie se fait .
directement vers la droite.
Les fils sont représentés par -|\/.=
-
contacte deux fils, un à droite et un à gauche:c-c
|
contacte deux fils, l'un au-dessus et l'autre en dessous:c | c
/
et\
travailler comme suit:c c \ / c c
.
contacte chaque fil environnant:ccc c.c ccc
=
est spécial; il relie les fils adjacents à travers lui:-=-
relie les deux fils. Dans ce qui suit
\|/ -=- /|\
chaque fil opposé est connecté les uns aux autres, mais pas aux autres (c'est là qu'il diffère
.
).- Pour que le courant circule, deux fils doivent tous deux être connectés à l'autre, de sorte que le
|-
courant ne circule pas .
Exemple de câblage:
.-.
= \
.--. .---=---
-. = .--
.--. .-------
l'entrée est divisée en deux fils, puis divisée en trois. Dans cette division, le fil inférieur se déplace vers le milieu et la division vers le bas du fil supérieur apparaît en bas. Ensuite, le haut des trois fils est déplacé vers le milieu.
Exemple de câblage avec portes:
--.
o..~..
--. o.---
a.---.
--.
Format d'entrée:
- chaque fil d'entrée sera étiqueté avec un chiffre. À la fin (juste avant la nouvelle ligne), chaque sortie sera étiquetée avec
:
(et le fil y ira toujours à droite , c'est-:
-à- dire ou.:
ou=:
) - l'entrée sera toujours valide; il n'y aura pas de boucles ou de fils se réunissant sans porte. Notez qu'il peut y avoir des fils avec des extrémités libres.
=
ne sera utilisé qu'en cas de besoin.
Format de sortie:
- chaque entrée est référencée avec le numéro correspondant.
- une expression est sortie. Par exemple, si les fils calculent l'entrée 1 et l'entrée 2, la sortie est
1a2
. - quelles que soient les fonctions produites, elles doivent correspondre aux portes logiques au début.
- pour ne pas montrer, placez l'
~
avant au bon endroit. pour plusieurs fonctions, utilisez des parenthèses pour montrer l'ordre d'exécution. Les parenthèses peuvent également être utilisées lorsqu'il n'y a qu'une seule fonction. Par exemple,
1-.~.-. A.~.-: . 2-. / x. 3-.
a une sortie possible de
~((2x3)A(~1))
- les sorties multiples doivent être séparées par un retour à la ligne (ou équivalent)
Exemple d'entrée:
1--.---.
x. \
2--. x.-=---------.
. .~. X.--.
3---. . a.----. /
O.~.-. \ /
. =
4-. / / .-:
X. .----:
5-.
Une sortie correspondante possible:
(~1)a(~(3O(4X5))
((1x2)x3)X((~1)a(~(3O(4X5))))
Réponses:
Python
24881567806706697657653Ouais pour gzip + exec!
Limites et hypothèses
En l'état, seules 9 entrées au maximum sont prises en charge - plusieurs chiffres ne sont pas traités correctement. Comme la spécification indique que les entrées sont étiquetées avec un chiffre et non un chiffre , cela est autorisé.
Entrée et sortie
L'entrée est prise via l'entrée standard et la sortie via la sortie standard.
Essai
Exemple d'entrée et de sortie:
Testé ici: http://ideone.com/gP4CIq
L'algorithme
C'est fondamentalement un DFS plutôt naïf des sorties. Pour chaque sortie, il part du caractère un à sa gauche et trace le fil, se ramifiant (et s'ajoutant à l'expression) à chaque porte. Quand il atteint une entrée, il l'ajoute à l'expression et revient sur le dernier point qu'il a ramifié, car nous pouvons être sûrs que la ramification n'est pas possible sans porte. Et bien sûr, tous les cas invalides sont rejetés. Rien de vraiment spécial - et c'est donc probablement plus long qu'il aurait pu l'être.
Remarques
La taille pourrait probablement être assez réduite avec quelques restructurations, mais j'ai passé assez de temps là-dessus pour aujourd'hui. La version jouée manuellement était celle compressée.
La compression gzip rend le golf intéressant, car une certaine mise en cache (par exemple
d=(-1,0,1)
) prend en fait plus d'espace que de laisser l'algorithme de compression s'en occuper. Cependant, j'ai choisi de jouer au golf la version manuelle autant que possible plutôt que d'optimiser pour la compression.Joué manuellement au golf (
909895840803):Plein non golfé (2488):
la source
0
un chiffre? Que diriez-vous d'échanger des commandes pour que cela2
arrive avant1
, etc..isdigit()
, qui est effectivement équivalent à l'expression régulière[0-9]
pour autant que je sache. Est-ce correct selon vos spécifications? Que voulez-vous dire par échange de commande? De la façon dont il est implémenté, il se dirigera d'abord sur la branche ascendante de toute porte logique, mais il n'y a aucune garantie de classement des entrées.isdigit()
est consistent. L'ordre échangé signifie quelque chose comme2
comme la première entrée et1
comme la deuxième entrée (trié verticalement).Java:
15231512 caractèresIl donne cette sortie pour l'entrée échantillon:
Afin de serrer sa taille:
r
, sans aucune extension de fichier dans le nom.Je suis sûr qu'il devrait être possible de le réduire davantage, mais juste un peu.
L'interpréteur est implémenté sous la forme d'une sorte d'automate cellulaire. Il scanne l'intégralité des valeurs de réglage sur place, en les répétant autant de fois que nécessaire jusqu'à ce qu'aucun changement ne soit détecté.
Voici une version non golfée:
la source
try{}catch(Exception e){}
que deuxthrows Exception
. Il y a probablement d'autres choses, mais je ne sais pas comment jouer au golf à Java.