Додайте два числа


44

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

Вихід: Їх сума. Використовуйте той же формат для цілих вихідних чисел, що і цілі вхідні. Наприклад, введення 5 16призведе до виводу 21.

Обмеження: Немає стандартних лазівки. Це , відповідь на найменшу кількість байт виграшів.

Примітки. Це має бути досить тривіально, проте мені цікаво подивитися, як це можна реалізувати. Відповідь може бути повною програмою або функцією, але будь-ласка, визначте, яка вона є.

Тестові приклади:

1 2 -> 3
14 15 -> 29
7 9 -> 16
-1 8 -> 7
8 -9 -> -1
-8 -9 -> -17

Або як CSV:

a,b,c
1,2,3
14,15,29
7,9,16
-1,8,7
8,-9,-1
-8,-9,-17

Таблиця лідерів


26
Це досить тривіально, але не дуже просто, ніж, наприклад, каталог Hello World. Зважаючи на те, що можливість додавання цілих чисел є однією з наших двох вимог до мов програмування, я б сказав, що це потрібно, якщо правильно вказано.
Денніс

1
Чи може відповідь приймати вклад із попередніми нулями за замовчуванням? Наприклад 5 16, 005 016
вводиться

@FinW Звичайно. Поки вони не трактуються як восьмигранні.
dkudriavtsev

Відповіді:



66

Minecraft 1.10, 221 персонаж (неконкурентоспроможний)

Дивіться, з цим ми маємо мати справу, коли робимо карти Minecraft.

Убік: у Minecraft немає способу взяти рядок, тому я трохи обманюю, змушуючи вас вводити цифри в саму програму. (Це дещо виправдано, оскільки досить багато карт, як, наприклад, Minecraft Bingo Lorgon111, вимагають від вас скопіювати та вставити команди в чат, щоб ввести число.)

Дякуємо вам, що за фільтр MCEdit блоку міток .

а

scoreboard objectives add a dummy
scoreboard players set m a 6
scoreboard players set n a 8
scoreboard players operation r a += m a
scoreboard players operation r a += n a
tellraw @a {"score":{"name":"r","objective":"a"}}

Неконкурентований через труднощі при введенні, і я не маю уявлення, як рахувати байти в цій справі (система бітів недосконала для командних блоків).


4
Це, безумовно, найкращий. Дивовижний.
dkudriavtsev

Я не думаю, що жорстке кодування входів є дійсним, але я не знаю достатньо про командні блоки в Minecraft, щоб можна було судити, чи є спосіб взяти введення, крім жорсткого кодування. Можливо, хтось із наших резидентів Minecraft міг зважити.
Mego

3
Так, в МС немає введення тексту, окрім "скопіюйте та вставте цю команду". Цифрова клавіатура можлива за допомогою / Tellraw, але вона буде ледве корисною для всіх гольфів, не кажучи вже про 500 Кб завдяки нецензурному синтаксису / Tellraw. Я думаю, альтернативою було б порахувати щось у світі, як свині + корови, або червона шерсть + синя шерсть.
quat

1
@quat Оскільки ми зазвичай використовуємо бункер для підрахунку речей у Minecraft, я здогадуюсь, це був би шлях. Інший спосіб впоратися з цим можна було б зробити і в чистому червоному камені, використовуючи важелі. Оскільки у нас немає обмежень, і біт є найбільшою природною цінністю, доступною в Minecraft, це призведе до простого додавання двох біт з виходом у два біти (можливість:. 0,1,2Іншим рішенням було б взяти в 2 байти і вихід на 9 проводів, але був би набагато менше гофрований
Katenkyo


39

Двійкове обчислення лямбда , 4,125 байт

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

00000000 01011111 01100101 11101101 0

У лямбдальному обчисленні вона дорівнює λ m . λ n . λ f . λ x . m f ( n f x ).

Індекс Де Бруйна : λ λ λ λ 4 2 (3 2 1)


Обчислення лямбда - це стислий спосіб опису відображення (функції).

Наприклад, це завдання можна записати як λ x . λ у . х + у

Варто зазначити, що це не лямбда (функція), яка бере два аргументи. Це насправді вкладена лямбда. Однак він поводиться як лямбда, який бере два аргументи, тому його можна неофіційно описати як такого. Кожна лямбда формально бере лише один аргумент.

Наприклад, якщо застосувати цю лямбда до 3 та 4:

x . λ y . x + y ) 3 4 ≡ (λ y . 3 + y ) 4 ≡ 3 + 4 = 7

