Extraña adición


19

Desafío

Calcule la extraña suma de dos números naturales (también conocida como suma lunar):

Dado A=... a2 a1 a0y B=... b2 b1 b0dos números naturales escritos en la base decimal, la suma extraña se define, en función de la operación máxima , como: A+B=... max(a2,b2) max(a1,b1) max(a0,b0)

   ...         a2         a1         a0
 + ...         b2         b1         b0
 ----------------------------------------
   ...  max(a2,b2) max(a1,b1) max(a0,b0)

Entrada

Dos números naturales

Todo lo siguiente está permitido:

  • Cuerdas con relleno cero (misma longitud)
  • Cuerdas acolchadas en el espacio izquierdo
  • Cuerdas acolchadas en el espacio derecho
  • Matriz de dos cuerdas acolchadas
  • Matriz de caracteres 2D rellena de espacio

Salida

A números naturales

Ejemplo

1999+2018-->2999
17210+701-->17711
32+17-->37
308+250-->358
308+25-->328

Reglas

  • La entrada y la salida se pueden proporcionar en cualquier formato conveniente (elija el formato más apropiado para su idioma / solución).
  • No es necesario manejar valores negativos o entradas inválidas
  • Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
  • Si es posible, incluya un enlace a un entorno de prueba en línea para que otras personas puedan probar su código.
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).

3
también conocido como adición lunar
TFeld

3
¿Podemos tomar la entrada como cadenas con relleno de cero (misma longitud)?
TFeld

1
Creo que esto es demasiado trivial. Extraño que no se haya preguntado antes
Windmill Cookies

1
¿Podemos tener los números de la misma longitud? ¿Te gusta 17210 00701 en lugar de 17210 701?
Windmill Cookies el

77
No veo qué formatos de entrada se permiten exactamente. El formato de entrada es muy importante en este desafío, ya que algunos formatos permiten un procesamiento mucho más fácil. ¿Qué de lo siguiente está permitido? 1) Cuerdas con relleno cero (misma longitud) 2) Cuerdas con relleno en el espacio izquierdo 3) Cuerdas con relleno en el espacio derecho. 4) Matriz de dos cuerdas acolchadas. 5) matriz de caracteres 2D rellena de espacio. Votar para cerrar y votar a favor por ahora; Felizmente eliminaré mis votos cuando esté resuelto
Luis Mendo

Respuestas:




7

R , 68 65 bytes

function(x)apply(outer(x,10^(max(nchar(x)):1-1),`%/%`)%%10,2,max)

Pruébalo en línea!

Entrada como enteros, salida como lista de dígitos.

Si se permitieran listas de dígitos con relleno cero, entonces simplemente pmaxsería suficiente.


6

MATL , 2 bytes

X>

Elija el formato más apropiado para su idioma / solución

El formato de entrada es: matriz de caracteres 2D de dos filas, cada una correspondiente a una línea, con el número más corto con espacios a la izquierda. Por ejemplo

17210
  701

que en MATL se define como

['17210'; '  701']

Pruébalo en línea!

Explicación

      % Implicit input: 2D char array with two rows 
X>    % Take maximum of (code points of) each column
      % Implicit display

5

Python 2 , 73 60 56 bytes

lambda a,b:map(max,zip(a.rjust(len(b)),b.rjust(len(a))))

Pruébalo en línea!

Toma la entrada como dos cadenas y devuelve una lista de dígitos


Alternativa:

Toma la entrada como dos enteros; misma salida

Python 2 , 60 59 bytes

lambda*i:map(max,zip(*['%*d'%(len(`max(i)`),v)for v in i]))

Pruébalo en línea!


5

Java 10, 78 57 bytes

a->b->{for(int i=a.length;i-->0;)if(a[i]<b[i])a[i]=b[i];}

Ingrese como dos matrices de caracteres con espacio.

Modifica la primera matriz de entrada en lugar de devolver una nueva para guardar 21 bytes (gracias a @ OlivierGrégoire ).

Pruébalo en línea.

Explicación:

a->b->{            // Method with two char-array parameters and String return-type
  for(int i=a.length;i-->0;)
                   //  Loop `i` in the range (length, 0]:
    if(a[i]<b[i])  //   If the `i`'th character in input `a` is smaller than in input `b`:
      a[i]=b[i];}  //    Change the `i`'th character in `a` to the `i`'th character of `b`

