Considérez ces cinq créatures marines de l'art ASCII:
- Poisson standard:
><>
ou<><
- Poisson rapide:
>><>
ou<><<
- Poisson robuste:
><>>
ou<<><
- Poisson extensible:
><<<>
ou<>>><
- Crabe:
,<..>,
Ecrivez un programme qui accepte une chaîne arbitraire de caractères <>,.
. S'il existe un moyen d'interpréter la chaîne entière comme une série de créatures marines ne se chevauchant pas, la chaîne doit alors être réimprimée avec des espaces simples insérés entre les créatures. Si cette interprétation est impossible, rien ne doit être sorti (le programme se termine en silence).
Par exemple, la chaîne <><><>
peut être interprétée comme deux poissons standard dos à dos. La sortie correspondante serait <>< ><>
.
Autre exemple, la chaîne ><>><>>
contient des "instances" de ...
(les crochets sont uniquement ajoutés en tant qu'indicateurs)
- un couple de poissons standard:
[><>][><>]>
- un poisson rapide:
><[>><>]>
- un poisson robuste de deux manières:
[><>>]<>>
et><>[><>>]
cependant, seuls l'appariement d'un poisson standard et d'un poisson robuste [><>][><>>]
s'étend sur toute la longueur de la chaîne sans caractères de partage du poisson (sans chevauchement). Ainsi, la sortie correspondant à ><>><>>
est ><> ><>>
.
Si la chaîne peut être interprétée de plusieurs manières, vous pouvez en imprimer une quelconque. (Et seulement imprimer un . D'entre eux), par exemple, <><<<><
peut être interprété comme un poisson standard et un poisson solide: [<><][<<><]
, ou comme un poisson rapide et un poisson standard: [<><<][<><]
. Donc, <>< <<><
ou <><< <><
serait une sortie valide.
Les crabes sont juste pour s'amuser. Comme ils ne commencent ni ne finissent avec <
ou >
, ils sont beaucoup plus faciles à identifier (au moins visuellement). Par exemple, la chaîne
,<..>,><<<>,<..>,><>,<..>,<>>><,<..>,><>>,<..>,<<><,<..>,<><,<..>,>><>
produirait évidemment la sortie
,<..>, ><<<> ,<..>, ><> ,<..>, <>>>< ,<..>, ><>> ,<..>, <<>< ,<..>, <>< ,<..>, >><>
Voici quelques exemples de chaînes (une par ligne) qui ne produisent aucune sortie:
<><>
,<..>,<..>,
>>><>
><<<<>
,
><><>
,<><>,
<<<><><<<>>><>><>><><><<>>><>><>>><>>><>><>><<><
La dernière chaîne ici peut être analysée si vous supprimez le début <
:
<<>< ><<<> >><> ><> ><> <>< <>>>< >><> >><> >><> ><>> <<><
(Il peut y avoir d'autres sorties possibles.)
Détails
- La chaîne de saisie ne contiendra que les caractères
<>,.
. - La chaîne en entrée aura au moins un caractère.
- Prenez les entrées de n'importe quelle manière courante (ligne de commande, stdin) et exportez-les vers stdout.
- Le code le plus court en octets gagne. ( Compteur d'octets pratique. ) Tiebreaker est une publication antérieure.
la source
Réponses:
Pyth,
644850 octetsCas de test.
Version qui ne prend pas éternellement ( ) ici , en 52 octets.
O(9n/3)
C'est l'approche de la force brute, génère toutes les séquences et vérifie si une somme quelconque est entrée. Diagrammes de poisson compressés sous forme de caractères, dont les représentations binaires sont le
>
et<
. Le tout est encapsulé dans un bloc try-catch afin qu'aucune sortie ne se produise si aucun résultat n'est trouvé.C'est une solution.
O(9n)
Certains caractères sont supprimés ci-dessus, car les caractères de contrôle sont utilisés. Ils sont reproduits fidèlement sur le lien ci-dessus.
xxd sortie:
la source
><>><>>
prend 15 secondes sur ma machine.Machine de Turing non déterministe, 20 états, 52 transitions (peut-être 882 octets)
Comment convertissez-vous cela en octets? J'ai écrit les fichiers (absolument pas golfés) pour exécuter cette machine avec le simulateur d'une machine de Turing d'Alex Vinokur 1 .
wc -c
génère les éléments suivants (à l’exclusion du fichier de description et des fichiers d’entrée):Quoi qu'il en soit, je préparais mon bac en informatique, alors j’ai pensé que ce serait un bon exercice (je ne sais pas à quoi je pensais). Alors voici la définition:
(la fonction de transition)
Excusez la mauvaise image, mais je ne pouvais pas être dérangé pour redessiner cette chose sur un ordinateur. Si vous voulez réellement déchiffrer les règles de transition, je vous recommande de lire le fichier de règles que j'ai lié ci-dessus.
J'ai utilisé
X
s au lieu d'espaces, car les espaces sont difficiles à visualiser ici et le simulateur n'accepte pas les espaces dans l'alphabet.Le concept est assez simple - les q1 à q4 sont utilisés pour capturer les poissons orientés vers la droite, les q11 à q14 sont utilisés pour capturer les poissons orientés vers la gauche, q15 à q19 pour les crabes et les blob de q5 à q10 servent simplement à insérer un espace et à les déplacer. caractères suivants un à droite.
Si la chaîne est interprétable, elle accepte la chaîne et la bande contient la chaîne avec des espaces insérés. Sinon, il rejette la chaîne (je suppose que cela compte comme aucune sortie - vider la bande serait assez facile mais exigerait beaucoup de règles de transition et je ne pense pas que cela rendrait la fonction de transition plus jolie à regarder).
1 Note: C'est difficile à compiler. Je devais éditer le
src/tape.cpp
fichier et le remplacerLONG_MAX
par1<<30
puis aller dans ledemo
répertoire, éditer le Makefile pour le remplacerEXE_BASENAME
parturing.exe
et exécutermake
. Ensuite, allez dans le répertoire avec les fichiers que j'ai écrits et exécutez-les/path/to/turing/download/src/turing.exe meta
.la source
poisson (oui, ce poisson), 437 octets
Cela me semble être l’une de ces tâches de programmation où exactement une langue est correcte.
La version suivante reste la réponse la plus longue au défi,
mais comme cela a été fait principalement pour le jeu de mots (excusez-moi, j'espère), le meilleur golf est laissé au lecteur comme un exercice.
la source
printf 'H4sIADSjKlUCA4VPQW6DMBC89xUj5AOocSSOlV1/BHGgjgMrBUPN0kRRHl/jmEg99WBLszM7M7s4BqMw2hQotNHxNy+QkDYJZU7rTJqED/p4NIdCLdFmVOfVW6bJY04DeQGhVteBLg4cVqfYLQxBkD3jQ6HzJwTHa/BRRmf4ibEtBpRfriefXCxKZ4cJghtB7eNqIW2lnqMu9D9N3T7sGtOssDInJCk+982/MlmOHQ+I6rqKRv5UpRxCntN7XSk7eSYfK0f+eR3EmI23qilH3iFCrjIqdyNO8nzJvJH7alMu7jsnlHZafWw5VluD9r/0/c2vQ95+AYBxAwS2AQAA'|base64 --decode|gzip -d>a;fish a
> <>, 602 octets
Une solution dans Fish, probablement très golfable mais c’est mon premier> <> programme. Il tire son entrée de la pile d’entrée et s’exécute sur l’interprète en ligne> <>.
Comment ça fonctionne :
Une boucle lit toutes les entrées et les empile, les inverse et place un -1 qui marque que l'analyse est terminée (tous les caractères restent sur la pile jusqu'à ce que la chaîne soit considérée comme analysable).
L'analyse utilise le fait que tous les caractères sont différents de modulo 5 et que tous les modèles sont déterministes à l'exception de <> << et> <>>. Les caractères analysés sont placés au bas de la pile.
Lorsqu'un motif est terminé, si -1 est placé en haut, tous les caractères sont imprimés, sinon un espace est ajouté et le programme est mis en boucle.
Si <> << ou> <>> sont rencontrés, le registre est incrémenté (0 au début) et un 0 est placé sur la pile avant le dernier caractère (de sorte que <> <ou> <> reste après l'annulation). . Si une erreur apparaît par la suite lors de l'analyse, le registre est diminué, tous les caractères après le 0 sont remis en haut (à l'exception des espaces grâce au test% 8 = 0).
Si une erreur est détectée alors que le registre est à 0 ou à l'intérieur du crabe, le programme se termine immédiatement.
la source
Python 3, 156
La stratégie consiste à générer des listes de poissons et à comparer leur concaténation à la chaîne d'entrée.
Cela prend énormément de temps. Si vous voulez réellement voir une sortie, remplacez
for _ in s
parfor _ in [0]*3
, où 3 est la limite supérieure du nombre de poissons. Il fonctionne biens
cars
contient au plus un poisson par omble.Merci à Sp3000 pour les corrections de bugs et une sauvegarde de caractère sur entrée.
Vieux 165:
la source
a and b or c
donnait une valeur fausse alors queb
pourrait être Falsey. Je suis revenu àif/else
2 caractères, mais il y aurait peut-être un moyen de faire fonctionner le ternaire.*l,s=[],input()
Perl, 81 + 1 octets
Essayez ce code en ligne.
Ce code attend l'entrée dans la
$_
variable. exécutez ceci avec le-n
commutateur de Perl ( compté comme +1 octet ) pour l'appliquer à chaque ligne d'entrée, par exemple comme ceci:Ce code utilise le moteur de regexp de Perl (et plus particulièrement sa fonction d' exécution de code intégrée) pour effectuer une recherche de retour en arrière efficace. Les différents poissons trouvés sont rassemblés dans le
@a
tableau, qui est structuré et imprimé si la correspondance est réussie.Ce code utilise également du Perl
say
la fonction, et doit donc être exécuté avec le-E
ou-M5.010
commutateur (ouuse 5.010;
) pour permettre à ces caractéristiques modernes. Traditionnellement, de tels commutateurs utilisés uniquement pour activer une version particulière du langage ne sont pas inclus dans le nombre d'octets.Vous pouvez également utiliser une version de 87 octets ne nécessitant aucun commutateur de ligne de commande spécial. Il lit une ligne de stdin et affiche le résultat (le cas échéant) sur stdout, sans saut de ligne final:
Ps. Si l'impression d'un espace supplémentaire au début de la sortie était autorisée, je pourrais sauvegarder de manière triviale deux octets supplémentaires avec:
la source
><(>|<<)>
Python 3,
196186 octetsRécursion simple.
g
renvoie une liste de poissons analysés, ouNone
si la chaîne d'entrée est non analysable.la source
Python 2, 234 octets
J'ai d'abord essayé une solution d'expression rationnelle Python, mais il ne semble pas y avoir de moyen d'extraire les groupes après une correspondance sur plusieurs motifs. Ce qui suit est une recherche récursive qui semble bien fonctionner sur les cas tests.
Un exemple de test:
Et la version non-golfée:
la source
if
peut être sur une seule ligne (comme vous l'avez fait ailleurs). Aussi, au lieu deif p<len(t)
je pense que vous pouvez faireif t[p:]
pour économiser quelques octets.C # - 319 octets
Cette solution est d'une simplicité honteuse, presque rien en Golf. Il s’agit d’un programme complet, qui prend en entrée une ligne de STDIN et envoie le résultat à STDOUT.
Il essaie simplement de faire correspondre chaque poisson à la première position après un espace (ou au début de la chaîne), et en fait correspondre chaque type de poisson. Si le poisson convient, il appelle alors le solutionneur après avoir inséré un espace après le poisson, ou renvoie simplement son entrée (avec un \ n pour des raisons de sortie) si la chaîne non appariée est littéralement le poisson (c'est-à-dire que nous avons trouvé une solution) .
Je n'ai pas beaucoup essayé de donner à la chaîne de poisson le traitement habituel de kolmogorov, car elle n'était pas si longue et je ne peux pas trouver un moyen peu coûteux d'inverser une chaîne en C # (je ne pense pas que LINQ va payer), donc il peut y avoir une chance là-bas, mais je doute un peu.
la source
Haskell (Parsec) - 262
la source
Im un peu d'un noob python alors ignorer l'étrangeté: P
la source
m
au lieu demsg
,s
au lieu destart
, ...) et utiliser un seul espace par incrément. Et s'il vous plaît, ajoutez le nombre de caractères de votre programme (vous pouvez les compter ici ).Ruby, 177 octets
Pas le plus court mais le premier en rubis:
Il s'agit ici d'étendre de manière récursive une expression rationnelle et de la faire correspondre à l'entrée.
Si une correspondance plus longue est trouvée, r () recurse, sinon, il vérifiera si la dernière correspondance utilise toute la chaîne en entrée et ne la restituera qu'avec des espaces ajoutés.
la source
CJam,
111 9691 (ou 62 octets)Une approche itérative gourmande pour continuer à déterminer toutes les combinaisons de poissons possibles en itérant. Vraiment pas joué au golf en ce moment.
Le code contient des caractères non imprimables, utilisez donc le lien ci-dessous pour référence.
Mise à jour de la chaîne encodée
Ajoutera une explication une fois le golf terminé
Essayez-le en ligne ici
62 octets
Version super lente. Cela crée essentiellement toutes les combinaisons et vérifications qui sont égales à l'entrée.
Cela contient également des caractères non imprimables, alors utilisez le lien ci-dessous.
Essayez-le en ligne ici
la source
Haskell,
148146 octetsEssai:
$ echo "> <>> <>>" | runhaskell fishes.hs
Explication
Basé sur ma réponse précédente à une question similaire. L'algorithme s'exécute dans le temps exponentiel.
Cela se lit de droite à gauche.
Cela n'imprimera pas une chaîne qui se termine par un espace, même si de telles chaînes sont également générées, car sa contrepartie sans espace est générée en premier.
la source
JavaScript (ES6), 164
Récursif, première analyse en profondeur.
En tant que programme avec E / S via popup:
En tant que fonction testable:
Suite de tests (exécutée dans la console Firefox / FireBug)
Sortie
Ungolfed juste la fonction k
la source
Haskell,
148142cela utilise les compréhensions de liste pour parcourir le poisson, choisir ceux qui correspondent au début et continuer de manière récursive.
la source
Javascript (
122135 octets)Pas le plus golfé ici, pourrait être dépouillé un peu.
Celui-ci est basé sur les regex, et un peu difficile à comprendre ce qui se passe.
Celui-ci est un one-line.
En gros, je vérifie la syntaxe, puis je scissionne la chaîne en fonction des caractères et je la joint.
Il lève une exception lorsque vous lui donnez une entrée invalide.
S'il ne peut pas lancer d'exceptions (
126139 octets):Les deux sont one-liners.
Les deux fonctionnent de la même manière.
Merci @ edc65 pour avoir détecté le cas de bord qui ne fonctionnait pas bien.
Vous pouvez le tester ici (la sortie sera écrite dans le document).
Il est basé sur la version qui lève des exceptions lorsque vous introduisez un code non valide.
Afficher l'extrait de code
(Actuellement, il y a un bug sur les extraits de pile,
J'ai posté dans metaC'était déjà demandé hier. Pour que cela fonctionne, j'ai remplacé$
par\x24
, qui a la même sortie. Vous pouvez lire sur le bogue ici: http://meta.codegolf.stackexchange.com/questions/5043/stack-snippets-messing-with-js )la source
><>><>>
. Je pense que cela ne peut pas être résolu aussi facilement avec Regexp, vous avez besoin d'un peu de look, de backtrak ou de quoi que ce soit ...Scala, 299 octets
Cas de test
Sortie
la source
Java, 288 octets
Formaté:
la source
Je ne cherchais pas la taille, mais voici une façon facile de comprendre cela dans Dart.
la source
Python 3,
166164 octetsSolution récursive En retard à la fête, mais je pensais le poster de toute façon car il bat Sp3000 par
2022 octets sans avoir à forcer la réponse brutalement.la source