Non solo un puzzle a quattro zampe


11

In questa variante del puzzle a quattro zampe dovresti usare fino a x x's(e nessun altro numero) e un set definito di operazioni per raggiungere ogni numero da 0 a 100. Se x = 4poi puoi usarne fino a quattro 4se questa domanda diventa il classico quadruplo puzzle (tranne che puoi usare fino a quattro 4 invece di doverne usare esattamente quattro). Assumiamo1 < x <= 9 .

In questa versione sono consentiti solo i seguenti operatori:

  • Addizione ( +), Sottrazione ( -), Moltiplicazione ( *), Divisione ( /). Nota che questa è vera divisione, quindi5/2 = 2.5 .
  • Esponenziazione (ad esempio 4 ^ 4) in quanto ciò non implicherebbe simboli aggiuntivi se scritto normalmente a mano.
  • Puoi creare nuovi numeri interi concatenando xs. Ad esempio puoi creare numeri interi 4, 44, 444, 4444.

È inoltre possibile utilizzare le parentesi per raggruppare i numeri semplicemente al fine di controllare l'ordine di valutazione degli operatori. Ad esempio non puoi combinare le parentesi con la concatenazione come in(4/4)(4/4) = (1)(1) = 11 .

Non è possibile utilizzare altri simboli e si applica l'ordine delle operazioni standard.

Il tuo programma dovrebbe generare, dato un xnell'intervallo definito e un ntra 0e100 compreso, una soluzione corretta per quell'input se esiste. Altrimenti il ​​tuo codice deve generare qualcosa per indicare che non esiste tale soluzione.

Devi essere in grado di eseguire il tuo invio fino al completamento sul tuo computer per qualsiasi valore di input di xen nell'intervallo consentito. Questo è il golf del codice, quindi vince la soluzione più breve.

Questa vecchia domanda correlata utilizza più operatori (e solo 4s) e quindi tutti i numeri da 0 a 100 sono risolvibili, il che non sarà vero per questa sfida.

Ingresso e uscita

Il tuo codice accetta due numeri interi xe ncome input e dovrebbe generare una soluzione (o un'indicazione che non esiste una soluzione) in qualsiasi formato leggibile dall'uomo che ritieni conveniente. Input 4 6significherebbe "Usando fino a quattro 4, ad esempio il numero 6". Quindi se l'input è 4 6l'output potrebbe essere (4+4)/4+4.



2
Le parentesi possono essere combinate con la concatenazione? es. `(4/4) (4/4) = (1) (1) = 11?
Trauma digitale,

1
Aggiungere parentesi (e non consentire parentesi + concatenazione) rende questo molto più difficile
Draconis,

2
Aggiungendo l'operatore di esponenziazione e un loop esterno sul numero di volte in cui viene utilizzata la cifra, non IMO aggiunge nulla di non banale su codegolf.stackexchange.com/q/82884/194
Peter Taylor,

2
@PeterTaylor Le parentesi sembrano fare molta differenza. Vorrei votare per riaprire se potessi.
Felipa,

Risposte:


4

Python 3 , 265 byte

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{}

Provalo online!

Funziona per tutti i numeri nel riferimento collegato dall'ingegnere Toast.

Corre fino a x=8tio, x=9impiega un paio di minuti sulla mia macchina.


La funzione grestituisce un insieme di tutte le combinazioni con al massimo xnumero di x's. fquindi li attraversa e restituisce il primo che valuta il numero n.

Il numero di possibili valori che ho trovato per ciascuno xsono:

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

Tutti i numeri di cui sopra possono essere generati da (a+b), (a-b), (a+b), a*b, a/b, (a/b), e a^b. a+be a-bnon dare più numeri.

a^b viene anche usato una sola volta, poiché altrimenti vengono creati numeri enormi (questo è verificato anche nel documento di riferimento sopra)


Una versione alternativa che mette in corto circuito non appena trova una soluzione (non come il golf):

Questo è molto più veloce in quanto è x=7..9possibile creare tutti i numeri.

Python 3 , 338 289 byte

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

Provalo online!


Questa è una risposta molto bella! Ho pensato che avessi sempre usato esattamente (al contrario di) x xs (es. (4/4**(4-4))Per 4) ma si scopre che non è così.
Anush,

exit(e)è più corto direturn e
mbomb007
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.