1
a->b->{for(int i=a.length;i-->0;)if(a[i]<b[i])a[i]=b[i];}( 57 bytes ). Reutilice acomo salida para ganar mucho, mucho bytes.
Olivier Grégoire

@ OlivierGrégoire Ah, no puedo creer que no haya pensado en eso. ¡Gracias! : D
Kevin Cruijssen


4

Japt, 9 8 7 bytes

Toma la entrada como una matriz de matrices de dígitos.

mÔÕÔËrw

Intentalo

m            :Map
 Ô           :  Reverse
  Õ          :Transpose
   Ô         :Reverse
    Ë        :Map
     r       :  Reduce by
      w      :  Maximum

Si se permiten las matrices rellenas con ceros como entrada (actualmente estaría en un "formato conveniente" pero sospecho que esa no es la intención del retador), entonces esto puede ser de 3 bytes.

íwV

Intentalo

í       :Interleave the first input
  V     :With the second
 w      :Reduce each pair by maximum

1
Aquí hay otra solución de 8 bytes con una estrategia diferente y un formato de entrada más simple. tal vez puedas afeitarte un byte de eso?
Kamil Drakari

@KamilDrakari: Extraño - ¡Estaba actualizando con la misma solución!
Shaggy

Curiosamente, la versión que separa los pasos de "transposición" y "reducción" también es de 8 bytes debido a mejores accesos directos
Kamil Drakari

@KamilDrakari, ¿tenemos un atajo por yahora? No sabía eso. Aquí hay otra forma , también 8 bytes.
Shaggy

Ooh, es un buen truco '. No sé si eso alguna vez ahorraría bytes, pero definitivamente es genial.
Kamil Drakari


4

05AB1E , 9 6 5 bytes

-3 gracias a Emigna
-1 gracias a Shaggy

íζ€àR

Toma datos como una lista de listas de dígitos

í      # Reverse both inputs
 ζ     # Zip
  ۈ   # Keep the bigger digits
    R  # Reverse

Pruébalo en línea! o Pruebe todos los casos de prueba


€Rpuede ser í. Además, no creo que necesites €þcomonumber > space
Emigna

@Emigna ¡Gracias! Pensé que lo había intentado sin €þy no funcionó, pero ahora sí ...
Riley

¿Necesitas el Jal final?
Shaggy

@ Shaggy No, supongo que no. ¡Gracias!
Riley

Es poco convincente, pero las reglas permiten una solución de 3 bytes al tomar una matriz de caracteres de espacio en 2D ..
Kevin Cruijssen

4

Perl 6 , 15 bytes

{[~] [Zmax] $_}

Pruébalo en línea!

Toma la entrada como una lista de matrices de caracteres rellenas de espacio, aunque para este desafío el formato de entrada laxa lo hace bastante aburrido. Alternativamente, aquí está el programa que toma una lista de dos enteros en su lugar:

Perl 6 , 41 bytes

{+[~] [Zmax] $_>>.fmt("%{.max}d")>>.comb}

Pruébalo en línea!

Si no le importa una gran cantidad de espacio en blanco, también puede eliminar el + desde el frente.

Explicación:

{                                       }  # Anonymous code block
             $_>>    # Map each integer to 
                 .fmt("%{.max}d") # The number padded by the max of the list spaces
                                 >>.comb   # And split each to list of characters
      [Zmax]  # Get the max of each digit at each index
              # This works because space is coerced to 0
              # Otherwise we would have to add a 0 to the formatting string
  [~]   # Join the list of digits and spaces
 +      # And coerce the string to a number to get rid of leading whitespace

3

Haskell , 40 bytes

a#b=zipWith max(p b++a)$p a++b
p=(' '<$)

Entrada / salida como cadenas, pruébelo en línea!

Explicación

La función preemplaza cada carácter por un espacio, utilizando p b++ay, por p a++blo tanto, tienen la misma longitud. De esta manera podemos usar zipWithsin perder ningún elemento, usarlo maxfunciona porque un (espacio) tiene un punto de código más bajo que cualquiera de los caracteres ['0'..'9'].


3

JavaScript (ES6), 51 49 bytes

