Дивне доповнення


19

Виклик

Обчисліть дивну суму двох натуральних чисел (також відомих як додавання місячних):

Дано A=... a2 a1 a0і B=... b2 b1 b0два натуральних числа, записаних у десятковій основі, дивна сума визначається, виходячи з максимальної операції, як: 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)

Вхідні дані

Два натуральних числа

Дозволено все наступне:

  • Нанизані струни (однакова довжина)
  • Підбиті рядом з місцями рядки
  • Нанизані на правий простір пасма
  • Масив з двох прокладених рядків
  • 2D-матричний діапазон char

Вихідні дані

Натуральні числа

Приклад

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

Правила

  • Введення та вихід можуть бути надані у будь-якому зручному форматі (виберіть найбільш відповідний формат для вашої мови / рішення).
  • Не потрібно обробляти негативні значення або недійсні дані
  • Прийнятна або повна програма, або функція. Якщо функція, ви можете повернути вихід, а не надрукувати його.
  • Якщо можливо, додайте посилання на онлайн-тестувальне середовище, щоб інші люди могли спробувати ваш код!
  • Стандартні лазівки заборонені.
  • Це тому діють усі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

3
також відомий як додаток до місячних
TFeld

3
Чи можемо ми сприймати дані як рядки з нульовим накладом (однакової довжини)?
TFeld

1
Я думаю, це трохи надто банально. Дивно, що раніше не просили
Cookie Windmill

1
Чи можемо ми мати однакову довжину? Як 17210 00701 замість 17210 701?
Ветряні куки

7
Я не бачу, які саме формати введення дозволені. Формат введення дуже важливий у цьому виклику, оскільки деякі формати дозволяють набагато простіше обробити. Що з наступного дозволено? 1) Рядки з нульовою оббивкою (однакова довжина) 2) Струни з оббивкою з лівого пробілу 3) Струни з підкладкою з пробілом. 4) Масив з двох прокладених рядків. 5) 2D-матричний діапазон char. Голосування про закриття та заборону на даний момент; Я з радістю видаляю свої голоси, коли вирішуватимуться
Луїс Мендо

Відповіді:




7

R , 68 65 байт

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

Спробуйте в Інтернеті!

Введіть як цілі числа, виведіть у вигляді списку цифр.

Якщо дозволені списки цифр дозволені, просто pmaxвистачить.


6

MATL , 2 байти

X>

Виберіть найбільш відповідний формат для вашої мови / рішення

Формат введення - це двовимірний масив із двох рядків, кожен з яких відповідає рядку, з меншою лівою лінією з пробілами. Наприклад

17210
  701

який у MATL визначається як

['17210'; '  701']

Спробуйте в Інтернеті!

Пояснення

      % 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 байт

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

Спробуйте в Інтернеті!

Приймає введення у вигляді двох рядків і повертає список цифр


Альтернатива:

Приймає введення як два цілих числа; той же вихід

Python 2 , 60 59 байт

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

Спробуйте в Інтернеті!


5

Java 10, 78 57 байт

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

Введіть як два масиви символів з пробілами.

Змінює перший вхідний масив замість повернення нового, щоб зберегти 21 байт (завдяки @ OlivierGrégoire ).

Спробуйте в Інтернеті.

Пояснення:

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 байт ). Використовуйте aяк вихід, щоб отримати багато, багато байт.
Олів’є Грегоар

@ OlivierGrégoire Ах, не можу повірити, що я не думав про це. Спасибі! : D
Кевін Круїссен

4

J , 14 12 байт

-2 байти завдяки Йона

(>./@,:)&.|.

Спробуйте в Інтернеті!

Введення та вихід у вигляді списку цифр



1
@Jonah Звичайно! Дякую!
Гален Іванов

1
якщо ви шукаєте виклик, подивіться, чи зможете ви покращити цю жахливість: codegolf.stackexchange.com/a/175968/15469
Йона

4

Япт, 9 8 7 байт

Вводить дані як масив цифрових масивів.

mÔÕÔËrw

Спробуй це

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

Якщо використовувати вхідні масиви з нульовими масивами дозволено (це в даний час підпадає під "зручний формат", але я підозрюю, що це не наміри претендента), то це може бути 3 байти.

íwV

Спробуй це

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

1
Ось ще 8-байтне рішення з іншою стратегією та більш простим форматом введення. може, ти можеш з цього поголити байт?
Каміль Дракарі

@KamilDrakari: Uncanny - я тільки оновлювався точно таким же рішенням!
Кудлатий

Цікаво, що версія, яка розділяє кроки "транспоніровать" та "зменшити", також становить 8 байт через кращі ярлики
Каміль Дракарі

@KamilDrakari, о, у нас зараз є ярлик y? Я не знаю, що. Ось ще один спосіб , також 8 байт.
Кудлатий

О, це акуратний трюк '. Я не знаю, чи це колись збереже байти, але це, безумовно, круто.
Каміль Дракарі


4

05AB1E , 9 6 5 байт

-3 завдяки Еміньї
-1 завдяки Шаггі

íζ€àR

Вводиться як список списків цифр

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

Спробуйте в Інтернеті! або Спробуйте всі тестові приклади


€Rможе бути í. Крім того , я не думаю , що вам потрібно , €þякnumber > space
Emigna

@Emigna Дякую! Я думав, що спробував це без нього, €þі це не вийшло, але тепер це виходить ...
Райлі

Вам потрібен Jкінець?
Shaggy

