Eine Teilmenge der verbalen Arithmetik

8

Implementieren Sie einen verbalen arithmetischen Löser aus mehreren gleichen Zahlenfolgen, die zusammenaddiert werden:

  TWO
+ TWO
-----
 FOUR

  REPEAT
  REPEAT
  REPEAT
+ REPEAT
--------
 ANDSTOP

  SPEED
+ SPEED
-------
  KILLS

Es gibt einige Einschränkungen: Jeder Buchstabe sollte unterschiedliche Ziffern darstellen, und kein Buchstabe darf Null sein.

Implementieren Sie den Solver als Funktion der Operanden. Die Summe und Anzahl der Wiederholungen gibt eine Liste der Lösungen zurück (Lösung: das Tupel des resultierenden Operanden und der Summe). Zum Beispiel:

f(['T','W','O'], ['F','O','U','R'], 2) == [(734, 1468)]

Sie müssen Variablen nicht als Buchstaben darstellen und in der Lösung keinen Hash verwenden. Brute-Force-Suche erlaubt.

Der kürzeste Code gewinnt.

Ming-Tang
quelle
Können Sie eine Musterlösung für die beiden anderen Fälle angeben?
FR0DDY
GESCHWINDIGKEIT: = 29331, 58662: = KILLS, Code folgt, muss Golf gespielt werden.
Benutzer unbekannt

Antworten:

3

Mathematica

Zur Verdeutlichung hinzugefügte Leerzeichen. Nicht viel Golf gespielt.
Es müssen griechische Buchstaben verwendet werden, da die eingegebenen Buchstaben als Symbole behandelt werden.

F[σ_ ,ρ_ ,τ_]:=
 (φ = FromDigits;
 Rest@Union[
   If [ τ * φ@σ == φ@ρ, {φ@σ,φ@ρ} ] /.#& /@
 (Thread[Rule[ σ ∪ ρ , # ] ] & /@ Permutations[Range@9, {Length[σ ∪ ρ] }])])

Verwendungszweck:

F[{r,e,p,e,a,t},{a,n,d,s,t,o,p},3]
{{819123,2457369}}

F[{s,p,e,e,d},{k,i,l,l,s},3]
{}

F[{t,w,o},{f,o,u,r},2]
{{734,1468},{836,1672},{846,1692},{867,1734},{928,1856},{938,1876}}  

Es wurde keine Lösung für SPEED + SPEED + SPEED = KILLS gefunden ... ist das ein Fehler?

Bearbeiten

Wenn Sie Null zulassen, werden die folgenden Lösungen für die Gleichung SPEED + SPEED + SPEED = KILLS gefunden:

{{10887,32661},{12667,38001},{23554,70662},
 {23664,70992},{25334,76002},{26334,79002}}

Bearbeiten

Laut Kommentar:

F[{s, p, e, e, d}, {k, i, l, l, s}, 2]  

{{21776,43552},{21886,43772},{23556,47112},{27331,54662},
 {29331,58662},{42667,85334},{45667,91334},{46557,93114}}
Dr. Belisarius
quelle
Metakommentar ... Gibt es eine Möglichkeit, griechische Buchstaben in Codeblöcken anzuzeigen?
Dr. Belisarius
BEARBEITEN: die auf dem Papier gezeigte hat nur zwei GESCHWINDIGKEITEN
Ming-Tang
belisarius: Der Trick besteht darin, keine HTML-Escapezeichen zu verwenden. Da diese nur Zeichen darstellen, ist die direkte Verwendung von Zeichen nicht verboten ;-). Möglicherweise müssen Sie jedoch Ihre Einrückung korrigieren. Ich bin mir nicht sicher, ob ich das richtig gehalten habe.
Joey
@Joey Die maskierten Zeichen werden in der Mathematica-Quelle nicht verwendet. Ich habe sie nur zum Rendern hier verwendet. Es scheint jedoch, dass nicht alle Browser die Zeichen gleich darstellen. Ich sehe Ihren Code und meinen genau gleich :)
Dr. belisarius
1

Python

def f(A,B,N):
 D={}
 r=[]
 for j in A:D[j]=0
 for j in B:D[j]=0
 x=len(D)
 for i in xrange(10**(x-1),10**x):
        c=str(i)
        s={}
        for j in c:s[j]=0
        if(len(s)-x or '0' in c):continue
        k=P=Q=0
        for j in D:D[j]=int(c[k]);k+=1
        for j in A:P=P*10+D[j]
        for j in B:Q=Q*10+D[j]
        if(P*N==Q):r.append((P,Q))
 return r
print f(['T','W','O'], ['F','O','U','R'], 2)

http://ideone.com/4wIQe

fR0DDY
quelle
1

Scala: 333 289

type S=String
def d(x:S,m:Map[Char,Int])={var s=0
for(c<-x;k=m.find(_._1==c);v=(k.get)._2){s*=10
s+=v}
s}
def s(t:Int,f:S,p:S):Unit={
def c(m:Map[Char,Int])=d(f,m)*t==d(p,m)
val g=f.toSet++p
val m=g.zip(util.Random.shuffle((1 to 9).toSeq).take(g.size))
if(c(m.toMap))print(m)else s(t,f,p)}

Verwendungszweck:

s (2,"SPEED","KILLS")
Set((D,7), (K,8), (I,5), (E,6), (S,4), (L,3), (P,2))

s(4,"REPEAT","ANDSTOP")
// endless loop :)
Benutzer unbekannt
quelle
0

PHP (200)

Die Ausführung dieser Funktion dauert sehr lange und benötigt viel Speicher, erfüllt jedoch die Kriterien.

function f($o,$s,$n){$w=count_chars(($c=join($o)).$d=join($s),3);while(++$i<pow(10,9)){if(($u=count_chars($i,3))&&$u[0]*$u[8]&&($n*$a=strtr($c,$w,$i))==$b=strtr($d,$w,$i))$x[]=array($a,$b);}return$x;}

Beispielnutzung:

$a=array('T','W','O');
$b=array('F','O','U','R');
$c=f($a, $b, 2); // returns an array of tuples that satisfy the equation

Erklärung ohne Golf:

function solve($operand, $sum, $num) {
  // convert the operand and sum arrays into strings, join them, then get a string containing the unique characters
  $operand_string = join($operand);
  $sum_string = join($sum);
  $unique_chars = count_chars($operand_string . $sum_string, 3);

  // loop from 1 to 10^9
  while (++$i < pow(10,9)) {
    // get the unique digits in $i
    $unique_digits = count_chars($i, 3);
    // check whether the first digit is non-zero (count_chars sorts in ascending order)
    // and whether the ninth digit is non-zero, these conditions guarantee that $i
    // is a permutation of 1...9 
    if ($u[0] * $u[8]) {
      // translate the operand and sum into numbers, then check if the operand * num = sum
      $translated_operand = strtr($operand_string, $unique_chars, $i);
      $translated_sum = strtr($sum_string, $unique_chars, $i);
      if ($num * $translated_operand == $translated_sum) {
        // add the solution to the solutions array
        $solutions[] = array($translated_operand, $translated_sum);
      }
    }
  }
  // return the solutions array
  return $solutions;
}

Wenn wir den Operanden und die Summe als Zeichenfolgen anstelle von Arrays eingeben dürfen, kann ich die Verknüpfungsoperationen überspringen und 20 Zeichen speichern, um die Summe auf 180 zu setzen.

Migimaru
quelle