Ceci est le deuxième d'une série, le troisième est Deux routes divergeaient dans un bois jaune (partie 3)
Ceci est basé sur deux routes divergentes dans un bois jaune (partie 1) , un défi précédent pour moi. Il a été assez bien reçu, mais c'était aussi assez banal (une réponse Java en 52 octets!) J'ai donc rendu quelque chose de plus complexe ...
L'inspiration
Ce défi est inspiré du célèbre poème de Robert Frost, "The Road Not Taken":
Deux routes divergeaient dans un bois jaune,
Et désolé, je ne pouvais pas voyager les deux
Et être un voyageur, longtemps je me tenais
Et baissais les yeux autant que je pouvais
Vers où il se penchait dans les sous-bois;... 2 paragraphes coupés ...
Je vais le dire avec un soupir
Quelque part, des âges et des siècles à venir:
Deux routes ont divergé dans un bois, et je -
j'ai pris celle moins fréquentée,
Et cela a fait toute la différence.
Remarquez l'avant-dernière ligne I took the one less traveled by,
,. Votre objectif est de trouver la route la moins fréquentée dans votre entrée de chaîne. Vous devez émettre l'une des 2 valeurs distinctes l'une de l'autre indiquant le sens dans lequel vous devez tourner pour emprunter la route moins fréquentée. Une fois que la route bifurque (la trace des hexagones se transforme en nombre) vous êtes à l'intersection. De là, il y aura 2 chemins composés de chiffres. Le chemin dont les chiffres ont la somme la plus faible sera la route non empruntée. Notez que la route non empruntée peut avoir un chemin plus grand mais une somme de chemin inférieure. Voici quelques exemples / cas de test d'un programme qui imprime "gauche" ou "droite" pour le chemin non emprunté:
1 2
1 2
1 2
#
#
#
left (3 < 6)
1 2
2 2
1 1
#
#
#
left (4 < 5)
12 2
11 2
1 1
#
#
#
right (6 > 5)
99 989
99 89
99 99
99 99
#
#
#
#
left (72 < 79)
1111 1110
001 111
11 11
11 11
#
##
##
##
left (9 < 10) (Note: 1111 is interpreted as 1+1+1+1=4, not 1111=1111)
1 1
0 1
1 1
1 1
1 1
1 1
1 1
#
#
#
#
#
left (6 < 7)
1 1
0 1
1 1
1 1
1 1
1 1
1 1
#
#
#
#
#
left (6 < 7)
Choses à assumer et à retenir
- Il y aura toujours 2 chemins. Ni plus ni moins.
- Vous pouvez prendre l'entrée de STDIN une ligne à la fois, une chaîne contenant des caractères LF ou une chaîne contenant une barre oblique inverse littérale et un n. Si vous avez besoin de commentaires d'une autre manière, demandez l'approbation dans les commentaires.
- Vous n'avez pas à vous soucier des entrées non valides ou des chemins liés. Ceux-ci ne seront jamais entrés dans votre programme / fonction.
- L'entrée peut être de n'importe quelle longueur en largeur ou en hauteur, inférieure à la limite de chaîne de votre langue.
- Il n'y aura jamais un
#
et un nombre sur la même ligne. - Tous les chiffres du chemin sont des entiers positifs de 0 à 9.
- L'entrée ou la sortie avec une nouvelle ligne de fin est autorisée.
- Voir ma réponse JS ES6 ci-dessous pour un exemple.
- Il y aura toujours au moins 1 espace entre les 2 chemins.
- Les 2 chemins auront toujours la même hauteur pour chaque carte, mais peuvent être différents sur d'autres cartes.
- Si vous êtes confus au sujet d'un cas de test spécifique, veuillez me le dire.
- 1111 est interprété comme 1 + 1 + 1 + 1 = 4, pas 1111 = 1111. La carte est une série de nombres à un chiffre, pas des nombres de longueur arbitraire.
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte!
- Failles standard interdites
Si vous avez des questions sur ce défi, posez-les moi dans les commentaires, et bonne chance!
la source
$("div > h1").map(function(){return $(this).text()}).get().join("\n");
dans votre console!let answers = $('div > h1').map(function(){return $(this).clone().children(':not(a)').remove().end().text().replace(/\s+/g,' ').trim()}).get();answers.splice(0, 1);answers.join('\n');
Réponses:
05AB1E ,
2115 octetsSorties 0 pour gauche et 1 pour droite.
Essayez-le en ligne!
Explication
la source
Rétine , 28 octets
Essayez-le en ligne!
Imprime
0
pour gauche et1
pour droite. Suppose qu'il n'y a aucun espace de fin sur aucune ligne.Explication
Convertissez chaque chiffre
N
en une série de chiffresN
.Une ligne (
%
), faites correspondre les lignes consécutives (\G
) de la fin (r
) et remplacez chacune d'elles-
(c'est-à-dire, tournez la branche droite en-
s).Triez tous les caractères, de sorte que tous les
-
s soient directement devant tous les1
s.Annuler à plusieurs reprises une paire de
-
et1
.Essayez de faire correspondre au moins un
1
(si c'est le cas, il y avait plus de poids dans le chemin de gauche).la source
Python 2 ,
95898887 octetsVoici mon premier essai en python. Certainement pas optimal mais un début décent.
Essayez-le en ligne!
la source
"#"!=y
par"#"<y
Puce , 216 octets
Essayez-le en ligne!
Un peu plus gros que la réponse de la partie 1 ...
Présentation
Chip est un langage 2D inspiré des circuits réels, et il traite les bits composants de chaque octet dans un flux d'octets.
Cette solution conserve une somme cumulée des chiffres qu'elle voit, inversant le signe de l'entrée chaque fois qu'elle rencontre une étendue d'espace, puis se terminant par le premier
#
. Donc, pour l'entréeNous obtenons
1 + 1 - 1 - 2 + 2 - 2 + 1 - 1 = -1
. Le signe du résultat est donné en sortie, un nombre négatif produit le résultat1
et le positif est0
.Par conséquent, la sortie de
1
signifie que le chemin de gauche est moins emprunté et0
signifie à droite.Explication
À un niveau élevé, voici comment cela fonctionne:
La diagonale principale avec le
@
éléments est l'accumulateur, la sortie est décidée para
le bas. (Huit paires de@
moyens huit bits, mais le bit le plus élevé est le signe, donc cette solution peut gérer une différence maximale de +127 ou -128. Déborder à mi-chemin est correct, tant que nous revenons avant de terminer.)Les quatre lignes qui commencent comme
Ax]}#--
... lisent l'entrée et, dans le cas d'un chiffre, la nient (si nécessaire) et transmettent la valeur aux additionneurs.Les trois premières lignes décident si nous regardons un chiffre ou une séquence d'espaces blancs, et gardons une trace si les chiffres doivent être annulés.
Les éléments restants coincés sous les entrées et les éléments à l'extrême droite gèrent la condition de terminaison et mappent la sortie en ASCII (afin que nous obtenions des caractères
'0'
ou'1'
au lieu des valeurs0x0
ou0x1
. Ce mappage ASCII ne nécessite aucun octet supplémentaire, sinon je ne le ferais pas l'ont inclus.)la source
JavaScript (ES6), 55 octets
Suppose qu'il n'y a pas d'espaces de fin sur chaque ligne et renvoie
true
pourright
,false
pourleft
. L'astuce consiste à faire correspondre chaque chiffre de l'entrée, et s'il y a un espace après lui sur la même ligne, à le soustraire du total; sinon, ajoutez-le au total. Si le total final est inférieur à 0, la bonne route est celle la moins fréquentée et vice versa.Essaye le:
la source
x=
au début, car les expressions ne sont pas autorisées, uniquement les fonctions stockées sous forme de variable et les programmes entiers.Python 3 ,
8594 octetsEssayez-le en ligne!
Malédictions! Je n'ai pas lu le problème suffisamment près. Ajout d'un correctif (
''.join()
), mais au prix de 9 octets.la source
Python 2, 78 octets
-1 octet grâce à @math_junkie
Essayez-le en ligne
Imprime
False
pour le chemin de gauche etTrue
pour la droitela source
r=-r
au lieu der*=-1
devrait enregistrer un octetRétine , 180 octets
Le nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne!
Je pensais que j'essaierais également une solution uniquement regex (ce qui précède est une regex .NET simple qui ne correspond qu'aux entrées où le bon chemin doit être pris, sauf pour l'utiliser
¶
comme raccourci pour\n
).C'est énormément répétitif, mais c'est ce qui se produit lorsque vous devez traiter chaque chiffre possible individuellement.
La solution est une application assez simple des groupes d'équilibrage : d'abord, nous additionnons les chiffres dans la branche gauche en poussant les
N
captures sur la pile3
pour chaque chiffreN
. Ensuite, nous essayons d'atteindre le#
, tout en surgissant des3
N
temps de pile pour chaque chiffreN
dans la branche de droite. Cela n'est possible que si la somme des chiffres de la branche gauche est supérieure à celle de la branche droite (car vous ne pouvez pas sauter d'une pile vide).la source
[0-9]
pour faire correspondre tous les chiffres ou\d
?JavaScript (ES6),
106104 bytess
est une fonction qui revienttrue
si la route non empruntée est à gauche. Non golfé:la source
PowerShell , 80 octets
Essayez-le en ligne!
(Juste grincer sous les réponses Python.: D)
Sorties
True
pour le chemin de gauche etFalse
pour le chemin de droite.Prend l'entrée comme une chaîne délimitée par
`n
, qui est l'équivalent PowerShell de "une chaîne contenant une barre oblique inverse littérale et un n" , ou comme une chaîne multiligne littérale. Nous avons ensuite-split
cette entrée sur\s
(les espaces, y compris les retours à la ligne) ou#
et-ne''
nous avons filtré tous les résultats vides , il ne nous reste donc qu'un tableau de chiffres. Ceux-ci sont introduits dans une boucle|%{...}
.À chaque itération, nous prenons d'abord l'élément actuel
$_
, le convertissons en unchar
tableau,-join
avec un signe plus+
, et le dirigeons versiex
(abréviation deInvoke-Expression
et similaire àeval
). C'est stocké dans$i
donc nous résumons correctement les chiffres sur ce morceau particulier du chemin. Nous utilisons ensuite cela et son négatif comme les deux éléments d'un tableau($i, -$i)
, indexés en inversant une valeur booléenne d'avant en arrière. Signification, la première itération à travers cette boucle, le premier morceau de chemin gauche, nous allons indexer dans-$i
; la prochaine fois, nous prendrons$i
; etc. Ceux-ci sont accumulés$a
avec+=
.Enfin, nous évaluons si
$a
est-g
reatert
han0
. Si c'est le cas, alors le chemin de droite avait une somme plus grande, sinon le chemin de gauche avait une somme plus grande. Ce résultat booléen est laissé sur le pipeline et la sortie est implicite.la source
CJam ,
1918 octetsEssayez-le en ligne!
Imprime
0
pour gauche et1
pour droite.Explication
la source
Mathematica,
8077 octetsMerci à Martin Ender pour avoir économisé 3 octets!
Fonction pure prenant une chaîne délimitée par des sauts de ligne en entrée, et revenant
True
pour prendre le chemin de gauche,False
pour prendre le chemin de droite. Merde ces longs noms de commandes Mathematica; c'est comme 10 jetons.la source
Pip ,
1918 octetsPrend l'entrée comme une seule chaîne sur la ligne de commande (qui nécessitera des guillemets et un échappement des sauts de ligne s'il est exécuté sur une ligne de commande réelle). Sorties
-1
pour gauche,1
pour droite.Essayez-le en ligne!Explication
Boucles sur des séries de chiffres, ajoutant les sommes des chiffres à un décompte. Le signe du décompte est inversé à chaque fois, avec pour résultat final que les valeurs de gauche sont négatives et les valeurs de droite sont positives. Ensuite, nous imprimons le signe du décompte final (
-1
ou1
).la source
Haskell , 64 octets
Essayez-le en ligne! Utilisation: La fonction anonyme
(>0).f.words
prend une chaîne séparée par des sauts de ligne comme argument et renvoieFalse
pour gauche etTrue
pour droite.Explication:
Étant donné une entrée
qui est la chaîne
" 99 989\n 99 89\n 99 99\n #\n #\n #"
, puiswords
supprime tous les sauts de ligne et les espaces et renvoie une liste des chaînes restantes:["99","989","99","89","99","99","#","#","#"]
. La fonctionf
prend les deux premiers élémentsa
etb
de cette liste et vérifie sia
est une chaîne de chiffres en la comparant à la chaîne « # ». (Parce que le charbon'#'
est plus petit que tous les caractères de chiffres'0'
,'1'
... chaque chaîne commençant par un chiffre sera plus grand que lexicographique"#"
.) La fonctiong
mappe chaque caractère dans une chaîne à son code de caractères ascii et renvoie leur somme. Dansf
nous appliquonsg
àa
etb
calculonsg a - g b
, c'est la valeur du chemin de gauche moins la valeur de celui de droite, et l'ajoutons à un appel récursif àf
pour gérer les lignes suivantes. Si le chemin de gauche est plus parcouru, le résultat def
sera négatif et sinon positif pour le chemin de droite,(>0)
vérifie donc si le résultat est supérieur à zéro.la source
Python 3 , 84 octets
Étant donné que toutes les soumissions Python actuelles sont des fonctions, j'ai pensé contribuer à un programme complet.
Imprime
True
si le chemin de gauche est moins parcouru,False
sinon. Essayez-le en ligne!Pour chaque ligne d'entrée, cela se divise sur les espaces, additionne les chiffres de chaque élément résultant et l'ajoute à un décompte tout en inversant le signe du décompte à chaque étape. Il continue de lire les lignes d'entrée jusqu'à ce qu'il en frappe une avec un
#
, auquel casmap(int,n)
une exception est levée et nous sortons de la boucle, imprimantTrue
si le décompte est positif etFalse
sinon.la source
Lot, 169 octets
Imprime
0
pour gauche,-1
pour droite. Remarque: lit les lignes jusqu'à ce qu'il en trouve une avec un#
, puis arrête la lecture. La différence dans les sommes de chemin est limitée à 511 (ajoutez 1 octet pour prendre en charge les différences plus importantes). Pas plus de 9 chiffres dans chaque ligne de chaque chemin (prend en charge n'importe quel nombre de lignes). Explication: Led
sous-programme prend deux paramètres: ajouter ou soustraire et le ou les chiffres. Il extrait le dernier chiffre par modulo par 10 et les chiffres restants en divisant par 10 et s'appelle récursivement tant qu'il reste des chiffres. Lec
sous-programme prend trois paramètres: ajouter ou soustraire, les chiffres à ajouter ou soustraire et les autres chiffres à ajouter. Il appelled
sous-routine pour gérer les chiffres à ajouter, puis passe à travers pour gérer les deux premiers paramètres. Cela signifie que l'appel desc
sous routine avec les paramètres de-
et les chiffres de gauche et de droite ajouteront les chiffres de droite et soustraireont les chiffres de gauche. Enfin, le résultat est décalé pour extraire le signe.la source
Octave, 46 octets
Essayez-le en ligne! Une fonction qui prend un tableau de caractères 2D
a
en entrée.Explication:
la source
Java 7,
219216 octetsBit supérieur à 52 octets cette fois. ;)
Et revient encore
false
pour droite ettrue
pour gauche.Explication:
Code de test:
Essayez-le ici.
Sortie:
la source