Отже, перша лямбда фактично повертає іншу лямбда.


Церковні цифри - це спосіб усунення зайвих знаків, залишаючи лише лямбда-символи та змінні.

Кожне число в системі Церкви - це лямбда, який визначає, скільки разів функція застосовується до елемента.

Нехай функція буде f, а пункт - x .

Отже, число 1 відповідало б λ f . λ x . f x , що означає застосувати f до x рівно один раз.

Наприклад, число 3 буде λ f . λ x . f ( f ( f x )), що означає застосувати f до x рівно три рази.


Тому для додавання двох церковних цифр (скажімо, m і n ) разом, це те саме, що застосовувати f до x , m + n разів.

Ми можемо спостерігати, що це те саме, що спочатку застосувати f до x , n разів, а потім застосувати f до отриманого елемента m разів.

Наприклад, 2 означало б, f(f(x))а 3 означало б, значить f(f(f(x))), 2 + 3 було б f(f(f(f(f(x))))).

Щоб застосувати f до x , n разів, маємо n f x .

Ви можете розглядати m і n як функції, що беруть два аргументи, неофіційно.

Потім ми знову застосовуємо f до цього результату, m разів: m f ( n f x ).

Потім ми додаємо назад котельну плиту, щоб отримати λ м . λ n . λ f . λ x . m f ( n f x ).


Тепер ми повинні перетворити його в індекс De Bruijn .

По-перше, ми рахуємо "відносну відстань" між кожною змінною до лямбда-декларації. Наприклад, m мала б відстань у 4, тому що це оголошено 4 лямбда "тому". Аналогічно, n мав би відстань 3, f мала б відстань 2, а x мала б відстань 1.

Отже, записуємо його як цю проміжну форму: λ m . λ n . λ f . λ x . 4 2 (3 2 1)

Потім ми видаляємо декларації змінної, залишаючи нам: λ λ λ λ 4 2 (3 2 1)


Тепер ми перетворюємо це на двійкове обчислення лямбда .

Правила такі:

  • λ стає 00.
  • m n (групування) стає 01 m n.
  • числа i стає 1 i разів + 0, наприклад 4 стає 11110.

λ λ λ λ 4 2 (3 2 1)

≡ λ λ λ λ 11110 110( 1110 110 10)

≡ λ λ λ λ 11110 110 0101 111011010

≡ λ λ λ λ 0101 111101100101111011010

00 00 00 00 0101 111101100101 111011010

000000000101111101100101111011010


18
Я хотів би побачити вихідний файл 4.125 байт, який ви передаєте інтерпретатору / компілятору.
Мартін Ендер

8
@MartinEnder Скажіть це на кожну відповідь тут .
Leaky Nun

5
Я хотів би побачити рішення 0,875 байт.
Містер Лістер

3
За мета-консенсусом , якщо ви не можете зберігати програму як файл з частковою кількістю байтів, вам доведеться округлювати.
Павло

24

Лист звичайний, 15 байт

(+(read)(read))

2
Ласкаво просимо до головоломки програмування та коду для гольфу!
Денніс

Я відносно незнайомий з CLisp, але чи можна було б видалити пробіли? (+(read)(read))
Mego

@Mego Ви маєте рацію, можливо. Я цього не знав, бо я теж новачок у Common Lisp, дякую за інформацію! Я редагував джерело
Byeonggon Lee

3
Я здогадуюсь, ми обидва щось тут навчились! Ласкаво просимо на борт до PPCG!
Mego

21

Стек котів , 8 + 4 = 12 байт

]_:]_!<X

Біжи з -mnпрапорами. Спробуйте в Інтернеті!

Гольфінг у Стек Котів є дуже протиінтуїтивним, тому ця програма вище була знайдена за кілька днів жорстокого форсування. Для порівняння, більш інтуїтивне, написане людиною рішення, використовуючи *(...)>шаблон, на два байти довше

