Un nombre de Friedman est un entier positif qui est égal à une expression non triviale qui utilise ses propres chiffres en combinaison avec les opérations +, -, *, /, ^, les parenthèses et la concaténation.
Un nombre de Nice Friedman est un entier positif qui est égal à une expression non triviale qui utilise ses propres chiffres en combinaison avec les mêmes opérations, avec les chiffres dans leur ordre d'origine.
Un Very Nice Friedman Number (VNFN), que j'invente ici, est un Nice Friedman Number qui peut être écrit sans les parties les moins jolies (à mon avis) d'une telle expression. Les parenthèses, la concaténation et la négation unaire sont interdites.
Pour ce défi, il existe trois façons possibles d'écrire une expression sans parenthèses.
Préfixe: cela équivaut à l'associativité de gauche. Ce type d'expression est écrit avec tous les opérateurs à gauche des chiffres. Chaque opérateur s'applique aux deux expressions suivantes. Par exemple:
*+*1234 = *(+(*(1,2),3),4) = (((1*2)+3)*4) = 20
Un VNFN qui peut être écrit de cette façon est 343:
^+343 = ^(+(3,4),3) = ((3+4)^3) = 343
Postfix: c'est l'équivalent de l'associativité droite. C'est comme la notation de préfixe, sauf que l'opération va à droite des chiffres. Chaque opérateur s'applique aux deux expressions précédentes. Par exemple:
1234*+* = (1,(2,(3,4)*)+)* = (1*(2+(3*4))) = 14
Un VNFN qui peut être écrit de cette façon est le 15655:
15655^+** = (1,(5,(6,(5,5)^)+)*)* = (1*(5*(6+(5^5)))) = 15655
Infix: la notation Infix utilise l'ordre standard des opérations pour les cinq opérations. Aux fins du défi, cet ordre d'opérations sera défini comme suit: Parenthèse d' ^
abord, à droite de manière associative. Ensuite, entre parenthèses *
et /
simultanément, à gauche de manière associative. Enfin, entre parenthèses +
et -
simultanément, laissé associativement.
1-2-3 = (1-2)-3 = -4
2/3*2 = (2/3)*2 = 4/3
2^2^3 = 2^(2^3) = 256
1^2*3+4 = (1^2)*3+4 = 7
Un VNFN qui peut être écrit de cette façon est 11664:
1*1*6^6/4 = (((1*1)*(6^6))/4) = 11664
Défi: étant donné un entier positif, s'il peut être exprimé comme une expression non triviale de ses propres chiffres dans la notation préfixée, infixée ou postfixée, affichez cette expression. Sinon, ne rien produire.
Clarifications: si plusieurs représentations sont possibles, vous pouvez en sortir n'importe quel sous-ensemble non vide. Par exemple, 736 est un VNFN:
+^736 = 736
7+3^6 = 736
+^736
, 7+3^6
ou les deux seraient tous des sorties acceptables.
Une expression "triviale" signifie une expression qui n'utilise aucun opérateur. Cela ne concerne que les numéros à un chiffre et signifie que les numéros à un chiffre ne peuvent pas être des VNFN. Ceci est hérité de la définition d'un nombre de Friedman.
Les réponses devraient s'exécuter en quelques secondes ou minutes sur des entrées inférieures à un million.
IO: règles d'E / S standard. Programme complet, fonction, verbe ou similaire. STDIN, ligne de commande, argument de fonction ou similaire. Pour la sortie de "Nothing", la chaîne vide, une ligne vierge null
ou similaire et une collection vide conviennent parfaitement. La sortie peut être une chaîne délimitée avec un caractère qui ne peut pas être dans une représentation, ou peut être une collection de chaînes.
Exemples:
127
None
343
^+343
736
736^+
7+3^6
2502
None
15655
15655^+**
11664
1*1*6^6/4
1^1*6^6/4
5
None
Notation: Il s'agit du code golf. Le moins d'octets gagne.
De plus, si vous en trouvez un, veuillez donner un nouveau numéro de Friedman très agréable dans votre réponse.
la source
*(+(*(1,2),3,4)
manque une parenthèse rapprochée, après,3
Parentheses, concatenation and unary negation are disallowed.
Réponses:
Perl,
345334318293263245BAppeler avec
perl -M5.10.0 scratch.pl 736
Résultats
Les premiers résultats que j'ai trouvés sont:
Explication
Entièrement non golfé
J'ai essayé de me répéter autant que possible pour faciliter le golf ultérieur.
Comment c'est joué
$_=q! ... !;eval
Cela donne quelque chose comme ça, à partir duquel vous pouvez supprimer les sauts de ligne pour le résultat:
la source
}glob
et de sauvegarder quelques octets.s!B!}glob!g;BBB
-> 15B;}glob}glob}glob
-> 15B :)Ruby 2.1.5 uniquement -
213220238 + 9 = 247Je ne sais pas comment Ruby bat Perl, mais c'est parti ...
Exécutez cela avec un indicateur -rtimeout (et -W0 ou envoyez votre stderr ailleurs).
Pour rendre cela légèrement plus robuste, remplacez
send([].methods[81],z-1)
parrepeated_permutation(z-1)
et marquez un caractère supplémentaire (donc, 248 ).Fondamentalement, parcourez toutes les permutations des opérateurs et essayez infixe, suffixe et préfixe dans cet ordre. La
d
méthode utiliseeval
le deuxième paramètre pour effectuer les calculs, intercepter toutes les exceptions DivideByZero ou Overflow.Vous devez cependant envoyer stderr vers / dev / null, sinon
eval
, des avertissements seront parfois affichés comme(eval):1: warning: in a**b, b may be too big
.Alors que je suis venu avec ce non-golf, j'ai trouvé un moyen de sauver trois caractères!
Non golfé (principes obsolètes mais similaires):
Changelog
247 a fait ce travail pour un plus grand nombre au lieu de temporiser.
220 a rasé trois caractères en déclarant des tableaux de paren et a corrigé un bogue où les nombres à un chiffre étaient considérés comme des VNFN
213 validation initiale
la source
a.zip(b,c)
renvoie un tableau de tableaux comme[ [a[0],b[0],c[0]],[a[1],b[1],c[1]], etc.]
et['hi', 'there']*''
concatène simplement la représentation sous forme de chaîne des valeurs du tableau.[a,b]*3
cède[a,b,a,b,a,b]
MATLAB (435 b)
essayez-le ici
http://octave-online.net/
la source
Python 2, 303 octets
Essayez-le en ligne
La sortie Infix contiendra
**
au lieu de^
. Si cela n'est pas autorisé, se.replace('**','^')
produira et ajoutera 18 octets supplémentairesExplication:
la source