Pas seulement un puzzle à quatre pattes

11

Dans cette variante du casse - tête à quatre fours, vous devez utiliser jusqu'à x x's(et aucun autre nombre) et un ensemble défini d'opérations pour atteindre chaque nombre de 0 à 100. Si x = 4alors vous pouvez utiliser jusqu'à quatre 4set cette question devient les quatre fours classiques puzzle (sauf que vous pouvez utiliser jusqu'à quatre 4 plutôt que d'avoir à en utiliser exactement quatre). Nous supposons 1 < x <= 9.

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

  • Addition ( +), Soustraction ( -), Multiplication ( *), Division ( /). Notez que c'est une vraie division, alors 5/2 = 2.5.
  • Exponentiation (par exemple 4 ^ 4) car cela n'impliquerait aucun symbole supplémentaire s'il était écrit normalement à la main.
  • Vous pouvez créer de nouveaux entiers en concaténant xs. Par exemple, vous pouvez faire des entiers 4, 44, 444, 4444.

Vous pouvez également utiliser des parenthèses pour regrouper des nombres simplement afin de contrôler l'ordre d'évaluation des opérateurs. Vous ne pouvez pas par exemple combiner des parenthèses avec une concaténation comme dans (4/4)(4/4) = (1)(1) = 11.

Aucun autre symbole ne peut être utilisé et l'ordre des opérations standard s'applique.

Votre programme doit générer, étant donné un xdans la plage définie et un nentre 0et 100inclus, une solution correcte pour cette entrée si elle existe. Sinon, votre code doit générer quelque chose pour indiquer qu'aucune telle solution n'existe.

Vous devez pouvoir exécuter votre soumission jusqu'à son terme sur votre machine pour toutes les valeurs d'entrée de xet ndans la plage autorisée. C'est le golf de code, donc la solution la plus courte l'emporte.

Cette ancienne question connexe utilise plus d'opérateurs (et seulement 4s) et donc tous les nombres de 0 à 100 sont résolubles, ce qui ne sera pas vrai pour ce défi.

Entrée et sortie

Votre code prend deux entiers xet nen entrée et doit générer une solution (ou une indication qu'il n'y a pas de solution) dans n'importe quel format lisible par l'homme que vous jugez pratique. L'entrée 4 6signifierait par exemple "En utilisant jusqu'à quatre 4, faites le nombre 6". Donc, si l'entrée est 4 6la sortie pourrait l'être (4+4)/4+4.

Anush
la source
1
Référence utile
Engineer Toast
2
Les parens peuvent-ils être combinés avec la concaténation? par exemple `(4/4) (4/4) = (1) (1) = 11?
Digital Trauma
1
Ajouter des parenthèses (et interdire les parenthèses + la concaténation) rend cela beaucoup plus difficile
Draconis
2
L'ajout de l'opérateur d'exponentiation et d'une boucle externe sur le nombre de fois où le chiffre est utilisé n'ajoute rien d'IMO non trivial sur codegolf.stackexchange.com/q/82884/194
Peter Taylor
2
@PeterTaylor Les parenthèses semblent faire beaucoup de différence. Je voterais pour rouvrir si je le pouvais.
felipa

Réponses:

4

Python 3 , 265 octets

def f(x,n):
 for e in g(x,x-(x>7)):
  try:
   if eval(e)==n:return e
  except:1
g=lambda x,d:{str(x)*-~i for i in range(d)}|{s%(a,b)for a in g(x,d-1)for b in g(x,d-a.count(str(x)))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}if d else{}

Essayez-le en ligne!

Fonctionne pour tous les numéros de la référence liée par Engineer Toast.

Fonctionne jusqu'à x=8on tio, x=9prend quelques minutes sur ma machine.


La fonction grenvoie un ensemble de toutes les combinaisons avec au plus le xnombre de x. fpuis les parcourt et renvoie le premier qui évalue le nombre n.

Le nombre de valeurs possibles que j'ai trouvées pour chacune xest:

x  possible numbers
------
2  5
3  17
4  35
5  56
6  83
7  101
8  101
9  101

Tous les numéros ci - dessus peuvent être générés à partir (a+b), (a-b), (a+b), a*b, a/b, (a/b)et a^b. a+bet a-bne donnez pas plus de chiffres.

a^b n'est également utilisé qu'une seule fois, sinon des nombres énormes sont créés (cela est également vérifié dans le document de référence ci-dessus)


Une version alternative qui court-circuite dès qu'elle trouve une solution (pas aussi golfée):

C'est beaucoup plus rapide car x=7..9tous les nombres peuvent être créés.

Python 3 , 338 289 octets

def f(x,n,d=-1):
 d=[d,x][d<0];X=str(x);r=set()
 for E in{X*-~i for i in range(d)}|{s%(a,b)for a in[0]*d and f(x,n,d-1)for b in f(x,n,d-a.count(X))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}:
  try:e=eval(E)
  except:e=-1
  if e==n:exit(E)
  r|={E}
 return r

Essayez-le en ligne!

TFeld
la source
C'est une très belle réponse! Je pensais que vous utilisiez toujours exactement (par opposition à jusqu'à) x xs (par exemple (4/4**(4-4))pour 4) mais il s'avère que ce n'est pas le cas.
Anush
exit(e)est plus court quereturn e
mbomb007