*(>-_:[:)>

-lnнатомість із прапорами (пояснення див. у нижній частині цієї публікації).

Пояснення

Ось праймер на Stack Cats:

  • Stack Cats - це оборотна езотерична мова, де дзеркало фрагмента скасовує ефект оригінального фрагмента. Програми також повинні мати дзеркальні зображення самі по собі - це обов'язково це означає, що програми парної довжини є або без опірів, або нескінченними циклами, а всі нетривіальні закінчувальні програми мають непарну довжину (і по суті є сполученням центрального оператора).
  • Оскільки половина програми завжди мається на увазі, одна половина може залишатися поза прапором -mабо -l. Тут використовується -mпрапор, тому половина програми вище насправді розширюється на ]_:]_!<X>!_[:_[.
  • Як випливає з назви, Stack Cats базується на стеці, стеки мають бездонні нулі (тобто операції над поверненням порожнього стека 0). Стек Кішки на насправді використовує стрічку стеків, наприклад , <і >перемістити один стек вліво і один стек вправо відповідно.
  • Нулі в нижній частині стека ковтають / видаляють.
  • Весь вхід висувається на початковий стек входу, при цьому перший вхід вгорі і додатковий -1 нижче останнього входу. Виведення відбувається в кінці, використовуючи вміст поточного стеку (при необхідності -1 внизу ігнорується). -nпозначає числовий ввід / вивід.

А ось і розширена повна програма ]_:]_!<X>!_[:_[:

    Initial state (* denotes current stack):
      ... [] [-1 b a]* [] [] ...
]   Move one stack right, taking the top element with you
      ... [] [-1 b] [a]* [] ...
_   Reversible subtraction, performing [x y] -> [x x-y] (uses an implicit zero here)
      ... [] [-1 b] [-a]* [] ...
:   Swap top two
      ... [] [-1 b] [-a 0]* [] ...
]   Move one stack right, taking the top element with you
      ... [] [-1 b] [-a] []* ...
_   Reversible subtraction (0-0, so no-op here)
!   Bit flip top element, x -> -x-1
      ... [] [-1 b] [-a] [-1]* ...
<   Move one stack left
      ... [] [-1 b] [-a]* [-1] ...
X   Swap the stack to the left and right
      ... [] [-1] [-a]* [-1 b] ...
>   Move one stack right
      ... [] [-1] [-a] [-1 b]* ...
!   Bit flip
      ... [] [-1] [-a] [-1 -b-1]* ...
_   Reversible subtraction
      ... [] [-1] [-a] [-1 b]* ...
