Ce défi est inspiré par les mathématiques est un fait. La programmation ne l'est pas .
La notation mathématique d'un factoriel ou d'un fait est un point d'exclamation !
. Le point d'exclamation est également un symbole commun not
dans de nombreux langages de programmation.
Défi:
Prenez une chaîne, contenant des chiffres et les caractères: + !
comme entrée et sortie les éléments suivants:
Tout ce qui se trouve devant un point d'exclamation devrait être évalué comme une expression mathématique, ce 2+2
serait le cas 4
.
Tout ce qui se trouve après un seul point d'exclamation doit être ajouté en tant qu'accessoire à tout ce qui se trouve devant, donc: 2+2!5
devrait donner 45
, car 2+2=4
, et 5
est un accessoire. 2+2!5+5
devrait donner 410
.
Puisque !
signifie également not
, tout ce qui n'est pas un accessoire après coup ne doit pas être ajouté. Donc, 2+2!!5
devrait donner 4
, car 5
n'est pas un accessoire. Maintenant, not(not(true))==true
il 2+2!!!5
faut donc donner 45
. 2+2!!5!5+5
devrait donner:, 410
car 2+2=4
, puis suivi d'un factoriel et !5!5+5
. Le premier 5
n'est pas un fait, mais 5+5
est après un autre point d'exclamation, et est donc un fait, encore une fois.
Clarifications:
- Les points d'exclamation ne seront pas adjacents à un
+
de chaque côté. - Il n'y aura pas de leader
+
pour les chiffres (c'est5
, non+5
). - Vous pouvez éventuellement inclure un zéro de tête si c'est le résultat de l'expression devant le premier
!
. Les deux4
et04
sont acceptés en sortie pour entrée:0+0!4
Résumé analytique: évaluer chaque somme (traiter !
comme des séparateurs). Ensuite, jetez tous les nombres qui apparaissent après un nombre pair de !
(à compter du début de la chaîne). Retirez ensuite tout !
.
Cas de test:
!
<- Empty string
5
5
12!
12
!87
87
!!5
<- Empty string
5+5!2+2
104
5+5!!2+2
10
1!2!3!4!5!6!7!8!9
12468
10+10!!2+2!!3+3!4+4
208
2!!3!5
25
2!!3!5!7
25
10!!!!!!!5
105
C'est du code-golf donc le code le plus court en octets (dans chaque langue) gagne! Les explications sont fortement encouragées!
25
(voir cas de test ajouté). Plus important2!!3!5!7
encore, donnerait25
, car il y a un nombre pair de!
gauche du7
(donc vous ne comptez pas seulement la course juste devant le nombre, mais toute la!
gauche).Row
?Réponses:
Rétine ,
353129 octetsEnregistré 4 octets en s'inspirant des productions ETH .
Merci à Leo d'avoir enregistré encore 2 octets.
Essayez-le en ligne!
la source
JavaScript (ES6),
5856 octetsEnregistré deux octets grâce à Martin Ender .
Pourrait être amélioré en quelque sorte ...
la source
replace
.1+1!5
. Je pense que vous avez oubliéeval
un peu avant le!
.Gelée , 16 octets
Essayez-le en ligne!
Explication
L'observation clé ici est que nous pouvons exécuter les étapes "dans le désordre"; au lieu d'évaluer les sommes puis d'ignorer celles que nous n'aimons pas, nous pouvons ignorer les sommes dans des positions invalides, puis évaluer le reste.
L' évaluation d' une somme comme
"10+10"
évaluera à un certain nombre, par exemple20
, puis de-évaluer à une chaîne,"20"
. La répétition de ce processus n'a aucun effet supplémentaire (c'est idempotent). Ainsi, nous évaluons efficacement chaque élément de la chaîne, à l' exception de la chaîne nulle, qui reste non évaluée car elle a une longueur nulle.la source
µ
quelque part (etµ
ne fonctionne pas dans une boucle, ce qui signifie que vous auriez besoin de quelque chose encore plus verbeux). J'ai réussi à le faire fonctionner,ṣ”!µḢW;m2$ȧVṾ$$€
mais il n'est pas plus court (et a la pile caractéristique de signes dollar qui a tendance à se produire lorsque vous poussez Jelly au bord de sa capacité à imbriquer des structures de contrôle.)Gelée , 18 octets
Essayez-le en ligne!
Comment?
la source
0+0
au milieu de l'entrée (dans un endroit où il n'est pas rejeté); il produit la chaîne nulle, même s'il doit produire un chiffre 0.CJam , 20 octets
Essayez-le en ligne! (Suite de test séparée par saut de ligne.)
la source
Rubis ,
5856 + 1 =5957 octetsUtilise le
-p
drapeau. -2 octets de Tutleman .Essayez-le en ligne! (Une ligne de code supplémentaire a été ajoutée pour prendre toutes les lignes d'entrée et imprimer la sortie sur différentes lignes.)
la source
eval$1
, non?Lot,
192184 octetsLe fait de devoir manipuler les chaînes vides n'est pas pratique.
la source
Pip , 18 octets
Je pense que c'est le plus court possible ... même si je l'ai dit il y a environ trois itérations aussi.
Prend l'entrée comme argument de ligne de commande. Essayez-le en ligne!
Explication
la source
R, 95 octets
Il y a probablement une marge d'amélioration mais pour le moment c'est le mieux que je puisse trouver.
la source