Finden Sie die Operationen, die erforderlich sind, um das Ergebnis zu erhalten


10

Die Aufgabe ist also einfach. Bei einem Array von Zahlen und Ergebnissen müssen Sie herausfinden, welche Operationen Sie für Zahlen aus dem Array verwenden müssen, um das angeforderte Ergebnis zu erhalten.

Machen wir es uns für den Start einfach und erlauben nur grundlegende Operationen wie: Addition, Subtraktion, Multiplikation und Division.

Beispiel:

Input  : [5,5,5,5,5] 100
Output : 5*5*5-5*5

Um Sprachen wie Java einen Vorteil zu verschaffen, muss die Funktion implementiert werden, nicht das gesamte Programm. Das Ergebnis kann über Parameter zurückgegeben oder an die Konsole gedruckt werden.

Der Code wird basierend auf der Anzahl der Bytes bewertet, und da es sich um eine Golfcode-Herausforderung handelt, gewinnt die niedrigste Punktzahl.

Eine weitere Anforderung ist, dass Sie zusätzliche -10 Punkte erhalten können, wenn das Array nur Digids enthält. Sie unterstützen Lösungen, bei denen Sie Zahlen aus folgenden Ziffern erstellen können. Dh

Input  : [1,2,3,4,5] 0
Output : 12-3-4-5

Beachten Sie, dass einige Fälle möglicherweise mehr als eine Lösung haben, sofern es sich bei den Ausgaben um vorgeschlagene Ausgaben handelt. Es liegt an Ihnen, eine oder mehrere Lösungen für eine bestimmte Aufgabe bereitzustellen.

BEARBEITEN: Das Ergebnis muss aus mathematischer Sicht gültig sein, daher ist Division eine rationale Division, keine ganze Zahl, und die Priorität der Operation ist dieselbe wie in der klassischen Mathematik (zuerst Multiplikation und Division, dann Addition und Subtraktion).


4
Hat *und /hat Vorrang vor +und -? Ihre beiden Beispiele widersprechen sich.
Undichte Nonne

1
Bitte stellen Sie in Zukunft sicher, dass Sie prozentuale Kopfgelder für eine Sprache wie Java erstellen. -10 Bytes sind nicht so gut wie für Gelee
Bálint


4
Müssen die Zahlen der Reihe nach verwendet werden? Für zukünftige Herausforderungen empfehle ich außerdem von Herzen, die Sandbox zu verwenden, in der diese Art von Problemen behoben werden kann, bevor Sie sie an Main senden.
AdmBorkBork

2
@ mbomb007 es ist kein Duplikat von beidem. Dies sind willkürliche numerische Eingaben, und nur grundlegende mathematische Operationen sind zulässig. Sie sollen keine tatsächlichen Programme ausgeben.
Patrick Roberts

Antworten:



4

Oracle SQL 11.2, 322 304 270 Byte

SELECT o FROM(SELECT REPLACE(SUBSTR(:1,1,1)||REPLACE(SYS_CONNECT_BY_PATH(a||SUBSTR(:1,LEVEL*2+1,1),','),','),'_')o,LEVEL l FROM(SELECT SUBSTR('+-*/_',LEVEL,1)a FROM DUAL CONNECT BY LEVEL<6)CONNECT BY LEVEL<LENGTH(:1)/2)WHERE:2=dbms_aw.eval_number(o)AND l>LENGTH(:1)/2-1;

: 1 ist die Liste der Ziffern
: 2 ist das gesuchte Ergebnis

Nicht Golf:

SELECT o
FROM   (
         SELECT REPLACE(SUBSTR(:1,1,1)||REPLACE(SYS_CONNECT_BY_PATH(a||SUBSTR(:1,LEVEL*2+1,1),','),','),'_')o,LEVEL l 
         FROM ( -- Create one row per operator 
                SELECT SUBSTR('+-*/_',LEVEL,1)a FROM DUAL CONNECT BY LEVEL<6
              ) CONNECT BY LEVEL<LENGTH(:1)/2  -- Create every combination of operators, one per ','
)
WHERE :2=dbms_aw.eval_number(o)  -- filter on result = evaluation
  AND l>LENGTH(:1)/2-1           -- keep only expressions using every digits

4

TSQL (sqlserver 2016) 310 294 280 Byte

Was für eine wunderbare Gelegenheit, hässlichen Code zu schreiben:

Golf:

DECLARE @ varchar(max)= '5,5,5'
DECLARE @a varchar(20) = '125'