[   Move one stack left, taking the top element with you
      ... [] [-1] [-a b]* [-1] ...
:   Swap top two
      ... [] [-1] [b -a]* [-1] ...
_   Reversible subtraction
      ... [] [-1] [b a+b]* [-1] ...
[   Move one stack left, taking the top element with you
      ... [] [-1 a+b]* [b] [-1] ...

a+bПотім виводиться, при цьому база -1 ігнорується. Зауважте, що найвибагливіша частина цього рішення полягає в тому, що стек виводу повинен мати а -1внизу, інакше стек виводу просто [-1]ігнорує базовий -1, а вихідний стек [0]викликає проковтування базового нуля (але вихід Стек [2], наприклад, вийшов би 2чудово).


Для задоволення, ось повний список пов'язаних рішень однакової довжини (список може бути не повним):

]_:]^!<X
]_:]_!<X
]_:]!^<X
]_:!]^<X
[_:[^!>X
[_:[_!>X
[_:[!^>X
[_:![^>X

*(>-_:[:)>Рішення більше, але більш інтуїтивний писати , так як він використовує *(...)>шаблон. Цей шаблон розширюється, <(...)*(...)>коли використовується з -lпрапором, що означає:

<       Move one stack left
(...)   Loop - enter if the top is positive and exit when the top is next positive again
        Since the stack to the left is initially empty, this is a no-op (top is 0)
*       XOR with 1 - top of stack is now 1
(...)   Another loop, this time actually run
>       Move one stack right

Таким чином, *(...)>шаблон означає, що перший цикл пропускається, але другий виконується. Це дозволяє простіше програмувати, оскільки нам не потрібно турбуватися про ефекти циклу в другій половині програми.

У цьому випадку внутрішня частина петлі:

>       Move one stack right, to the input stack
-       Negate top, [-1 b a] -> [-1 b -a]
_       Reversible subtraction, [-1 b -a] -> [-1 b a+b]
:       Swap top two, [-1 b a+b] -> [-1 a+b b]
[       Move one stack left, taking top of stack with you (removing the top b)
:       Swap top two, putting the 1 on this stack on top again

Потім фінал >шаблону повертає нас до вхідного стеку, де a+bвиводиться.


19

Мозок-колба , 6 байт

({}{})

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

Brain-flak - це дійсно цікава мова з двома основними обмеженнями на неї.

  1. Єдиними дійсними символами є дужки, тобто будь-який з цих символів:

    (){}[]<>
    
  2. Кожен окремий набір дужок повинен повністю відповідати, інакше програма недійсна.

Набір дужок, що між ними нічого немає, називається «ниладом». Найлад створює певне числове значення, і всі ці нілади поруч один з одним складаються. Набір дужок з чимось між ними називається "монадою". Монада - це функція, яка приймає числовий аргумент. Тож дужки всередині монади оцінюються, і це є аргументом для монади. Ось більш конкретний приклад.

() Nilad дорівнює 1. Отже наступний мозку зенітної код:

()()()

Оцінюється до 3. () Монада висуває значення всередині неї на глобальний стек. Тож наступне

(()()())

штовхає 3. 3. {}Найлад вискакує значення у верхній частині стека. Оскільки послідовні нилади завжди додаються, рядок {}підсумовує всі верхні елементи на стеку. Отже, мій код по суті:

push(pop() + pop())

15

Minecraft 1.10.x, 924 512 байт

Завдяки @ quat за зменшення кількості рахунків на 48 пунктів, а кількість рахунків - на 412.

Гаразд, тому я взяв деякі ідеї з цієї відповіді і зробив власну версію, за винятком того, що ця здатна прийняти негативний вклад. Варіант можна знайти тут в форматі структури блоку.

групи

(нова версія виглядає трохи нудною tbh)

Аналогічні команди, як і інші відповіді:

scoreboard objectives add a dummy
execute @e[type=Pig] ~ ~ ~ scoreboard players add m a 1
execute @e[type=Cow] ~ ~ ~ scoreboard players add n a 1
scoreboard players operation n a += m a
tellraw @a {"score":{"name":"n","objective":"a"}}

Для введення чисельності, нерестується кількість корів і свиней. Корови представлятимуть значення "n", а свині представлятимуть значення "m". Система командного блоку буде поступово вбивати корів та свиней та призначати значення за необхідності.

Ця відповідь передбачає, що ви перебуваєте у світі, де немає корів або свиней, що зустрічаються в природі, і що значення, збережені в "n" і "m", очищаються при кожному пробігу.


Для від'ємних цілих чисел ви можете використовувати 2 інших видів тварин як "неганімалів" - 5 коней, наприклад, -5
Mego

@Mego Тоді це було б чотири входи, а не 2.
Addison Crump

Все одно це буде два входи - це еквівалент використання доповнення двох для від'ємних чисел. Трохи інший формат, але все ж один вхід. Принаймні, це мої два центи.
Mego

Можливо, ви зможете економити на блоках за допомогою execute @e[type=Pig] ~ ~ ~ scoreboard players add m a 1, тому вам не потрібна форма годинника.
quat

@quat О-о. Приємно.
Аддісон Кримп

14

Сітківка , 42 байти

\d+
$*
T`1p`-_` |-1+
+`.\b.

^(-)?.*
$1$.&

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

Пояснення

Додавання чисел в одинарні - це найпростіша річ у світі, але як тільки ви введете від’ємні числа, речі стають невиразними…

\d+
$*

Почнемо з перетворення чисел в одинакові. Це робиться шляхом зіставлення кожного числа з \d+і заміни його на $*. Це особливість заміщення для сітківки. Повний синтаксис є count$*characterта вставляє countкопії character. Обидва ці пункти можуть бути опущені там, де countза замовчуванням $&(тобто самому збігу) та characterза замовчуванням до 1. Таким чином, для кожного входу nми отримуємо nїх, і ми все ще маємо потенційні знаки мінус, а також роздільник пробілу. Наприклад, введення 8 -5дає:

11111111 -11111

Тепер для розгляду негативних чисел найпростіше використовувати окрему -1цифру. Ми будемо використовувати -для цієї мети.

T`1p`-_` |-1+

Цей етап робить дві речі. Він позбавляється від простору, провідних знаків мінусу і перетворює 1s після знака мінус у -себе. Це робиться шляхом зіставлення |-1+(тобто або пробілу, або від’ємного числа) та проведення транслітерації на ньому. Транслітерації йдуть від 1pдо -_, але тут, pрозширюються до всіх друкованих символів ASCII і _засоби видалення. Тож 1s у цих матчах перетворюється на -s, а мінуси та пробіли знімаються. Наш приклад зараз виглядає так:

11111111-----
+`.\b.

На цьому етапі обробляється випадок, коли на вході є одне додатне і одне від’ємне число. Якщо так, в рядку будуть 1s і -s, і ми хочемо, щоб вони скасували. Це робиться шляхом зіставлення двох символів з межею слова між ними (оскільки 1s вважається символом слова, а -не є), і заміною відповідності нічим. У +інструктує Retina зробити це кілька разів , поки рядок не перестане змінюватися.

Тепер у нас залишилися лише 1 s або тільки - s.

^(-)?.*
$1$.&

Щоб перетворити це назад у десятковий, ми узгоджуємо весь вхід, але, якщо можливо, ми фіксуємо а -в групу 1. Ми записуємо групу назад 1(для додавання -до від'ємних чисел), а потім записуємо назад довжину відповідності $.&(також функція заміщення, характерна для Retina).


2
Це дуже розумно.
Mego

Тепер якби був простой спосіб реалізувати rangeв Retina. Я кілька разів пробував, але негативи - це біль.
mbomb007

Щоб додати два числа цією мовою, потрібно понад 40 байт ??
dkudriavtsev

2
@DmitryKudriavtsev добре, у Retina немає поняття чисел ...
Martin Ender

@DmitryKudriavtsev, і це просто цілі числа ....
msh210

14

Доміно , 38 000 байт або 37 плиток

Це створено в настільному симуляторі . Ось відео і ось файл . Це стандартний наполовину суматор, що складається з andворіт для 2^1значення місця і xorворота для 2^0значення місця.

введіть тут опис зображення

Деталі

  • I / O
    • Початок - це включено для ясності (не зараховується до загальної кількості) і є тим, що "викликає" або "виконує" функцію. Потрібно натиснути після введення [Жовтий] .
    • Введення A - Це включено для ясності (не зараховується до загальної кількості) і "натискається", щоб вказати a, 1і не було натиснуто для 0 [Green] .
    • Введення B - Це включено для ясності (не зараховується до загальної кількості) і "натискається", щоб вказати а, 1і не було натиснуто для 0 [Синій] .
    • Вихід - Це зараховується до загальної суми. Ці доміно декларують суму. Зліва 2^1і праворуч 2^0 [Чорний] .
  • Натискання
    • Для того, щоб дати вхід або запустити ланцюг, нереститься металевий мармур
    • Встановіть силу підйому на 100%
    • Підніміть мармур над потрібним доміно
    • Кинь мармур

1
... як?
dkudriavtsev

4
@Mendeleev Коли ви маєте всі двійкові логічні ворота , все інше стає на місце xD.
нелінійний

10

Хаскелл, 3 байти

(+)

Дужки тут знаходяться, тому що це має бути функцією префікса. Це те саме, що взяти розділ функції +, але аргументи не застосовуються. Він також працює на широкому спектрі типів, таких як правильно реалізовані Вектори, Матриці, Комплексні числа, Поплавці, Парні, Раціональні та, звичайно, Цілі.

Оскільки це Haskell, ось як це зробити на рівні типу. Це буде зроблено під час компіляції замість часу виконання:

-- This *type* represents Zero
data Zero
-- This *type* represents any other number by saying what number it is a successor to.
-- For example: One is (Succ Zero) and Two is (Succ (Succ Zero))
data Succ a

-- a + b = c, if you have a and b, you can find c, and if you have a and c you can find b (This gives subtraction automatically!)
class Add a b c | a b -> c, a c -> b

-- 0 + n = n 
instance Add Zero n n
-- If (a + b = c) then ((a + 1) + b = (c + 1))
instance (Add a b c) => Add (Succ a) b (Succ c)

Код адаптований з Haskell Wiki


3
цікавий факт: це поліглот з
Чеддаром

10

Математика, 4 2 байти

Tr

Закреслений 4 все ще є регулярним 4 ... Tr застосований до одновимірного списку приймає суму елементів зазначеного списку.


9

DC, 2 байти

+f

Додає два найпопулярніших елементів у стеці (раніше взятих з stdin), а потім скидає вміст стека в stdout.

EDIT: Після подальшого розгляду, мабуть, існує кілька способів цього здійснити, залежно від бажаної поведінки вводу / виводу.

+        # adds top two items and pushes on stack
+n       # adds top two and prints it, no newline, popping it from stack
+dn      # ditto, except leaves result on stack
??+      # takes two inputs from stdin before adding, leaving sum on stack

Я думаю, найповнішою формою для суми була б така:

??+p     # takes two inputs, adds, 'peeks'
         #  (prints top value with newline and leaves result on stack)

Зачекайте! На одному рядку можна взяти два числа, розділені пробілом! Це дає нам:

?+p

Я не бачу, як використовувати перший приклад +f, dc -e "?+p"тут добре працює.
Ясен

1
@Jasen +fВерсія працює, якщо ви вже поставили (рівно два) числа в стек. Я насправді не знав, чи dcповинен бути I / O std(in|out)чи стек. Зрештою, це був найменш розумний варіант поставити у верхній частині посади. : /
Джо

правила кажуть, що стек у порядку, наскільки я можу сказати,
Ясен

9

Мова програмування Шекспіра , 155 152 байт

.
Ajax,.
Ford,.
Act I:.
Scene I:.
[Enter Ajax and Ford]
Ajax:
Listen to thy heart
Ford:
Listen to THY heart!You is sum you and I.Open thy heart
[Exeunt]

Безголівки:

Summing Two Numbers in Verona.

Romeo, a numerical man.
Juliet, his lover and numerical counterpart.

Act I: In which Italian addition is performed.

Scene I: In which our two young lovers have a short chat.

[Enter Romeo and Juliet]

Romeo:
  Listen to thy heart.

Juliet:
  Listen to THY heart! Thou art the sum of thyself and I. Open thy heart.

[Exeunt]

Для компіляції я використовую компілятор SPL drsam94 . Перевіряти:

$ python splc.py sum.spl > sum.c
$ gcc sum.c -o sum.exe
$ echo -e "5\n16" | ./sum
21



7

PHP, 20 байт

Дивно цього разу:

<?=array_sum($argv);

Запускається з командного рядка, наприклад:

$ php sum.php 1 2

Ваш сценарій також приймає, php sum.php 1 2 3 4 5 6тому я не впевнений на 100%, якщо це нормально.
timmyRS

@timmyRS Подання має працювати для певного формату введення - двох цілих чисел. Я не думаю, що він також може працювати з іншими входами.
insertusernamehere

Що робити, якщо ім'я вихідного файла починається з цифри? :)
Олексій Хованський

@AlexHowansky Psssssssst - нікому не кажи. ;) Це примха при запуску з файлу. Ви все ще можете виконати його за допомогою -rпрапора - тоді це вже не проблема.
insertusernamehere

7

Чеддар, 3 байти

(+)

Це класна особливість Чеддара під назвою "функціоновані оператори". Завдяки цій ідеї належить @ CᴏɴᴏʀO'Bʀɪᴇɴ.

Ось більше прикладів функціонованих операторів:

(+)(1,2) // 3
(/)(6,2) // 3
(-)(5)   // -5


6

Геометрія тире - 15 об’єктів

Нарешті зроблено.
15 об’єктів не так багато, але це все ж був кошмар (особливо через негативні цифри).

введіть тут опис зображення

Оскільки я мав би вставити тут 15 зображень, як це відтворити, я просто завантажив рівень. Ідентифікатор рівня 5216804. В описі розповідається, як запустити його, і ви можете скопіювати його, оскільки він може бути скопійований.

Пояснення:

У верхньому лівому тригері (Миттєвий підрахунок 2) перевірено, чи було перше додавання 0. Якщо воно було, то воно перевірило, чи було друге додавання додатним чи негативним. Якщо воно було позитивним, воно перенесло значення з другого додавання на суму (стиль BF, використовуючи петлі), і якщо воно буде від'ємним, воно зробить те саме.

Причина, чому нам потрібно перевірити, чи є додаткове додаткове чи від’ємне друге додавання, полягає в тому, що нам потрібно було б відняти одне з другого додавання і додати одне до суми або додати одне до другого додавання і відняти одне від суми відповідно.

Якщо перше додавання не дорівнює нулю, воно перевіряє, чи воно позитивне чи негативне, використовуючи вищезазначений процес. Після однієї ітерації в циклі while він перевіряє, чи є перше додавання нульовим, і якщо воно є, це робить процес, описаний на початку пояснення.

Оскільки Geometry Dash надзвичайно схожий на BF, ви можете зробити з цього рішення BF.



5

Perl 5,10, 8 байт

Два числа, які потрібно додати, повинні містити два окремі рядки, щоб цей міг працювати:

say<>+<>

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

Один із введенням у тому ж рядку ( 14 + 1 байт для прапора -a )

say$F[0]+$F[1]

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

Один із введенням у тому ж рядку ( 19 + 1 байт для прапора -a )

map{$s+=$_}@F;say$s

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

Ще один, змінивши роздільник за замовчуванням масиву ( 19 + 1 байт для прапора -a )

$"="+";say eval"@F"

Спробуйте це тут!


2
Привіт, ще один хороший приклад (якщо це в кінцевому підсумку стане викликом каталогу) - метод, описаний Деннісом у цій публікації: codegolf.stackexchange.com/q/32884 (ab), використовуючи -pпрапор.
Дом Гастінгс

Замість того say$F[0]+$F[1], say pop()+popпрацює (перевірено в Strawberry 5.20.2 з -E) і економить байт.
msh210



5

PowerShell v2 +, 17 байт

$args-join'+'|iex

Вводить дані як два окремі аргументи командного рядка, які попередньо заповнюються у спеціальний масив $args. Ми утворюємо рядок з -joinоператором, з'єднуючи їх разом з a +посередині, а потім передаємо до цього рядка Invoke-Expression(подібний до eval).


Завдяки @DarthTwon за те, що він нагадував мені, що при роботі з такими мінімальними програмами існує декілька методів прийому введення даних у всіх байтових підрахунках.

$args[0]+$args[1]
param($a,$b)$a+$b

PowerShell - це нічого, якщо не гнучка.


1
Так, я просто переслідую вас тут: P Альтернативні відповіді: $args[0]+$args[1]іparam($a,$b)$a+$b
ThePoShWolf

5

> <> , 7 6 3 байти

+n;

Онлайн-перекладач

Або спробуйте його на TIO із прапором -v.

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


Оскільки питання дає змогу визначити функцію, я вважаю, що простого +було б достатньо: воно випустило б два числа зі стека і поверне результат їх додавання назад у стек. Витрати -vтакож можна уникнути, оскільки зчитування номерів можна було зробити заздалегідь викликом функції.
Аарон

1
@Aaron: Правда. Але оскільки це рішення вже розміщено для кількох інших мов, я зберігаю це як повноцінну програму.
Емінья

1
Я думав, що прапор v буде максимум +1 байт, але в будь-якому випадку ви можете використовувати інтерпретатор fishlanguage.com, і ваш загальний обсяг буде 3 байти (не потрібно -v).
redstarcoder

@redstarcoder: кожен завжди визначає прапор як 3 байти для риби (і 1 байт для всіх інших мов, здається). Не впевнений, чому це інше, але я припускаю, що це з поважної причини.
Емінья

Незалежно від того, прапор вам не потрібен, якщо ви просто використовуєте перекладач fishlanguage.com. У вас є посилання на мета? Я не бачив жодної програми, що отримує байти для використання цілих чисел у початковому стеці (я теж це зробив).
redstarcoder

5

C, 35 байт

s(x,y){return y?s(x^y,(x&y)<<1):x;}

Що я тут зробив - це визначене доповнення без використання булевих чи арифметичних операторів. Це рекурсивно робить x біт суми на "xor", а y біт переносу на "і", поки немає перенесення. Ось незворушний варіант:

int sum(int x,int y){
    if(y==0){
        //anything plus 0 is itself
        return x;
    }
    //if it makes you happier imagine there's an else here
    int sumBits=x^y;
    int carryBits=(x&y)<<1;
    return sum(sumBits,carryBits);
}

Чому ви просто не додасте безпосередньо?
Esolanging Fruit

Я виявив, що бути нудною, повністю гольф-версія є тривіальною.
Біджан

"Усі відповіді повинні демонструвати певні зусилля для досягнення кращого результату. Наприклад, відповіді на проблеми з кодом для гольфу повинні намагатися бути максимально короткими (в межах обмежень обраної мови)". (від codegolf.meta.stackexchange.com/a/7073/61384 )
Esolanging Fruit

2
Очевидно, я думав просто додати цифри, і я доклав зусиль, щоб скоротити його, лише за допомогою чергових обмежень. Я думаю, оскільки це нетрадиційне питання, воно заслуговує на нетрадиційну відповідь. Дотримуючись цього правила слово за словом, не було б причин ніколи відповідати, якщо хтось уже виклав коротший. Якщо ви розмістили 20-байтне рішення python, а хтось уже має 4-байтну версію, то ви доводите, що не знаєте, як скопіювати та вставити. Люди висувають 20-байтні рішення, тому що ми цінуємо оригінальність.
Біджан

1
Мається на увазі, що вона є конкурентоспроможною у вибраній вами мові. Однак, прочитавши мета, здається, що я не можу стверджувати, що ваша відповідь є недійсною ("Відповідь може реалізувати будь-який алгоритм, навіть якщо існують гравці"), тому я думаю, я його відкину.
Esolanging Fruit

4

MATLAB, 4 байти

1 байт вилучено завдяки @LeakyNun

@sum

Це анонімна функція, яка бере масив і дає суму. Приклад використання:

>> f = @sum
f = 
    @sum
>> f([3 4])
ans =
     7

Про що sum?
Leaky Nun

@LeakyNun Спасибі, хороша ідея!
Луїс Мендо

43 байти? xD BTW: Я думав, що ми повинні мати повну програму чи функцію , тому я б сказав, що лише відповідь @sumє достовірною. Або є інший мета-консенсус?
недолік

@flawr Я думаю, що є, так. Але я не зміг його знайти
Луїс Мендо

4
Wooah, я допоміг вам зменшити з 43 до 4 байт XD
недолік

4

GoLScript , 1 байт (неконкурентоспроможний)

K

Додає 2 кращих числа в стеку. Це воно.

Тепер , як штовхати їх на стеку, я не маю ні найменшого поняття. Я не думаю, що це можливо .. кашель @ CᴏɴᴏʀO'Bʀɪᴇɴ кашель


Explanation soon to be coming.- Рікер 3 липня '16
MD XF

+1 для мови гри "Життя".
HighlyRadioactive

4

Мова програмування Шекспіра (SPL), 137 135 байт

Повна програма, гольф:

.
A.
B.
Act I
Scene I
[Enter A and B]
A: Listen to your heart!
B: Listen to your heart! You are the sum of me and you. Open your heart! 

І коротке пояснення:

----
.                                 <- Title, everything before the first 
                                     full stop is considered as the tittle and treated as a comment
----
A.                                <- Dramatis personae. Here are introduced the characters in the play.
                                     |Characters are treated as variables.   
B.                                <--
----
Act I                             <- Acts and scenes are used to divide a program into smaller
                                     chunks in order to be able to refer to them later.
                                     |
Scene I                           <--
----
[Enter A and B]                   <- Characters on stage in the current scene, which are the              
                                     variables the program will have access to.
----
A: Listen to your heart!          <- Line of code. All of them have the same structure
                                     Variable: code. In this case, the concrete sentence
                                    "Listen to your heart!" reads an input number and stores it
                                     on the character (variable) refered to.
B: Listen to your heart!          <- Same as above 
   You are the sum of me and you. <- Sum the values of itself and the caharacter (variable)
                                     refered to.
   Open your heart!               <- Output the value of the character (value) refered to.

Я не впевнений, що це найкоротший термін, який він може пройти. Перегляньте офіційну сторінку для отримання додаткової інформації.

Редагувати 1: Видалено :після, Act Iі Scene Iяк здається, що все після римської цифри ігнорується, таким чином зберігається 2 байти.


5
Це не вірно. Персонажі повинні бути з п'єс Шекспіра, і: s повинні бути там. Крім того, вам потрібна кома після імені кожного символу для опису.
Олівер Ні

4

машинний код x86_32, 2 байти

08048540 <add7>:
 8048540:   01 c8                   add    %ecx,%eax

Якщо припустити, що два значення вже є в регістрах ecx та eax, виконання інструкції add додасть значення двох регістрів і збереже результат у регістрі призначення.

Повну програму, написану на мові C та inline, ви можете побачити тут . Запис обгортки на C полегшує надання входів і тестування, але фактичну функцію додавання можна зменшити до цих двох байтів.


3
Це не функція, а лише фрагмент. Також вам потрібна retінструкція (один байт). І це припускаючи звичайну конвенцію про виклики, де eaxвона використовується як регістр передачі аргументів. (Бібліотека викладання навчальної програми Irvine32 робить це, але ніякі стандартні умови викликів для x86-32 або x86-64 не роблять цього, на відміну від ARM, де регістр повернутого значення r0є також першим регістром передачі аргументів). Asm функціонує, однак, вам не потрібно змінювати його на 3 байти lea (%ecx, %edx), %eax+ 1 байт retдля Microsoft __fastcallабо gcc -mregparm.
Пітер Кордес

1
Це цікавий виклик для стека-аргументів, що викликають конвенцію. popє лише 1 байт, але для espвідносних режимів адресації потрібен байт SIB. Таким чином, умовний виклик, який викликає абонент, може pop %ecx(повернення адреси), pop %eax/ pop %edx/ add %edx, %eax(2 байти) / jmp *%ecx(2 байти) = 7 байт. по порівнянні з mov 4(%esp), %eax(4В) / add 8(%esp), %eax(4В) / ret= 9 байт або 11 байт для версії абонента СОЗ , що використання ret imm16, якщо я зробив це право. Це додатковий 1 байт для SIB з ESP в якості основи і додатковий 1 байт для disp8 в кожному інтернеті.
Пітер Кордес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.