NB: esta respuesta se publicó antes de que se permitieran explícitamente los formatos de E / S sueltos. Con matrices de dígitos con relleno de cero, esto se puede hacer en 33 bytes (en mi humilde opinión, es mucho menos interesante).

Toma la entrada como dos enteros. Devuelve un entero.

f=(a,b,t=10)=>a|b&&(a%t<b%t?b:a)%t+t*f(a/t,b/t)|0

Pruébalo en línea!

Comentado

f = (                     // f = recursive function taking:
  a,                      //   a = first integer
  b,                      //   b = second integer
  t = 10                  //   t = 10 (which is used 6 times below)
) =>                      //
  a | b                   // bitwise OR between a and b to test whether at least one of
                          // them still has an integer part
  &&                      // if not, stop recursion; otherwise:
  (                       //
    a % t < b % t ? b : a // if a % 10 is less than b % 10: use b; otherwise: use a
  ) % t +                 // isolate the last decimal digit of the selected number
  t *                     // add 10 times the result of
  f(a / t, b / t)         // a recursive call with a / 10 and b / 10
  | 0                     // bitwise OR with 0 to isolate the integer part

Versión alternativa

Mismo formato de E / S.

f=(a,b)=>a|b&&[f(a/10,b/10)]+(a%10<b%10?b:a)%10|0

Pruébalo en línea!


Puede ser mucho más corto si supone que su entrada es una matriz de caracteres acolchada de espacio 2d.
kamoroso94

¡Hola! ¿Podría dar alguna explicación? "" Intenté "" hacer este desafío en JavaScript, pero fallé y me gustaría ver cómo funciona su solución :)
Neyt

1
@Neyt He agregado una versión comentada. La versión alternativa está usando la misma lógica; la única diferencia es que agregamos el siguiente dígito a la izquierda como una cadena en lugar de multiplicar el resultado de la llamada recursiva por 10.
Arnauld

@Arnauld ¡Gracias! :)
Neyt

2

Tcl , 156 bytes

proc S a\ b {join [lmap x [split [format %0[set l [expr max([string le $a],[string le $b])]]d $a] ""] y [split [format %0$l\d $b] ""] {expr max($x,$y)}] ""}

Pruébalo en línea!

No es muy golfista, pero tuve que probarlo. ¡Lo jugaré más tarde!


Tcl, 159 bytes Outgolf fallido
sergiol

2

Lote de 120 bytes

@set/aw=1,x=%1,y=%2,z=0
@for /l %%i in (0,1,9)do @set/a"z+=w*((v=y%%10)+(v-=x%%10)*(v>>4)),y/=10,x/=10,w*=10
@echo %z%

Toma datos como parámetros de línea de comandos. La versión de 188 bytes funciona en enteros de longitud arbitraria:

@set/px=
@set/py=
@set z=
:l
@if %x:~-1% gtr %y:~-1% (set z=%x:~-1%%z%)else set z=%y:~-1%%z%
@set x=%x:~,-1%
@set y=%y:~,-1%
@if "%x%" neq "" if "%y%" neq "" goto l
@echo %x%%y%%z%

Toma entrada en STDIN.


2

Ramita , 125 bytes

Cuando vi este desafío, pensé: "¡permítanme usar un lenguaje de plantilla! Seguro que encaja bien"

Estaba equivocado ... tan equivocado ... ¡Pero fue divertido!

{%macro a(a,b,s='')%}{%for k,x in a|reverse|split('')%}{%set s=max(x,(b|reverse|split('')[k]))~s%}{%endfor%}{{s}}{%endmacro%}

Esto requiere que "estrictas_variables" esté establecido en false(valor predeterminado).

Para usar esta macro, puede hacer lo siguiente:

{% import 'file.twig' as my_macro %}

{{ my_macro.a(195,67) }}

Debería mostrar 167.

Puede probar esto en https://twigfiddle.com/rg0biy
("estrictas_variables" está desactivado, está activado de forma predeterminada en el sitio web)


1

Casco , 5 bytes

↔¤żY↔

Convenientemente toma entrada / salida como una lista de dígitos, ¡ pruébelo en línea o verifique todo!

Explicación

