Adição estranha


19

Desafio

Calcule a soma estranha de dois números naturais (também conhecidos como adição lunar):

Dado A=... a2 a1 a0e B=... b2 b1 b0dois números naturais escritos na base decimal, a soma estranha é definida, com base na operação 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

Dois números naturais

É permitido todo o seguinte:

  • Cordas com preenchimento zero (mesmo comprimento)
  • Cordas acolchoadas no espaço esquerdo
  • Cordas acolchoadas no espaço direito
  • Matriz de duas cordas acolchoadas
  • Conjunto de caracteres 2D preenchido com espaço

Resultado

Um número natural

Exemplo

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

Regras

  • A entrada e a saída podem ser fornecidas em qualquer formato conveniente (escolha o formato mais apropriado para o seu idioma / solução).
  • Não há necessidade de lidar com valores negativos ou entrada inválida
  • Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
  • Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.

3
também conhecido como adição lunar
TFeld 15/11/2018

3
Podemos considerar a entrada como cadeias de preenchimento zero (mesmo comprimento)?
TFeld

1
Eu acho que isso é um pouco trivial. Estranho que não tenha sido solicitado antes
Moinho cookies

1
Podemos ter os números do mesmo comprimento? Como 17210 00701 em vez de 17210 701?
Cookies de moinho de vento

7
Não consigo ver exatamente quais formatos de entrada são permitidos. O formato de entrada é muito importante nesse desafio, pois alguns formatos permitem um processamento muito mais fácil. Quais das seguintes opções são permitidas? 1) Cordas preenchidas com zero (mesmo comprimento) 2) Cordas preenchidas com espaço esquerdo 3) Cordas preenchidas com espaço direito. 4) Matriz de duas cordas acolchoadas. 5) Conjunto de caracteres 2D preenchido com espaço. Votação para fechar e voto negativo por enquanto; Eu ficaria feliz em tirar os votos quando resolvidos
Luis Mendo

Respostas:




7

R , 68 bytes 65

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

Experimente online!

Entrada como números inteiros, saída como lista de dígitos.

Se listas de dígitos com preenchimento zero fossem permitidas, simplesmente pmaxseria suficiente.


6

MATL , 2 bytes

X>

Escolha o formato mais apropriado para o seu idioma / solução

O formato de entrada é: matriz de caracteres 2D de duas linhas, cada uma correspondente a uma linha, com o número menor preenchido à esquerda com espaços. Por exemplo

17210
  701

que em MATL é definido como

['17210'; '  701']

Experimente online!

Explicação

      % 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))))

Experimente online!

Recebe a entrada como duas cadeias e retorna uma lista de dígitos


Alternativo:

Recebe entrada como dois números inteiros; mesma saída

Python 2 , 60 59 bytes

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

Experimente online!


5

Java 10, 78 57 bytes

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

Entrada como duas matrizes de caracteres preenchidos com espaço.

Modifica a primeira matriz de entrada em vez de retornar uma nova para salvar 21 bytes (graças a @ OlivierGrégoire ).

Experimente online.

Explicação:

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 ). Reutilize acomo saída para obter muitos bytes.
Olivier Grégoire 16/11

@ OlivierGrégoire Ah, não acredito que não tinha pensado nisso. Obrigado! : D
Kevin Cruijssen


4

Japonês, 9 8 7 bytes

Recebe a entrada como uma matriz de matrizes de dígitos.

mÔÕÔËrw

Tente

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

Se aceitar matrizes preenchidas com zero como entrada é permitida (atualmente ela se enquadra em um "formato conveniente", mas desconfio que essa não seja a intenção do desafiante), isso pode ser de 3 bytes.

íwV

Tente

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

1
Aqui está outra solução de 8 bytes com uma estratégia diferente e um formato de entrada mais simples. talvez você possa raspar um byte disso?
Kamil Drakari

@KamilDrakari: Uncanny - Eu estava atualizando com a mesma solução!
Shaggy

Curiosamente, a versão que separa a "transposição" e "reduzir" etapas é também 8 bytes por causa de melhores atalhos
Kamil Drakari

@KamilDrakari, oh, temos um atalho por yenquanto? Eu não sabia disso. Aqui está outra maneira , também de 8 bytes.
Shaggy

Ooh, isso é um truque legal '. Não sei se isso salvaria bytes, mas é definitivamente legal.
Kamil Drakari


4

05AB1E , 9 6 5 bytes

-3 graças a Emigna
-1 graças a Shaggy

íζ€àR

Recebe entrada como uma lista de listas de dígitos

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

Experimente online! ou Experimente todos os casos de teste


€Rpode ser í. Além disso, eu não acho que você precisa €þcomo:number > space
Emigna 15/1118

@Emigna Thanks! Pensei que tentou fazê-lo sem €þe não funcionou, mas agora ele faz ...
Riley

Você precisa Jdo final?
Shaggy

@ Shaggy Não, acho que não. Obrigado!
Riley

É de coxo, mas as regras permitir uma solução de 3 bytes , tendo uma matriz de char espaço acolchoado 2D ..
Kevin Cruijssen

4

Perl 6 , 15 bytes

{[~] [Zmax] $_}

Experimente online!

