Dziwne dodawanie

19

Wyzwanie

Oblicz dziwną sumę dwóch liczb naturalnych (znanych również jako dodanie Księżyca):

Biorąc pod uwagę A=... a2 a1 a0i B=... b2 b1 b0dwie liczby naturalne zapisane w bazie dziesiętnej, dziwna suma jest definiowana, na podstawie maksymalnej operacji, jako: 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)

Wejście

Dwie liczby naturalne

Dozwolone są wszystkie następujące czynności:

  • Sznurki zerowane (ta sama długość)
  • Wyściełane struny po lewej stronie
  • Sznurki wyściełane spacją po prawej stronie
  • Zestaw dwóch wyściełanych sznurków
  • Dwuwymiarowa tablica znaków wypełniona przestrzenią

Wynik

Liczby naturalne

Przykład

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

Zasady

  • Dane wejściowe i wyjściowe można podawać w dowolnym dogodnym formacie (wybierz najbardziej odpowiedni format dla swojego języka / rozwiązania).
  • Nie trzeba obsługiwać wartości ujemnych ani nieprawidłowych danych wejściowych
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
mdahmoune
źródło
3
znany również jako dodatek księżycowy
TFeld
3
Czy możemy traktować dane wejściowe jako ciągi zerowane (ta sama długość)?
TFeld
1
Myślę, że to trochę zbyt trywialne. Dziwne, o co nie pytano wcześniej
Windmill Cookies
1
Czy możemy mieć liczby o tej samej długości? Jak 17210 00701 zamiast 17210 701?
Windmill Cookies
7
Nie widzę dokładnie, jakie formaty wejściowe są dozwolone. Format wejściowy jest bardzo ważny w tym wyzwaniu, ponieważ niektóre formaty umożliwiają znacznie łatwiejsze przetwarzanie. Co z poniższych jest dozwolone? 1) Sznurki zerowane (ta sama długość) 2) Sznurki lewe spowane 3) Sznurki lewe spacja. 4) Układ dwóch wyściełanych strun. 5) Dwuwymiarowa tablica znaków wypełniona spacją. Głosowanie na zakończenie i głosowanie na razie; Z radością usunę moje głosy po rozwiązaniu
Luis Mendo

Odpowiedzi:

7

R , 68 65 bajtów

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

Wypróbuj online!

Wprowadź jako liczby całkowite, wyślij jako listę cyfr.

Gdyby dozwolone było wypełnianie zer cyframi, wystarczyłoby po prostu pmax.

Giuseppe
źródło
6

MATL , 2 bajty

X>

Wybierz najbardziej odpowiedni format dla swojego języka / rozwiązania

Format wejściowy to: tablica znaków 2D z dwoma wierszami, każdy odpowiadający linii, z krótszą liczbą wypełnioną lewą spacją. Na przykład

17210
  701

który w MATL jest zdefiniowany jako

['17210'; '  701']

Wypróbuj online!

Wyjaśnienie

      % Implicit input: 2D char array with two rows 
X>    % Take maximum of (code points of) each column
      % Implicit display
Luis Mendo
źródło
5

Python 2 , 73 60 56 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako dwa ciągi znaków i zwraca listę cyfr


Alternatywny:

Pobiera dane wejściowe jako dwie liczby całkowite; ta sama wydajność

Python 2 , 60 59 bajtów

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

Wypróbuj online!

TFeld
źródło
5

Java 10, 78 57 bajtów

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

Wprowadź jako dwie tablice znaków wypełnione spacjami.

Zmienia pierwszą tablicę wejściową zamiast zwracać nową, aby zaoszczędzić 21 bajtów (dzięki @ OlivierGrégoire ).

Wypróbuj online.

