Puzzle à quatre pattes

21

Le puzzle à quatre fours est un puzzle mathématique récréatif populaire qui consiste à utiliser exactement quatre 4 (et aucun autre nombre) et un ensemble défini d'opérations pour atteindre chaque nombre de 0 à un maximum donné.

Dans cette version, les seuls opérateurs suivants sont autorisés:

  • Tous les symboles de regroupement peuvent être utilisés
  • Addition ( +), Soustraction ( -), Multiplication ( *), Division ( /)
  • Factorielle ( !), fonction Gamma ( Γ)
  • Exponentiation ( ^), Racine carrée ( )
  • Concaténation (par exemple, 44est deux 4s)
  • Point décimal (par exemple, 4.4deux 4s), Overbar (par exemple .4~ = 4/9)

L'ordre des opérations standard s'applique.

Votre programme devrait générer, pour une entrée comprise entre 0 et 100 inclus, une solution correcte pour cette entrée. Si le programme génère une solution non valide sur une entrée, ce programme n'est pas valide.

Par exemple, avec une entrée de 0, votre programme pourrait générer 44-44.

L'utilisation de modules externes n'est pas autorisée. Seul _.4~est autorisé pour l'opérateur overbar - c'est-à-dire qu'un seul 4peut être derrière le point décimal.

C'est le golf de code, donc la solution la plus courte l'emporte.


Edit : Pour être plus clair, le programme doit sortir un ensemble des opérations ci-dessus appliquées à exactement quatre 4s - ni plus, ni moins. En outre, .4 = 4/10est un terme valide et compte pour n'en utiliser qu'un 4.

Volatilité
la source
aucune opération d'arrondi? :-(
John Dvorak
@JanDvorak euh, non, cela ne serait pas autorisé.
Volatilité
gamma et factoriel sont-ils autorisés?
John Dvorak
@JanDvorak tout ce qui est répertorié (mais uniquement les éléments répertoriés) peut être utilisé.
Volatilité
sommes-nous autorisés à produire factorielle comme une fonction de préfixe ( !(4)plutôt que (4)!)?
John Dvorak

Réponses:

6

GolfScript (129 caractères *)

[4.`2'√4'24'4!'6'Γ4'1'Γ√4'120'ΓΓ4']2/:F{.F=[[44.`]]*\{`{+{'+*-'1/{:^;.[~@[\]{'()'1/*}%^*@@^~\]\}/}:|~2/~\+|;}+F/}%+}3*\{\0==}+?1=

Le temps de course est de l'ordre de 4 minutes sur mon PC. Une accélération modérée peut être obtenue au prix de deux caractères en ajoutant une opération d'unicité .&immédiatement après le %+.

J'utilise des expressions pré-codées 1, 2, 4, 6, 24, 120, et 44, et construire le reste en place de ceux qui utilisent seulement +, *et -. De cette façon, je n'ai pas besoin de faire d'arithmétique non entière dans le programme lui-même. J'ai essayé d'obtenir des expressions plus simples en plaçant les valeurs précodées plus simples au début.

Toutes ces valeurs sont requises , et il est nécessaire de prendre en charge les deux directions de soustraction ( complex_expression - simple_expressionet vice versa). Il est également nécessaire d'inclure certaines opérations qui nécessitent des parenthèses (en particulier, a*(b-c)), donc je place toutes les sous-expressions sans distinction.

* Je compte les points de code Unicode en supposant que le programme est encodé en UTF-8, et je passe sous le tapis le fait qu'à moins que vous n'utilisiez une version récente de Ruby pour exécuter l'interpréteur, il le traite vraiment comme des caractères ASCII. Si vous êtes très inquiet à ce sujet, utilisez GGamma et vsqrt.

Eh bien, strictement je pourrais retirer 44en échange au 11fur 44/4et à 71mesure √(Γ√4+(ΓΓ4+Γ√4)!), mais ce n'est pas un bon compromis.

Peter Taylor
la source
7

Python 155 octets

h={4:'4',24:'4!',6:'â4',.4:'.4',1:'âû4',4/9.:'.4~'}
f={}
def g(r,s='24',y='4!'):f[eval(s)]=y;[g(r-1,s+o+`k`,y+o+h[k])for k in h for o in'/*-+'if r]
g(3)

Les trois premiers octets ( \xEF\xBB\xBF) sont la marque d'ordre des octets UTF-8, bien que le fichier doive être enregistré au format ANSI. Le ûet âsera interprété comme et Γrespectivement dans cp437 et cp850 , qui devraient fonctionner sur à peu près n'importe quelle boîte Windows.

Le temps d'exécution est d'environ 0,4 s sur mon ordinateur.

Exemple d'utilisation (nommez le fichier four_fours.py):

$ python
>>> from four_fours import f
>>> f[39]
'4!+4!/.4/4'
>>> f[87]
'4!*4-4/.4~'
>>> for i in range(101): print i, f[i]
0 4!+4!-4!-4!
1 4!+4!/4!-4!
2 4!-4!+Γ4-4
3 4!-4!+4-Γ√4
4 4!+4!/Γ4-4!
.
.
.
96 4!+4!+4!+4!
97 4!*4!/Γ4+Γ√4
98 4!*4+Γ4-4
99 4!*4+4-Γ√4
100 4!*4!/Γ4+4

Résultats pour 0..100 . En raison de la façon dont le hachage est itéré, il préfère l'utiliser 4!aussi souvent que possible.

Modifier: a enregistré un certain nombre d'octets en ajoutant Γ√4 = 1, ce qui élimine le besoin de regroupements, et en supprimant √4 = 2, ce qui n'était plus nécessaire.

primo
la source
4

J, 175 161 caractères

   f=.')',~'(',;@((<;._2'+ - * % .4 .4~ g(r(4)) r(4) 4 g(4) 4! ( ) '){~(143402 A.i.9)
      /:~(12,11,0,6$0 4 4)+(9$4 7 7)#:((,@(+/,-/,*/,%/)~)^:2,0.4 4r9 1 2 4 6 24)&i.)

   f 1
(.4+.4)+(.4%r(4))

   f 42
(r(4)+4)+(g(4)*g(4))

   f 100
(r(4)+r(4))+(4*4!)

Le format vérifié est (v op v) op (v op v)v={0.4 4/9 1 2 4 6 24}etop={+ - * /}

plein 0..100 résultats

randomra
la source
Je ne pense pas que ce .4soit un nombre valide pour ce jeu.
John Dvorak
@JanDvorak c'est - peut-être aurais-je dû être plus clair
Volatilité