До этого было много испытаний «Делай __ без _ _», но я надеюсь, что это одна из самых сложных задач.
Соревнование
Вы должны написать программу, которая берет два натуральных числа (целые числа> 0) из STDIN и печатает сумму двух чисел в STDOUT. Проблема в том, что вы должны использовать как можно меньше знаков +
и -
знаков. Вам не разрешено использовать какие-либо функции типа суммы или отрицания.
Примеры
вход
123
468
выход
591
вход
702
720
выход
1422
Tie Breaker:
Если две программы имеют одинаковое количество +
и -
персонажей, победителем является человек с меньшим количеством /
*
(
)
=
.
,
и 0-9
символов.
Не разрешено: Языки, на которых стандартные операторы сложения / вычитания и увеличения / уменьшения являются символами, отличными от +
или -
не разрешенными. Это означает, что пробелы в языке не допускаются.
источник
+
или-
...+
,-
а галстук персонажей? ... или вам нужно снова изменить правила :-)Ответы:
Perl (без +/-, без прерывателей, 29 символов)
В качестве бонуса вы можете сделать кодовую сумму более двух чисел, добавив больше
x
s вs!!xx!
.В качестве альтернативы, здесь есть два 21-символьных решения с 1 и 3 выключателями соответственно
Примечание. В этих решениях используется
say
функция, доступная начиная с Perl 5.10.0 с-E
переключателем командной строки или с помощьюuse 5.010
. Посмотрите историю изменений этого ответа для версий, которые работают на старых perl.Как работает решение без прерывателей связей?
s!!xx!
является оператором замены регулярного выражения , работающим по умолчанию с$_
переменной, которая заменяет пустую строку строкойxx
. (Обычно/
используется в качестве регулярного выражения разделителем в Perl, но на самом деле почти любой символ может быть использован я выбрал. ,!
Так как это не тай-брейка.) Это просто причудливый способ предваряя"xx"
к$_
- или, так как$_
начинается пустой (неопределенный, на самом деле), это действительно способ писать$_ = "xx"
без использования знака равенства (и с одним символом меньше тоже).s!x!$"x<>!eg
еще одна замена регулярное_выражение, на этот раз заменяя каждыйx
в$_
со значением выражения$" x <>
. (g
Переключатель задает глобальную замену,e
указывает, что замена должна оцениваться как код Perl, а не использоваться в качестве литеральной строки.)$"
Это специальная переменная , значением по умолчанию которой является один пробел; используя его вместо" "
сохранения одного символа (Любая другая переменная, известная как имеющая односимвольное значение, например,$&
или$/
, будет работать здесь одинаково хорошо, за исключением того, что использование$/
обойдется мне в тай-брейк.)Оператор
<>
ввода строки в скалярном контексте считывает одну строку из стандартного ввода и возвращает ее.x
Прежде , чем это Perl оператор повторения строки , а на самом деле ядро этого решения: он возвращает его левый операнд (один символ пробела) повторяется несколько раз , заданных правого операнд (линия мы только что прочитали в качестве входных данных).y!!!c
это просто неясный способ (ab) использовать оператор транслитерации для подсчета символов в строке ($_
по умолчанию снова). Я мог бы просто написатьsay length
, но запутанная версия на один символ короче. :)источник
code-golf
с некоторыми исходными ограничениями?R (24 символа)
Что это делает:
scan
читает ввод из STDIN (или из файла)sequence
генерирует целочисленные последовательности, начиная с 1, и объединяет последовательности. Например,sequence(c(2, 3))
результаты в векторе1 2 1 2 3
length
вычисляет количество элементов в объединенном вектореПример 1:
Пример 2:
источник
D
немного вертеться на победу
в качестве бонуса скомпилированный код не содержит операции добавления (хотя не могу говорить за вызов readf)
источник
Python 2, 43 байта
источник
print sum(input(),input())
GolfScript
Нет +/- или прерывателей:
Гораздо более простая версия с двумя символами прерывателя связей, использующая тот же прием конкатенации списков, который используют другие люди:
Я предполагаю, что GolfScript не дисквалифицирован за использование
)
в качестве оператора приращения, поскольку я фактически не использую его.источник
C (только 32 бита)
Арифметика указателей так же хороша.
Как это соответствует требованиям?
* Нет
+
или-
* Нет
/
,=
,.
,0
-9
* Только 3 пары скобок, которые , мне кажется минимальным (вам нужно
main
,scanf
,printf
).* Один
*
(указательный подход требует этого).* Четыре
,
(можно сохранить одну, определив обычные переменные, а неac,av
)источник
C ++ 0 +/-, 3 выключателя
источник
Хаскелл, 0 + 2
При этом используются символы no
+
или-
, и только два=
из набора символов прерывателя связей, один из которых обязателен для привязкиmain
. Сумма производится путем объединения списков соответствующей длины.источник
РЕДАКТИРОВАТЬ Это было опубликовано до того, как правила были изменены, чтобы запретить
sum
...Язык R: Нет звонков
+
или-
... И 9 символов тай-брейка!Пример:
Это
[1] 579
ответ 579 ([1]
чтобы отслеживать, где в векторе результатов вы находитесь, поскольку в R все значения являются векторами - в данном случае длины 1)Обратите внимание, что R имеет
+
операторы, как и большинство языков - так уж сложилось, что он имеетsum
также суммирующий набор векторов.В этом случае
readLines
возвращает строковый вектор длины 2. Затем я приводю его к числовому (удваивается) и суммирует ...Просто чтобы показать некоторые другие особенности R:
источник
colSums
вместо этого ... Может быть, также запретить "функции, подобные отрицанию", пока вы в этом ...Язык R
Новые правила, новый ответ, тот же язык. Нет звонков
+
или-
ОБНОВЛЕНИЕ Используя
scan
, он падает до 11 символов тай-брейка (и всего 27 символов).Оригинал: 13 символов тай-брейка!
Пример:
На этот раз результат достигается путем умножения матриц. Ответ отображается в виде матрицы 1x1.
источник
scan()
вместоreadlines(n=2)
Haskell, 0
+
/-
,62 выключателя (=
)(не использует трюк конкатенации строк / списков)
источник
Javascript, 56
Спасибо @JiminP за подсказку ~~! Я собираюсь наименьшее количество байтов, поэтому 1 байтовое сохранение в приглашении p =; все еще стоит Я понимаю ваш аргумент о символах прерывателя связей, но, если честно, вы бы предпочли не меньше байтов :-p
Версия, 69
Благодаря некоторой обратной связи от @Ilmari и @JiminP, я сократил 13 байт моего исходного решения.
Изначально 82
источник
concat
и положить расчеты вalert
короче.i=parseInt;p=prompt;alert(Array(i(p())).concat(Array(i(p()))).length)
Кстати, я не знал, чтоArray(n)
возвращает массив с длинойn
. Консоль Google Chrome дала мне,[]
и я подумал, что ничего не было ...p=prompt
это не хорошо. И,parseInt(x)
почти эквивалентно~~x
.alert(Array(~~prompt())['concat'](Array(~~prompt()))['length'])
(12 символов прерывателя) PS. Я мог бы использовать это как свою запись, но это только дает мне чувство воровства.С
источник
APL (без +/-, без прерывателей связи, 8 или 10 символов)
Эта запись похожа на другие, которые объединяют последовательности, сгенерированные из входных данных, и находят длину ... но это в APL, что может показаться непонятным даже для такой небольшой проблемы, как эта. Я использовал Dyalog APL , который предлагает бесплатную образовательную лицензию.
Код:
Справа налево:
⎕
) запрашивает ввод у пользователя и оценивает его.¨
) применяет функцию генератора индекса (⍳
) к каждому элементу в массиве справа от него./
), который сворачивает массив с помощью функции конкатенации (,
). Для решения этой задачи используется одномерный оператор редукции (⌿
) вместе с оператором конкатенации вдоль первой оси (⍪
).⊃
) дает нам содержимое вложенного массива (пакет).⍴
) дает нам длины размеров массива. В этом случае у нас есть одномерный массив, поэтому мы получаем количество элементов в массиве, что является нашим результатом.Если нам нужно явно вывести результат, мы можем сделать это так:
Сопоставимый код Python с соответствующими символами APL выше:
Я хотел бы знать , если есть более короткий вариант можно в APL - другой, более простой вариант я придумал , что имеет больше галстука выключатели (хотя до сих пор на 8 символов) является:
⍴(⍳⎕),⍳⎕
.источник
Я не видел, чтобы кто-то делал это с помощью электротехники, поэтому вот мое мнение (в рубине):
Это немного уродливо, но это делает работу. Два значения сравниваются поразрядно
AND
. Если у них нет общих битов, в следующем двоичном столбце нет «переноса», поэтому сложение можно завершить путем их побитовогоXOR
ввода. Если есть перенос, вы должны добавить перенос к побитовойXOR
. Вот небольшой рубиновый скрипт, который я использовал, чтобы убедиться, что моя цифровая логика не слишком ржавая:Ура!
источник
Seed ,
3904384611 байтов, 0 +/-, 10 прерывателей связиисточник
Shell, 52
Это в основном тот же ответ, который я дал для другой проблемы.
источник
xargs -n1 jot | wc -l
что требует того же-
сокращения,awk
но я не вижу, как этого избежатьxargs
С
источник
/*=.
, 7(
, 7)
, 7,
, 1[0-9]
C #
Это не самое короткое время:
источник
J,
157 символов, 1 прерыватель связи, неполная программаЭто моя попытка J Это не полная программа, потому что я еще не понял, как ее написать. Просто вставьте эту строку в скрипт, чтобы получить функцию,
p
которую можно использовать для добавления произвольного количества чисел. Это монада, которая добавляет список чисел (например,p 1 2 3 4
):Идея очень проста. Функция написана в молчаливом или бессмысленном стиле. Вот точное определение:
Читайте справа налево. В негласной версии,
@
составляет части функции. (как ∘ в математике [(f∘g) (x) = f (g (x)])y
это параметрp
.~
делает глагол рефлексивным. Для некоторых глаголовm
,m~ a
равноa m a
.#
(copy,a#b
): каждый элемент вa
реплицируетсяi
раз, гдеi
это элемент с тем же индексом, что и текущий элементa
ofb
. Таким образом,#~
копия товараn
n
раз.#
(count,#b
): подсчитывает количество элементов вb
.Вывод: J потрясающий и менее читаемый, чем Perl (что делает его еще более потрясающим)
Правки
#
вместоi.
. Да! Меньше символов, чем в сценарии гольфа.Больше программы
Этот запрос на ввод, но он еще не полная программа: (13 символов, 3 прерывателя)
источник
Javascript (17 символов тай-брейка)
: P («Обфусцировано», чтобы уменьшить количество символов тай-брейка. Внутренне это
b=prompt(a=prompt(y=function(a){c=new Uint8Array(a);for(i in c)if(i==~~i)x.push(1)},x=[]));y(a);y(b);alert(x.length);
.)источник
C #,
Программа работает на 1 линии; разделены на несколько строк, чтобы избежать горизонтальной прокрутки.
источник
Clojure (44 символа)
Редактировать: исправлено печатать на STDOUT вместо возврата суммы.
источник
Scala
Код:
источник
К, 11
Тот же трюк с конкатенацией, что и для решения R. Чтение справа налево: перечислить две входные переменные, объединить, а затем считать.
источник
PowerShell ,
2742 байта, 0+-
,41 вторичныйСпасибо Маззи за сохранение
+
и 4 вторичныхПопробуйте онлайн! или Pretty Table для дополнительных 3 байтов
-Или- добавление четырех вторичных файлов для сохранения 19 байтов:
3223 байта,10+-
,125 вторичных-9 байт благодаря маззи
Попробуйте онлайн!
Для каждого аргумента мы помещаем
n
элементы массива (состоящие из,[n]
но это не важно) в конвейер, которые группируются по скобкам и затем подсчитываются.источник
|fl
для красивого формата Попробуйте онлайн!Кег (SBCS на Кеге вики)
В основном порт ответа R.
объяснение
источник
05AB1E , 2
4байта, 0+
/-
Попробуйте онлайн!
Извиняюсь, если я неправильно понял этот вызов, но я был удивлен, что ответа 05AB1E не было. Самый короткий ответ на этом языке, который я мог бы найти, который не использует + или встроенную функцию суммы.
Объяснение:
-2 байта благодаря Грими.
источник
Python 3
Не полагаясь на скрытые суммирования в других функциях.
Попробуйте онлайн!
источник
D
на этот раз с использованием длины массива
источник