Вы должны взять 2 строковых ввода и вывести сумму этих двух строк без преобразования их в int или использования любого числового типа данных.
ех.
string one = "123";
string two = "456";
string sum = "579";
Предположим, что строки не будут длиннее 10 цифр.
Это код гольф и самый короткий ответ в символах выигрывает. Редактирование ответа в C # заставит меня улыбнуться :).
Редактировать: преобразование в int может быть определено как что-либо подобное
Int.TryParse
, (int)
, И Convert.ToInt
т.д.
code-golf
string
arithmetic
CSharper
источник
источник
Ответы:
80836 в сборе (
5753 байта)Это добавляет, цифра за цифрой, справа налево, без преобразования цифр ascii
'0'-'9'
в целые числа0-9
и переноса по мере необходимости. Байт-код является кодом для функции, которая может быть вызвана на C (см. Ниже).Приведенный выше байт-код был написан вручную из следующей сборки (в стиле NASM, с комментариями):
Чтобы попробовать это в C (gcc, linux, процессор Intel):
источник
Рубин,
10971Сырный. Если вы не можете принести Мухаммеда на гору ...
Алгоритм:
Изменения
71 короче как массив.
85 удалено объявление метода и объединены вызовы
n.to_s
92 применил несколько советов
101 сохранить символ
102 использовать х для увеличения
109 начальный коммит
источник
succ
илиprev
.... но это даже не весело для гольфа.sed, 359 байт (без необычного форматирования)
Я все еще не уверен, является ли это дублированием Add без добавления (или любого из 4 основных арифметических операторов) . А пока позвольте мне опубликовать ответ на этот вопрос. Он не собирается выигрывать в гольф, но это начало, и я думаю, что легко соответствует спецификации:
Ввод берется из STDIN в виде "x y". Это сначала преобразуется в "x: 0 :: y:". Затем мы увеличиваем все числа после символов «:», пока не получим «x: x: :( x + y):». Тогда мы наконец вернемся (x + y).
Вывод
Обратите внимание, что это работает только для натуральных чисел. Однако (по крайней мере, в теории) это работает для сколь угодно больших целых чисел. Поскольку мы выполняем x операций инкремента для y, порядок может иметь большое значение для скорости: x <y будет быстрее, чем x> y.
источник
y
превращается ли вy+1
использование просто регулярное выражение? а фактического дополнения нет? Ницца!Рубин -
485432265Это кажется больше в духе того, что вы искали в вопросе.
Это в основном решает проблему, как это сделал бы человек - «запоминая» все результаты сложения, состоящие из одной цифры, добавляя каждый столбец и понимая, как «переносить один», когда это необходимо.
При этом также используется один «числовой тип данных» (переменная i), что запрещено вопросом, но только для индексации строк. Я постараюсь удалить это и отредактировать свой ответ.
Немного негольфя
РЕДАКТИРОВАТЬ: Использовал некоторые идеи из комментариев, чтобы сгенерировать «запомненную» таблицу сопоставления вместо простого ее кодирования.
источник
[?1..?9].zip([?1..?9]).map{|x,y| Regex.new(x+y)}.map{/*something based on the order of results*/}
product
лучше, чемzip
/#{x+y}/
короче чемRegexp.new(x+y)
. ;)i=-1;(s=(?0..?9).to_a).product(s).map{|x,y|i+=1;/#{x+y}/=>(?0..'18').each_cons(10).to_a[i/10][i%10]}
дает вам ваш массив регулярных выражений.i
) ... должен быть другой способ обойти это ... может быть, просто использоватьeach_cons(10)
как перечислитель иnext
через множество?CJam,
95 92 80 72 7044 персонажачто переводится как
Это определенно может быть много в гольфе. Я действительно не знаю, является ли мой подход оптимальным или нет.
ОБНОВЛЕНИЕ - встроенное создание матрицы суммы для сохранения байтов. Из-за этого программа теперь работает в 10 раз медленнее, но все еще остается постоянным временем для любого вида ввода.
Попробуйте онлайн здесь
Читает строку, содержащую два числа из STDIN как строку, и выводит как массив символов, который является самой строкой.
Например:
Вывод содержит предшествующее
0
. Дайте мне знать, если это проблема.источник
C # -
128108104Спасибо Compass, BMac и Shawn за предложения по улучшению.
Сначала попробуйте Code Golf, и использование C # кажется здесь помехой ...
Используя
.Compute()
вы можете использовать строковые значения и суммировать их напрямую. В качестве бонуса это работает для других операторов, кроме "+".Golfed:
Ungolfed:
Звонок
t("123","456");
дает вам 579.источник
System.Console.WriteLine(new System.Data.DataTable()...
Console.Write
для сохранения 4 байтовGNU sed, 266 байт
Использует другой подход, чем решение DigitalTrauma. Как результат, этот работает еще хуже, используя O (m + n) . Конвертировать оба операнда в унарный, объединить, преобразовать обратно в десятичную (конечно, все используют регулярное выражение - sed не имеет понятия целого числа).
В качестве бонуса, эта программа суммирует все натуральные целые числа, заданные в stdin (в первой строке), что означает, что вы можете ничего не кормить, одно число или десять чисел, и это будет работать правильно независимо
Идея этого кода смутно вдохновлена моим старым представлением PPCG, хотя я не помню, на какой вопрос это ответ.
Вот вам, «довольно», напечатанное для вашего «удобства», позаимствовать еще одну идею от DigitalTrauma. : D
(Чтобы получить 266-байтовую версию, удалите конечные точки с запятой, начальные пробелы и последний комментарий, предпочтительно используя sed.)
Заимствование некоторых тестов из DigitalTrauma:
Я немного подправил действительно большие тесты из-за ужасной эффективности использования пространства. Из-за использования
q
обрабатывается только первая строка, отсюда иwhile
цикл в тесте.источник
Java 6 (181 символов)
Не быть превзойденным недостатком, известным как C # , Java во всей своей красе. Так много шаблонов! Использование предоставляет аргументы, разделенные пробелом, т.е.
123 456
Ungolfed:
Используя механизм JavaScript, доступный в
javax
, мы можем заставить другой язык делать свою работу за нас, и технически следовать правилам не использовать какие-либо числовые типы на родном языке или конвертировать.Обоснование использования
eval
Мы не преобразовали значения в int для JavaScript в eval. Мы создали строку,
"123+456"
которая не является числом. JS Engine обрабатывает формулу и оценивает строку как числовые литералы, которые не являются числовыми типами данных. Дурацкая логика Java! Кроме того, это также работает дляdouble
математики.источник
dc -e"$1 $2+p"
технически, я не использовал числовой тип в собственном bash, он просто передает строку в некоторые детали реализацииAPL (61)
Я думаю, что это подпадает под правила.
Это функция, которая принимает два строковых аргумента и возвращает строку:
Это также достаточно быстро, он добавляет число, образованное 999999
9
с к себе в одно мгновение.Он находит индекс каждого символа в
⎕D
(который является строкой «0123456789»), затем выполняет добавление начальной школы к каждому индексу отдельно, перенося по мере необходимости, затем просматривает полученные цифры⎕D
. (Я думаю, что⎕D
поиск подпадает под правила, в основном это просто делает'x'-48
).Объяснение:
⎕D∘⍳¨⍺⍵
: поиск индексов⎕D
для каждого символа в обеих строках.¯1+
: вычитать1
из каждого, потому что массивы по умолчанию основаны на 1.⌽↑⌽¨
: перевернуть оба, превратить в матрицу (заполнение пустых квадратов нулями), затем перевернуть матрицу.+⌿
: суммировать столбцы матрицы{
...}
перенести∨/T←9<Z←0,⍵
: добавить дополнительный0
перед списком. Узнайте, какие цифры больше 9, и сохраните это вT
. Если какие-либо цифры были выше 10:Z-10×T
: вычесть10
из каждой позиции больше 10,T←(1⌽T)+
: добавьте1
к каждой позиции рядом с каждой позицией, которая была выше 10, и сохраните вT
.T↓⍨~×⊃T
: еслиT
начинается с нуля, удалите его,∇
: применить функцию переноса к результату.⋄⍵
: в противном случае вернуть значение без изменений1+
: добавить по одному на каждую позицию (потому что массив 1-индексирован)⎕D[
...]
: использовать результат как индексы в⎕D
.источник
Perl -
136119115 байтЯ изучаю Perl, это казалось хорошей практикой. Советы приветствуются!
Дрянной ответ, чтобы убрать это с дороги:
Актуальный ответ:
несжатый:
источник
($x,$y)=@ARGV
и использоватьsay
вместоprint
будет сбрить несколько символов.say
это вещь Perl 6 (или вы можете использовать ее в Perl 5 с этими инструкциями, но это будет слишком долго). Вместо этогоsay
используйте,warn
чтобы побрить персонажа. Это выведет на STDERR вместо STDOUT, но это не противоречит правилам этого. :-)Java 7, оценка = 252
Для добавления не используются целые числа, длинные, байтовые, короткие, двойные, плавающие или любые встроенные библиотечные функции. Заверните в тело класса и позвоните с
t(String1,String2)
. Пожалуйста, добавьте строки с 0, чтобы они имели одинаковую длину.t("123","234")
возвращается"0357"
.Golfed:
Гольф Расширение с классом:
Частично гольф расширил:
100% расширен:
источник
char
- это числовой тип данных ._.\u0030
в строку, я"0"
не получу"48"
.Java - 257 символов
как все знают Java, нет лучшего языка для игры в гольф, чем Java
это нелегкое решение
источник
Haskell -
9894 байтаисточник
JavaScript (ES6),
55 6659 ** Это делает несколько предположений:
Ввод определен в переменных a и b, например:изменен на получение ввода из приглашения (+11).var a='123',b=321';
источник
Python 2,7,
196137 символовверсия 2 (короче, инициализируя словарь кодом):
Предыдущая версия 1 (196 символов):
например
Ключи словаря являются строками, значения словаря включают только числовые константы для сокращения кода, а вычисление выполняется путем объединения двух строк и получения результирующей длины, поэтому я надеюсь, что это считается «не преобразованием их в целые числа».
Python-версия с мелким шрифтом
Замечания:
Тип z - это пользовательский тип, который я определяю как: определенно не числовой тип по определению, которое использует спрашивающий, но он ведет себя достаточно близко к числовому типу, чтобы быть полезным в ограниченных обстоятельствах . Поведения типа z только частично реализованы в этом примере кода, и если интерпретатор CPython использует «int» для реализации z , это всего лишь деталь реализации, не связанная с рассматриваемой проблемой.
источник