@Shaggy Ні, я думаю, я цього не роблю. Спасибі!
Райлі

Це кульгаво, але правила дозволяють вирішити 3-байтові рішення , взявши 2D-матричний
діапазон

4

Perl 6 , 15 байт

{[~] [Zmax] $_}

Спробуйте в Інтернеті!

Вважає вхідні дані як список прокладених пробілами масивів символів, хоча для цього виклик формат введення в'ялості робить його досить нудним. Окрім того, ось програма, яка замість цього містить список двох цілих чисел:

Perl 6 , 41 байт

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

Спробуйте в Інтернеті!

Якщо ви не заперечуєте проти великої кількості пробілів, ви також можете видалити + з передньої частини.

Пояснення:

{                                       }  # 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 байт

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

Введення / виведення як рядки, спробуйте в Інтернеті!

Пояснення

Функція pзамінює кожен символ пробілом, використовуючи p b++aі p a++b, таким чином, однакову довжину. Таким чином ми можемо використовувати, zipWithне втрачаючи жодних елементів, використання maxз ним працює, тому що (пробіл) має нижчу кодову точку, ніж будь-який із символів ['0'..'9'].


3

JavaScript (ES6), 51 49 байт

NB: Ця відповідь була розміщена до того, як вільні формати вводу / виводу були явно дозволені. З нульовими масивами цифр це можна зробити в 33 байтах , (але набагато менш цікаво, IMHO).

Вводиться як два цілих числа. Повертає ціле число.

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

Спробуйте в Інтернеті!

Прокоментував

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

Альтернативна версія

Той самий формат вводу / виводу

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

Спробуйте в Інтернеті!


Ви можете отримати набагато коротше, якщо вважати, що ваш вхід є 2-пробірковим масивом.
kamoroso94

Привіт! Не могли б ви дати пояснення? Я "" спробував "" зробити це завдання в JavaScript, але я не зміг і хотів би побачити, як працює ваше рішення :)
Нейт

1
@Neyt Я додав коментовану версію. Альтернативна версія використовує ту саму логіку; Єдина відмінність полягає в тому, що ми додаємо наступну цифру ліворуч як рядок, а не множимо результат рекурсивного виклику на 10.
Арнольд

@Arnauld Дякую! :)
Нейт


2

Пакетна, 120 байт

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

Приймає введення як параметри командного рядка. 188-байтна версія працює на цілі числа довільної довжини:

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

Здійснює введення даних STDIN.


2

Гілочка , 125 байт

Коли я побачив цей виклик, я хоч: "дозвольте використовувати мову шаблонів! Впевнений, що це добре"

Я помилявся ... так неправильно .... ... Але було весело!

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

Для цього потрібно встановити "строкі_змінні" false значення (значення за замовчуванням).

Щоб використовувати цей макрос, ви можете зробити так:

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

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

Потрібно відображати 167.

Ви можете спробувати це на веб-сайті https://twigfiddle.com/rg0biy
("строгі_варіабелі" встановлено, він вимкнено на веб-сайті)



1

Стакс , 5 байт

|>E:o

Запустіть і налагоджуйте його

Ця програма приймає введення як масив рядків.

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

Виконати цей

Це перший раз, коли я бачив використання накладної інструкції "в дикій природі".



1

Pyth, 5 байт

meSdC

Приймає вхід як масив двох рядків з пробілами.

meSd       map greatest
    C      on the transpose of input

Спробуйте тут .



1

Цейлон, 55/99

З рядками, розміщеними в 0 або пробілом, однакової довжини (повернення ітерабельних символів):

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

Із рядками, заповненими пробілами, або з пробілом (повернення рядка):

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

З рядками, можливо, різної довжини (повернення рядка):

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



1

Сітківка 0,8,2 , 39 байт

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

Спробуйте в Інтернеті! Посилання включає тестовий набір. Попередня 45-байтна версія Retina 1 приймає нерозкладені рядки:

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

Спробуйте в Інтернеті! Посилання включає тестовий набір. Пояснення:

P^`.+

Прокладіть обидва значення на однакову довжину. (Тільки сітківка 1. Існують способи емуляції цього в Retina 0.8.2, але вони не дуже голі.)

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

Перенесіть значення.

%O`.

Сортуйте кожну пару в порядку.

¶.?

Видаліть всі низькі цифри та надлишки нових рядків.


1

Вугілля деревне , 8 байт

⭆θ⌈⟦ι§ηκ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

 θ          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

10-байтна версія "додає" будь-яку кількість прокладених рядків:

⭆§θ⁰⌈Eθ§λκ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Попередня 14-байтна версія приймає нерозкладені рядки:

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

  θ             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

17-байтна версія "додає" будь-яку кількість рядків:

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду.


Питання було змінено, тому рядки можна вводити як підшиті
лише для ASCII

Нітчікінг, але ви пропустили близького батьків у першій вербольній версії: P
ASCII лише

@ ASCII-тільки Якби тільки TIO відповідав паренам для мене ;-)
Ніл

0

Mathematica 50 байт

a = 543; b = 791;

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

(* 793 *)


1
Чи можете ви додати TIO? Я не знаю Mathematica, але я підозрюю, що це може вийти з ладу, якщо два входи не мають однакової кількості цифр.
Кудлатий

1
Я думаю, ви приймаєте дані через заздалегідь задані змінні, які б зробили цей фрагмент, який заборонено. Подання повинні бути або функцією, або повноцінною програмою
Jo King
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.