Wyjaśnienie:

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`
Kevin Cruijssen
źródło
1
a->b->{for(int i=a.length;i-->0;)if(a[i]<b[i])a[i]=b[i];}( 57 bajtów ). Wykorzystaj ponownie ajako dane wyjściowe, aby uzyskać dużo, dużo bajtów.
Olivier Grégoire
@ OlivierGrégoire Ah, nie mogę uwierzyć, że o tym nie pomyślałem. Dzięki! : D
Kevin Cruijssen
4

Japt, 9 8 7 bajtów

Pobiera dane wejściowe jako tablicę tablic cyfrowych.

mÔÕÔËrw

Spróbuj

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

Jeśli przyjmowanie tablic wypełnionych zerami jako danych wejściowych jest dozwolone (obecnie mieści się w „wygodnym formacie”, ale podejrzewam, że nie jest to intencja osoby rzucającej wyzwanie), może to być 3 bajty.

íwV

Spróbuj

í       :Interleave the first input
  V     :With the second
 w      :Reduce each pair by maximum
Kudłaty
źródło
1
Oto kolejne 8 bajtowe rozwiązanie z inną strategią i prostszym formatem wejściowym. może z tego możesz ogolić bajt?
Kamil Drakari,
@KamilDrakari: Uncanny - Właśnie aktualizowałem dokładnie to samo rozwiązanie!
Kudłaty
Co ciekawe, wersja oddzielająca kroki „transponuj” i „zmniejsz” ma również 8 bajtów ze względu na lepsze skróty
Kamil Drakari
@KamilDrakari, och, mamy yteraz skrót ? Nie wiedziałem tego. Oto inny sposób , również 8 bajtów.
Shaggy
Och, to fajna sztuczka '. Nie wiem, czy to by kiedykolwiek zaoszczędziło bajtów, ale jest zdecydowanie fajne.
Kamil Drakari,
4

05AB1E , 9 6 5 bajtów

-3 dzięki Emigna
-1 dzięki Kudłaty

íζ€àR

Pobiera dane wejściowe jako listę list cyfr

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

Wypróbuj online! lub Wypróbuj wszystkie przypadki testowe

Riley
źródło
€Rmoże być í. Również nie sądzę, trzeba €þjaknumber > space
Emigna
@Emigna Thanks! Myślałem, że wypróbowałem to bez €þi nie zadziałało, ale teraz działa ...
Riley,
Czy potrzebujesz Jna końcu?
Shaggy
@Shaggy Nie, chyba nie. Dzięki!
Riley,
Jest kiepski, ale reguły pozwalają na rozwiązanie 3-bajtowe, biorąc tablicę
znaków z wypełnieniem
4

Perl 6 , 15 bajtów

{[~] [Zmax] $_}

Wypróbuj online!

Traktuje dane wejściowe jako listę wypełnionych spacjami tablic znaków, choć w przypadku tego wyzwania luźny format wprowadzania sprawia, że ​​jest to raczej nudne. Alternatywnie, oto program, który zamiast tego pobiera listę dwóch liczb całkowitych:

Perl 6 , 41 bajtów

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

Wypróbuj online!

Jeśli nie przeszkadza ci duża ilość białych znaków, możesz również usunąć + przód.

Wyjaśnienie:

{                                       }  # 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
Jo King
źródło
3

Haskell , 40 bajtów

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

Wejście / wyjście jako ciągi, spróbuj online!

Wyjaśnienie

Funkcja pzastępuje każdy znak spacją, używając, p b++aa p a++bzatem ma tę samą długość. W ten sposób możemy korzystać zipWithbez utraty elementów, używanie maxz nim działa, ponieważ (spacja) ma niższy punkt kodowy niż dowolny ze znaków ['0'..'9'].

ბიმო
źródło
3

JavaScript (ES6), 51 49 bajtów

Uwaga: Ta odpowiedź została opublikowana, zanim luźne formaty We / Wy zostały wyraźnie dozwolone. Przy zerowanych tablicach cyfr można to zrobić w 33 bajtach (ale jest o wiele mniej interesujące, IMHO).

Pobiera dane wejściowe jako dwie liczby całkowite. Zwraca liczbę całkowitą.

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

Wypróbuj online!

Skomentował

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

Alternatywna wersja

Ten sam format we / wy.

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

Wypróbuj online!

Arnauld
źródło
Możesz się znacznie skrócić, jeśli przyjmiesz, że twoją wejściową jest tablica znaków wypełniona spacją 2d.
kamoroso94,
Cześć! Czy możesz podać jakieś wyjaśnienie? „Próbowałem” wykonać to wyzwanie w JavaScript, ale nie udało mi się i chciałbym zobaczyć, jak działa twoje rozwiązanie :)
Neyt
1
@Neyt Dodałem skomentowaną wersję. Alternatywna wersja używa tej samej logiki; jedyną różnicą jest to, że dodajemy następną cyfrę po lewej stronie jako ciąg zamiast mnożenia wyniku wywołania rekurencyjnego przez 10.
Arnauld
@Arnauld Dziękujemy! :)
Neyt
2

Tcl , 156 bajtów

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)}] ""}

Wypróbuj online!

Niezbyt golfowy, ale musiałem spróbować. Gra w golfa później!

sergiol
źródło
Tcl, 159 bajtów Nieudany outgolf
sergiol
2

Partia, 120 bajtów

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

Pobiera dane wejściowe jako parametry wiersza polecenia. Wersja 188 bajtów działa na liczbach całkowitych o dowolnej długości:

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

Pobiera dane wejściowe na STDIN.

Neil
źródło
2

Gałązka , 125 bajtów

Kiedy zobaczyłem to wyzwanie, pomyślałem: „pozwól mi użyć języka szablonów! Na pewno dobrze pasuje”

Myliłem się ... tak źle .... ... Ale było fajnie!

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

Wymaga to ustawienia „strict_variables” na false (wartość domyślna).

Aby użyć tego makra, możesz wykonać następujące czynności:

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

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

Powinien wyświetlać 167.

Możesz tego spróbować w https://twigfiddle.com/rg0biy
(„strict_variables” jest wyłączone, domyślnie jest włączone na stronie)

Ismael Miguel
źródło
1

Łuska , 5 bajtów

↔¤żY↔

Dogodnie przyjmuje dane wejściowe / wyjściowe jako listę cyfr, spróbuj online lub sprawdź wszystko!

Wyjaśnienie

↔¤ż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]
ბიმო
źródło
1

Stax , 5 bajtów

|>E:o

Uruchom i debuguj

Ten program pobiera dane wejściowe jako tablicę ciągów.

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

Uruchom ten

Po raz pierwszy widziałem zastosowanie instrukcji nakładki „na wolności”.

rekurencyjny
źródło
1

Pyth, 5 bajtów

meSdC

Pobiera dane wejściowe jako tablicę dwóch łańcuchów wypełnionych spacją.

meSd       map greatest
    C      on the transpose of input

Wypróbuj tutaj .

lirtosiast
źródło
1

Ceylon, 55/99

Z ciągami 0 lub znakami spacji o tej samej długości (zwracanie iterowalnych znaków):

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

W przypadku łańcuchów 0 lub spacji (zwracanie ciągu):

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

Z ciągami o możliwie różnej długości (zwracanie ciągu):

String u(String a,String b)=>String(zipPairs(a.padLeading(b.size),b.padLeading(a.size)).map(max));
Paŭlo Ebermann
źródło
1

Rubin , 25 bajtów

->a,b{a.zip(b).map &:max}

Wypróbuj online!

Lista wstępnie wypełniona bla bla. (Chociaż to trochę przypomina oszustwo).

GB
źródło
1

Retina 0.8.2 , 39 bajtów

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

Wypróbuj online! Link zawiera pakiet testowy. Poprzednia 45-bajtowa wersja Retina 1 akceptuje niepasowane ciągi:

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

Wypróbuj online! Link zawiera pakiet testowy. Wyjaśnienie:

P^`.+