,@ varchar(max)='';WITH D as(SELECT @a a UNION ALL SELECT STUFF(a,charindex(',',a),1,value)FROM STRING_SPLIT('*,+,./,-,',',')x,d WHERE a like'%,%')SELECT @+=a+','''+REPLACE(a,'.','')+'''),('FROM D WHERE a not like'%,%'EXEC('SELECT y FROM(values('+@+'null,null))g(x,y)WHERE x='+@b)

Probieren Sie es online aus

Lesbar: (Das Einfügen eines Dezimalpunkts (.) Und das Entfernen desselben ist erforderlich, damit SQL akzeptiert, dass 4/5 nicht 0 ist. Das Entfernen ist auch für die Testpersonen vorgesehen.)

DECLARE @a varchar(max)= '5,5,5'
DECLARE @b varchar(20) = '5'

,@ varchar(max)=''
;WITH D as
(
  SELECT @a a
  UNION ALL
  SELECT STUFF(a,charindex(',',a),1,value)
  FROM STRING_SPLIT('*,+,./,-,',',')x,d
  WHERE a like'%,%'
)
SELECT @+=a+','''+REPLACE(a,',','')+'''),('
FROM D
WHERE a not like'%,%'

EXEC('SELECT y FROM(values('+@+'null,null))g(x,y)WHERE x='+@b)

Diese Lösung kann auch folgende Eingabetypen verarbeiten:

Eingabe: [1,2,3,4,5] 0 Ausgabe: 12-3-4-5


3

JavaScript (ES6), 165 147 Bytes

a=>o=>(c=[],i=c=>{for(j=0;!((c[j]?++c[j]:c[j]=1)%5);)c[j++]=0},eval(`while(eval(e=(a+'').replace(/,/g,(_,j)=>'+-*/'.charAt(c[~-j/2])))!=o)i(c);e`))

Verschachtelt eval... schön.

f=a=>o=>(c=[],i=c=>{for(j=0;!((c[j]?++c[j]:c[j]=1)%5);)c[j++]=0},eval(`while(eval(e=(a+'').replace(/,/g,(_,j)=>'+-*/'.charAt(c[~-j/2])))!=o)i(c);e`))
console.log(f([5,5,5,5,5])(100))
console.log(f([1,2,3,4,5])(0))
console.log(f([3,4])(0.75))
console.log(f([3,4,5,6])(339))


3

Python 3, 170 155 Bytes

from itertools import*
def f(n,o):print({k for k in[''.join(map(str,sum(j,())))[1:]for j in[zip(x,n)for x in product('+-*/',repeat=len(n))]]if eval(k)==o})

Erstellen Sie einen Generator mit allen möglichen Ordnungen der Operatoren, kombinieren Sie diese mit den Zahlen und bewerten Sie sie, bis wir die Antwort erhalten.

https://repl.it/C2F5


2
Sie könnten ein paar Zeichen sparen durch Ersetzen ['+','-','*','/']mit '+-*/'; Da strings iterabel sind, wird es wie ein behandelt, arraywobei jedes Element jedes Zeichen im ist. stringEs verhält sich also so, als hätten Sie es mit dem Array versehen, über das Sie derzeit verfügen.
Nasonfish

2

Python, 195 186 Bytes

Hier ist eine grausame Art, es zu tun.

def x(i,r):
 t=""
 from random import choice as c
 while True:
  for j in i:
   t+=str(j)
   if c([0,1]):t+="."+c("+-/*")
  t=t.strip("+-*/.")+"."
  v=eval(t)
  if v == r:print t
  t=""

Die Funktion xakzeptiert zum Beispiel ein Argument von a listund a result- x([1,2,3,4,5], 15).

Das Programm beginnt eine Schleife, in der wir nach dem Zufallsprinzip auswählen, ob "+", "-", "*", or "/"zwischen die einzelnen Zahlen angehängt werden soll oder ob sie miteinander verknüpft werden sollen. Dies schien eine präzisere Option zu sein, als tatsächlich Permutationen durchzugehen und jede Kombination zu versuchen, um jedes Ergebnis zu finden, und obwohl die Ausführung länger dauert und viel weniger effizient ist. (Zum Glück ist das in diesem Zusammenhang kein Problem!)

Es wird auch "." zu jeder Zahl, um nicht ganzzahlig gerundete Operationen wie zu vermeiden 6/4 = 1. Es ist dann evalunser Ausdruck und bestimmt, ob das Ergebnis dem entspricht, was wir erwarten, und wenn ja, gibt es den Ausdruck aus.

Dieses Programm wird nie beendet - es gibt kontinuierlich Ergebnisse aus, bis es beendet wird.

BEARBEITEN 1 : Entfernen Sie unnötige Zeilenumbrüche, in denen einzeilige ifAnweisungen verwendet werden können.


wirklich lustige Umsetzung. aber einfach, mehr Bytes zu sparen Probieren Sie es online aus! (176 Bytes)
Bobrobbob

2

Matlab, 234 238 258 Bytes

Ich gehe aufgrund der Einschränkungen der anderen Antworten davon aus, dass die Nummernreihenfolge des Eingabearrays von fiat beibehalten wird.

n=length(x)-1
k=n*2+2
p=unique(nchoosek(repmat('*-+/',1,n),n),'rows')
p=[p char(' '*~~p(:,1))]'
c=char(x'*~~p(1,:))
o=p(:,r==cellfun(@eval,mat2cell(reshape([c(:) p(:)]',k,[]),k,0|p(1,:))))
reshape([repmat(x',size(o,2),1) o(:)]',k,[])'

Dieser Code eine Reihe von Zahlen nimmt x, sagen x = '12345'und ein Ergebnis r, sagen r = 15und kehrt alle Saiten von Ausdrücken können Sie auswerten bekommen rvon xmit den vier Betreibern.

Ich habe zwei verschiedene längenäquivalente Methoden verwendet, um die Verwendung von Ausdrücken vom Typ ones(length())-type oder repmat(length())-type zu vermeiden : ~~p(1,:)die Nicht-Nicht-Werte in p(dh eine Liste von 1s der gleichen Länge als erste Dimension von p) zurückgeben und 0|p(:,1)die 0 zurückgeben oder vorhanden sind -a-value-in p(dh eine Liste von 1s mit der gleichen Länge wie die zweite Dimension von p).

Matlab hat keine Methode nchoosek mit Ersetzung , daher habe ich die Operatoren die richtige Anzahl von Malen dupliziert, den gesamten Speicherplatz nchoosekfür diese größere Auswahl von Operatoren berechnet und dann einen uniqueAufruf verwendet, um das Ergebnis auf das zu reduzieren, was es sein sollte (Entfernen äquivalenter Kombinationen wie '*** +' und '*** +'). Ich füge ein abschließendes Leerzeichen hinzu, das der Länge des Eingabevektors zu Verkettungszwecken entspricht, und komponiere dann die Operatorzeichenfolgen mit den Eingabezeichenfolgen in den Spalten einer Matrix. Ich werte dann die Ausdrücke spaltenweise aus, um Ergebnisse zu erhalten und die Reihenfolge der Operatoren zu finden, die den Spalten mit Ergebnissen entspricht, die unserer Eingabe entsprechen r.

Test: x = '12345', r = 15:

1*2*3+4+5 
1+2+3+4+5 
1-2*3+4*5 

Wenn ich ein Array mit Werten mit doppelter Genauigkeit verwenden müsste, müsste ich x = num2str(x,'%d');die Ziffern in eine Zeichenfolge konvertieren ;und meiner Punktzahl 21 (20 ohne ) hinzufügen . * Die zusätzlichen Bytes waren Semikolons, die ich rein gelassen habe, damit jeder, der diesen Code ausführt, seine Eingabeaufforderung nicht mit langen Arrays in die Luft sprengen sieht. Da meine Bearbeitung ohnehin einen riesigen Stapel von Warnungen über Logiken und Doppelpunktoperanden erzeugt, habe ich die Semikolons in der neuen Version entfernt.

Bearbeiten 2: Vergessen, ein 2*n+2durch zu ersetzen k.

Alte Antwort:

n=length(x)-1;
p=unique(nchoosek(repmat(['*','-','+','/'],1,n),n),'rows');
l=length(p);
p=[p repmat(' ',l,1)]';
c=reshape([repmat(x',l,1) p(:)]',n*2+2,[]);
o = p(:,r == cellfun(@eval, mat2cell(c,n*2+2,ones(l,1))));
reshape([repmat(x',size(o,2),1) o(:)]',n*2+2,[])'

2

JavaScript (ES6), 88 Byte

a=>o=>eval(`while(eval(e=(a+'').replace(/,/g,_=>'+-*/'.charAt(Math.random()*5)))!=o);e`)

Warf ein wenig Zufälligkeit in die Mischung. Viel einfacher als das systematische Durchlaufen der Kombinationen.

Testsuite

f=a=>o=>eval(`while(eval(e=(a+'').replace(/,/g,_=>'+-*/'.charAt(Math.random()*5)))!=o);e`)
console.log(f([5,5,5,5,5])(100))
console.log(f([1,2,3,4,5])(0))
console.log(f([3,4])(0.75))
console.log(f([3,4,5,6])(339))


1

PHP, 108 Bytes

for(;$i=$argc;eval("$s-$argv[1]?:die(\$s);"))for($s="",$x=$p++;--$i>1;$x/=4)$s.="+-*/"[$s?$x&3:4].$argv[$i];

Nimmt Eingaben von Befehlszeilenargumenten in umgekehrter Reihenfolge entgegen. Laufen Sie mit -r.

Nervenzusammenbruch

for(;                   # infinite loop:
    $i=$argc;               # 1. init $i to argument count
    eval("$s-$argv[1]?:"    # 3. if first argument equals expression value,
        ."die(\$s);")       #    print expression and exit
    )
    for($s="",              # 2. create expression:
        $x=$p++;            #    init map
        --$i>1;                 # loop from last to second argument
        $x/=4)                  # C: shift map by two bits
        $s.="+-*/"[$s?$x&3:4]   # A: append operator (none for first operand)
            .$argv[$i];         # B: append operand

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.