Aceita entrada como uma lista de matrizes de caracteres preenchidas com espaço, embora para esse desafio o formato de entrada relaxado o torne bastante chato. Como alternativa, aqui está o programa que pega uma lista de dois números inteiros:

Perl 6 , 41 bytes

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

Experimente online!

Se você não se importa com uma quantidade enorme de espaço em branco, também pode remover o +da frente.

Explicação:

{                                       }  # 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 / saída como strings, experimente online!

Explicação

A função psubstitui cada caractere por um espaço, usando p b++ae, p a++bportanto, tem o mesmo comprimento. Dessa forma, podemos usar zipWithsem perder nenhum elemento, usando maxcom ele funciona porque um (espaço) tem um ponto de código mais baixo do que qualquer um dos caracteres ['0'..'9'].


3

JavaScript (ES6), 51 49 bytes

Nota: esta resposta foi publicada antes que os formatos de E / S soltos fossem explicitamente permitidos. Com matrizes de dígitos preenchidas com zero, isso pode ser feito em 33 bytes (mas é muito menos interessante, IMHO).

Recebe a entrada como dois números inteiros. Retorna um número inteiro.

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

Experimente online!

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

Versão alternativa

Mesmo formato de E / S.

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

Experimente online!


Você pode ficar muito mais curto se considerar que sua entrada é uma matriz de caracteres preenchida com espaço em 2D.
kamoroso94

Oi! Você poderia dar uma explicação? I "" tentou "" para fazer este desafio em JavaScript, mas eu falhou e gostaria de ver como funciona a sua solução :)
Neyt

1
@ Neyt Adicionei uma versão comentada. A versão alternativa está usando a mesma lógica; a única diferença é que nós adicionamos o próximo dígito à esquerda como uma string em vez de multiplicar o resultado da chamada recursiva por 10.
Arnauld

@Arnauld Obrigado! :)
Neyt


2

Lote, 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%

Recebe a entrada como parâmetros da linha de comando. A versão de 188 bytes funciona em números inteiros arbitrários:

@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%

Recebe entrada em STDIN.


2

Galho , 125 bytes

Quando vi esse desafio, pensei: "deixe-me usar uma linguagem de modelo! Com certeza é uma boa opção"

Eu estava errado ... tão errado ... ... Mas foi 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%}

Isso requer que "strict_variables" esteja definido como false(valor padrão).

Para usar essa macro, você pode fazer o seguinte:

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

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

Deve exibir 167.

Você pode tentar isso em https://twigfiddle.com/rg0biy
("strict_variables" está desativado, está ativado por padrão no site)


1

Casca , 5 bytes

↔¤żY↔

Aceita convenientemente a entrada / saída como lista de dígitos, tente on-line ou verifique tudo!

Explicação

↔¤ż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

Execute e depure

Este programa recebe entrada como uma matriz de seqüências de caracteres.

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

Execute este

Esta é a primeira vez que vi um uso da instrução overlay "in the wild".



1

Pitão, 5 bytes

meSdC

Recebe entrada como matriz de duas seqüências de caracteres preenchidas com espaço.

meSd       map greatest
    C      on the transpose of input

Experimente aqui .



1

Ceilão, 55/99

Com seqüências de 0 ou espaço preenchidas do mesmo comprimento (retornando uma iterável de caracteres):

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

Com strings preenchidas com 0 ou espaço (retornando uma String):

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

Com cadeias de comprimento possivelmente diferente (retornando uma String):

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`.
¶.?

Experimente online! O link inclui o conjunto de testes. A versão anterior de Retina 1 de 45 bytes aceita cadeias de caracteres sem preenchimento:

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

Experimente online! O link inclui o conjunto de testes. Explicação:

P^`.+

Coloque os dois valores no mesmo comprimento. (Apenas Retina 1. Existem maneiras de emular isso na Retina 0.8.2, mas elas não são muito eficientes.)

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

Transponha os valores.

%O`.

Classifique cada par em ordem.

¶.?

Exclua todos os dígitos baixos e as novas linhas excedentes.


1

Carvão , 8 bytes

⭆θ⌈⟦ι§ηκ

Experimente online! Link é a versão detalhada do código. Explicação:

 θ          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

A versão de 10 bytes "adiciona" qualquer número de cadeias acolchoadas:

⭆§θ⁰⌈Eθ§λκ

Experimente online! Link é a versão detalhada do código. A versão anterior de 14 bytes aceita cadeias não preenchidas:

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

Experimente online! Link é a versão detalhada do código. Explicação:

  θ             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

A versão de 17 bytes "adiciona" qualquer número de strings:

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

Experimente online! Link é a versão detalhada do código.


A questão foi alterado para as cordas podem ser introduzidos como acolchoado
ASCII-only

Nitpicking, mas você perdeu um parêntese na primeira versão detalhada: P
somente ASCII

@ ASCII-only Se apenas TIO combinado parens para mim ;-)
Neil

0

Mathematica 50 bytes

a = 543; b = 791;

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

(* 793 *)


1
Você pode adicionar um TIO? Não conheço o Mathematica, mas suspeito que isso poderá falhar se as 2 entradas não tiverem um número igual de dígitos.
Shaggy

1
Eu acho que você está recebendo informações por meio de variáveis ​​predefinidas, o que tornaria este um trecho, o que não é permitido. As inscrições devem ser uma função ou um programa completo
Jo rei
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.