Un subconjunto de aritmética verbal

8

Implemente un solucionador aritmético verbal de varias secuencias iguales de números sumados:

  TWO
+ TWO
-----
 FOUR

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

  SPEED
+ SPEED
-------
  KILLS

Existen algunas restricciones: cada letra debe representar diferentes dígitos y ninguna letra puede ser cero.

Implemente el solucionador como una función de los operandos, la suma y el número de repeticiones devuelve una lista de soluciones (solución: la tupla del operando resultante y la suma). Por ejemplo:

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

No necesita representar las variables como letras, y no necesita usar un hash en la solución. Búsqueda de fuerza bruta permitida.

El código más corto gana.

Ming-Tang
fuente
¿Puede dar una solución de muestra para los otros dos casos?
fR0DDY
VELOCIDAD: = 29331, 58662: = KILLS, sigue el código, debe jugarse golf.
usuario desconocido

Respuestas:

3

Mathematica

Espacios añadidos para mayor claridad. No mucho golf.
Necesita usar letras griegas porque las letras de entrada se tratan como símbolos.

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

Uso:

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

No encontró ninguna solución para SPEED + SPEED + SPEED = KILLS ... ¿eso es un error?

Editar

Permitiendo cero, encuentra las siguientes soluciones para la ecuación SPEED + SPEED + SPEED = KILLS:

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

Editar

De acuerdo al comentario:

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. belisario
fuente
meta-comentario ... ¿Hay alguna forma de mostrar letras griegas en bloques de código?
Dr. belisario
EDITAR: el que se muestra en el papel tiene solo dos VELOCIDADES
Ming-Tang
belisario: El truco es no usar escapes HTML. Dado que esos representan solo caracteres que usan caracteres directamente, no está prohibido ;-). Sin embargo, es posible que deba corregir su sangría; No estoy seguro de haber mantenido eso correcto.
Joey
@Joey Los caracteres escapados no se usan en la fuente de Mathematica, los usé solo para renderizar aquí. Pero parece que no todos los navegadores hacen que los caracteres sean iguales. Veo su código y el mío exactamente igual :)
Dr. belisarius
1

Pitón

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
fuente
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)}

Uso:

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 :)
usuario desconocido
fuente
0

PHP (200)

Esta función tarda mucho tiempo en ejecutarse y utiliza mucha memoria, pero cumple los criterios.

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

Uso de la muestra:

$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

Explicación sin 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;
}

Si se nos permite ingresar el operando y la suma como cadenas en lugar de matrices, entonces puedo omitir las operaciones de unión y guardar 20 caracteres para poner el total en 180.

migimaru
fuente