↔¤żY↔  -- example inputs [1,4] [3,2]
 ¤  ↔  -- reverse the arguments of: [4,1] [2,3]
  żY   -- | zipWith (keeping elements of longer) max: [4,3]
↔      -- reverse: [3,4]

1

Stax , 5 bytes

|>E:o

Ejecutar y depurarlo

Este programa toma la entrada como una matriz de cadenas.

|>  Right align inputs (filling with \0)
E   "Explode" array onto stack separately
:o  "Overlay" Keep the maximum element respective element from two arrays.

Ejecute este

Esta es la primera vez que veo un uso para la instrucción de superposición "en estado salvaje".



1

Pyth, 5 bytes

meSdC

Toma la entrada como una matriz de dos cadenas de espacio.

meSd       map greatest
    C      on the transpose of input

Probarlo aquí .



1

Ceilán, 55/99

Con cadenas de 0 o espacio de la misma longitud (que devuelven un iterable de caracteres)

function t(String a,String b)=>zipPairs(a,b).map(max);

Con cadenas de 0 o de espacio (devolviendo una cadena):

String t(String a,String b)=>String(zipPairs(a,b).map(max));

Con cadenas de longitud posiblemente diferente (devolviendo una cadena):

String u(String a,String b)=>String(zipPairs(a.padLeading(b.size),b.padLeading(a.size)).map(max));



1

Retina 0.8.2 , 39 bytes

+`^(.*)(.)¶(.*)(.)
$1¶$3¶$2$4
%O`.
¶.?

Pruébalo en línea! El enlace incluye un conjunto de pruebas. La versión anterior de Retina 1 de 45 bytes acepta cadenas sin relleno:

P^`.+
+`^(.*)(.)¶(.*)(.)
$1¶$3¶$2$4
%O`.
¶.?

Pruébalo en línea! El enlace incluye un conjunto de pruebas. Explicación:

P^`.+

Rellene ambos valores a la misma longitud. (Retina 1 solamente. Hay formas de emular esto en Retina 0.8.2 pero no son muy golfosas).

+`^(.*)(.)¶(.*)(.)
$1¶$3¶$2$4

Transponer los valores.

%O`.

Ordenar cada par en orden.

¶.?

Elimine todos los dígitos bajos y las líneas nuevas excedentes.


1

Carbón de leña , 8 bytes

⭆θ⌈⟦ι§ηκ

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

 θ          First input
⭆           Map over characters and join
  ⌈         Maximum of
   ⟦        List of
    ι       Current character of first input and
      η     Second input
     §      Indexed by
       κ    Current index
            Implicitly print

La versión de 10 bytes "agrega" cualquier número de cadenas acolchadas:

⭆§θ⁰⌈Eθ§λκ

Pruébalo en línea! El enlace es a la versión detallada del código. La versión anterior de 14 bytes acepta cadenas sin relleno:

⭆◧θLη⌈⟦ι§◧ηLθκ

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

  θ             First input
 ◧              Padded to
   L            Length of
    η           Second input
⭆               Map over characters and join
     ⌈          Maximum of
      ⟦         List of
       ι        Current character of first input and
          η     Second input
         ◧      Padded to
           L    Length of
            θ   First input
        §       Indexed by
             κ  Current index
                Implicitly print

La versión de 17 bytes "agrega" cualquier número de cadenas:

≔⌈EθLιη⭆η⌈Eθ§◧ληκ

Pruébalo en línea! El enlace es a la versión detallada del código.


La pregunta se ha cambiado para que las cadenas se puedan ingresar como acolchadas
solo ASCII el

Nitpicking, pero te perdiste un paréntesis cercano en la primera versión detallada: P
Solo ASCII

@ Solo ASCII Si solo TIO fuera parens para mí ;-)
Neil

0

Mathematica 50 bytes

a = 543; b = 791;

FromDigits@MapThread[Max, IntegerDigits /@ {a, b}]

(* 793 *)


1
¿Puedes agregar un TIO? No conozco Mathematica, pero sospecho que esto podría fallar si las 2 entradas no tienen el mismo número de dígitos.
Shaggy

1
Creo que está recibiendo información a través de variables predefinidas, lo que lo convertiría en un fragmento, lo que no está permitido. Las presentaciones deben ser una función o un programa completo
Jo King
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.