Wypełnij obie wartości do tej samej długości. (Tylko Retina 1. Istnieją sposoby naśladowania tego w Retina 0.8.2, ale nie są bardzo golfowe.)

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

Transponuj wartości.

%O`.

Posortuj każdą parę w kolejności.

¶.?

Usuń wszystkie niskie cyfry i nadmiarowe znaki nowej linii.

Neil
źródło
1

Węgiel , 8 bajtów

⭆θ⌈⟦ι§ηκ

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

 θ          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

Wersja 10-bajtowa „dodaje” dowolną liczbę dopełnionych ciągów:

⭆§θ⁰⌈Eθ§λκ

Wypróbuj online! Link jest do pełnej wersji kodu. Poprzednia 14-bajtowa wersja akceptuje niepasowane ciągi:

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

  θ             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

Wersja 17-bajtowa „dodaje” dowolną liczbę ciągów:

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

Wypróbuj online! Link jest do pełnej wersji kodu.

Neil
źródło
Pytanie zostało zmienione, aby ciągi mogły być wprowadzane jako wypełnione
tylko ASCII
Nitpicking, ale przegapiłeś bliski paren w pierwszej pełnej wersji: P
tylko ASCII
@ Tylko ASCII Gdyby tylko TIO pasowało do mnie parens ;-)
Neil
0

Mathematica 50 bajtów

a = 543; b = 791;

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

(* 793 *)

David G. Stork
źródło
1
Czy możesz dodać TIO? Nie znam Mathematiki, ale podejrzewam, że to może się nie powieść, jeśli 2 wejścia nie mają równej liczby cyfr.
Shaggy
1
Myślę, że pobierasz dane wejściowe za pomocą predefiniowanych zmiennych, co czyni z tego fragment kodu, co jest niedozwolone. Zgłoszenia powinny być funkcją lub pełnym programem
Jo King