Эта задача состоит в том, чтобы написать программу или скрипт, который подсчитывает сумму всех цифр в целых числах от 1 до и включая заданное число.
Ввод, одно положительное целое число. Выведите, сумму цифр в этом числе и все меньшие числа.
Примеры:
Input: 5
Integer Sequence: 1, 2, 3, 4, 5
Sum of Digits: 1 + 2 + 3 +4 + 5 = 15
Input: 12
Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Sum of Digits: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 + 1 + 1 + 1 + 2 = 51
Чтобы было ясно, это значит, что нужно посчитать сумму цифр, а не целых чисел. Для однозначных входов это будет то же самое. Тем не менее, входы больше 10 будут иметь разные ответы. Это был бы неправильный ответ:
Input: 12
Output: 78
Другой пример, чтобы показать разницу:
Input: 10
Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Sum of Integers (INCORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
Digit Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0
Sum of Digits (CORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 = 46
Большой тестовый пример (ПРАВИЛЬНЫЙ ОТВЕТ):
Input: 1000000
Output: 27000001
Правила и рекомендации:
- Представленный код должен быть законченной программой или скриптом, а не просто функцией. Если код требует включает в себя, импорт и т. Д., Они должны быть включены в размещенный код.
- Номер должен быть введен пользователем, а не жестко запрограммирован. Ввод может быть получен в виде аргумента командной строки, файла, стандартного ввода или любым другим способом, с помощью которого ваш язык может принимать пользовательский ввод.
- Код должен быть в состоянии правильно обрабатывать ввод по крайней мере до
(2^64)-1
. - Код должен выводить только сумму.
- Представленные программы и сценарии должны быть удобными для пользователя и не растрачивать компьютерные ресурсы (например: они не должны объявлять безумно большие массивы для хранения каждого символа). Для этого нет строгого бонуса или штрафа, но, пожалуйста, будьте хорошими программистами.
Подсчет очков:
Основной механизм оценки по длине кода. Чем ниже баллы, тем лучше. Следующие бонусы и штрафы также применяются:
- -25 Бонус, если ваш код может обрабатывать все положительные числа, например:
1234567891234567891234564789087414984894900000000
- -50 Бонус, если ваш код может обрабатывать простые выражения, например
55*96-12
. Чтобы получить этот бонус, код должен обрабатывать+ - / *
операторы (сложение, вычитание, деление, умножение) и обеспечивать порядок операций. Деление - это регулярное целочисленное деление.- Данный пример (
55*96-12
) оценивается как5268
. Ваш код должен возвращать то же самое для любого из этих входов - правильный ответ81393
.
- Данный пример (
- Бонус -10, если ваш код соответствует бонусу -50 и может обрабатывать
^
оператор (экспонента). - Бонус -100, если ваш код соответствует бонусу -50 и не используется
eval
или не похож на обработку выражений. - +300 Штраф, если ваш код опирается на какие-либо веб-ресурсы.
55*96-12
вернуться?Ответы:
Perl 6: 108 - (25 + 50 + 100) + 0 = -67 очков
Решение для гольфа (финальная линия, основанная на великолепном решении xfix ):
Решение для игры в гольф:
Этап оценки работы итерации над каждым символом
*
,/
,+
,-
, находя , когда , которая находится между двумя целыми числами, и заменяя , что с помощью функции , что символ представляет.Более подробно: он берет каждый символ (например
+
) и инфиксную функцию, которую он должен представлять (например,&[+]
сокращение для&infix:<+>
той же функции, которую Perl 6 вызывает при выполнении1 + 2
), и выполняет глобальную подстановку (s:g[…] = …
которая похожа на Perl 5s/…/…/ge
), который совпадает с двумя целыми числами, разделенными символом ((\d+) $sym (\d+)
), и заменяет его выводом соответствующей инфиксной функции, вызываемой этими целыми числами (infix($0, $1)
).Наконец, это оцененное выражение вводится
say [+] (1..$expression)».comb
, что xfix очень хорошо объясняет в его решении .Извините, что так поздно на вечеринку ☺
РЕДАКТИРОВАТЬ: Удалена поддержка экспонентов; в любом случае это было ровно 10 символов, и ассоциативность не была правильно сделана.
источник
my $g
вы можете использовать что-то заранее объявленное (я думаю, что это$!
может сработать, но я не проверял).my$g=get;for <* / + -> {$g~~s:g[(\d+)$^s(\d+){}]=infix:[$^s] |@()};say [+] (1..$g)».comb
это снизит счет до 88 символов или -97 очковMathematica 30- (10 + 50) = -30
Укорочена на 4 знака благодаря ибельтукам.
Range@n
возвращает число от 1 доn
.Integerdigits@n
разбивает каждое из этих чисел на свои цифры.Total[n,2]
суммирует цифры. 2 - разрешить суммирование на разных уровнях, то есть списках списков.тестирование
Выражения
источник
Tr@Flatten
может быть уменьшена доTotal[...,2]
:IntegerDigits@Range@#~Total~2&
.C:
150138 - (100 + 50) = -12Очень постыдно крадет ответ @Fors отсюда, чтобы выполнить оценку выражения: https://codegolf.stackexchange.com/a/11423/13877
Пример использования:
Примечание: реализация выражения не предполагает приоритета операторов и использует значения по мере их получения; бывший,
1+2*3 = 9
а не типичный7
.источник
sed,
411283 - 25 = 258Я не могу быть обеспокоен тем, чтобы играть в гольф прямо сейчас. :-) Не рекомендуется для использования даже с удаленно большими целыми числами, но технически это может иметь дело с произвольно большими целыми числами (хотя, скорее всего, вам не хватит оперативной памяти, так как я (более или менее должен) кодировать число в унарный).
Образец использования
(Строки ввода с отступом для удобства чтения.)
источник
питон, 55- (50 + 25 + 10) = -30
Неэффективно, но короче и может обрабатывать выражения.
РЕДАКТИРОВАТЬ: Спасибо Wolframh и legoStormtroopr за трюки: D
питон, 149- (25 + 50 + 10) = 64
Моя первая версия
вход:
выход:
источник
xrange
решение1234567891234567891234564789087414984894900000000
xrange
: Deval(raw_input())
наinput()
.while
Цикл может бытьwhile t:s+=sum(map(int,
т));t-=1
.input()
вместо тогоeval(raw_input())
, чтобы , какinput
ужеeval
с выражением! Это означает, что вы можете получить -10 за символ силы и бонус -100 за неиспользованиеeval
!!!eval
и тому подобное , поэтому я думаю, что -100 не будет учитыватьсяPython - 108 символов минус 85 бонусов, 23 ударов, обрабатывает очень и очень большие входные данные
Большинство из этих решений, кажется, зацикливаются на все целые числа меньше входных и складывают все их цифры. Это работает, но я чувствую, что это не элегантно, и задам вопрос, действительно ли они имеют право на бонус в 25 баллов, поскольку я не думаю, что они смогут справиться с вводом в
1234567891234567891234564789087414984894900000000
течение наших жизней. Действительно, на вводn
цифр, эти решения требуютO(10^n)
времени. Я решил вместо этого бросить математику на эту проблему.Множество всех
x
цифр чисел изоморфно множеству{0,1,2,3,4,5,6,7,8,9}^x
. Для фиксированного(n,sig)
существуютx
различные значенияsig
,10^x-1
точки сsig
го набора индекса кn
, а сумма всех цифр0-9
составляет 45. Это все обрабатываетсяf
.g
это то, что мы, вероятно, все знакомы сmagic
берет все цифры входного числа и перебирает их от наименее до наиболее значимых. Проще всего отследить это с помощью примера ввода, скажем1,234,567
.Чтобы иметь дело с диапазоном
1,234,567-1,234,560
, мы должны сложить все цифры от1
до7
и добавить в7
разы сумму других цифр, чтобы иметь дело со всеми числами больше чем1,234,560
. Теперь нам нужно разобраться с остатком.Чтобы разобраться с диапазоном
1,234,560-1,234,500
, мы добавим6
(val
) и опустим верхний предел до1,234,559
. Делая оставшуюся часть отбрасывания, мы увидим каждое однозначное число 6 раз (val*f(sig)
). Мы увидим все числа от точно0
до каждого времени ( ). Мы увидим все остальные цифры в этом числе ровно 60 раз ( ). Теперь мы имеем дело со всеми числами строго больше, чем . Та же логика будет применяться индуктивно во всех значениях.5
10
(10**sig)*g(val-1)
(val*10**sig)*sum(digits[sig+1:])
1,234,500
Игра в гольф, благодаря WolframH, сокращает это решение до
И сумма цифр суммы всех целых чисел до
1234567891234567891234564789087414984894900000000
является265889343871444927857379407666265810009829069029376
Наибольшее число, которое мне удалось набрать в версии для гольфа, составляет 10 ^ 300, и в этот момент поплавки начинают переполняться, и численная нестабильность начинает вызывать проблемы. При быстрой функции возведения в квадрат и умножения эта проблема исчезла бы.
И поддержка LaTeX была бы очень полезна ...
источник
2.65889343871e+50
, что является приближением с плавающей запятой к реальному решению. Видимо, вы печаталиint(t)
вместо того, чтобыt
в коде, который вы дали. Это не правильно; реальное решение есть265889343871444899381999757086453238874482500000214
. Просто избегайте использования поплавков, т.е. заменяйте**(x-1)
их на более короткие**x/10
.d
(потому что он используется дважды). Устраняя другие (и используя некоторые уловки) каждый достигаетd=map(int,str(input()))\nprint sum(v*(10**s*((v-1)/2+sum(d[:~s]))-~s*9*10**s/2)for s,v in enumerate(d[::-1]))
(108 символов). Отлично работает на входах любого размера (напримерint("1"*1000)
).10**-1
будет0.1
, а оттуда на всем преобразуемые поплавки.1/10
есть0
(целочисленное деление), и все может оставатьсяint
с.TI-BASIC, 137 - (50 + 10 + 100) = -23
Ввод обрабатывает числа до
1E100
и автоматически оценивает. Может обрабатывать выражения.Хотя это безумно большой массив, я не трачу компьютерные ресурсы (это запускается из калькулятора ).
источник
eval
не нужно.Скала 66
источник
С
7774С
150124 - 25 = 99Вот альтернативная версия, которая технически должна иметь право на 25 бонусов за «любое» положительное целое число, но это непрактично медленно, так как алгоритм имеет линейное время на входе. Несмотря на это, было весело писать. Вручную вычитает число, считываемое как символы ASCII. Эта версия составляет 150 символов. (Теперь с ужасным цикличным кодом!)
С
229224 - (50 + 100) = 74Вариант обработки выражений. Реализует оператор старшинства в соответствии с типовыми правилами:
/ * - +
. Ограничено до 97 токенов = 48 терминов.источник
GolfScript 18 - 50 = -32
Пояснение: Предположим, что ввод "12":
Стек есть
[0,1,2,3,...,12]
.Стек есть
"01234...9101112"
.Стек есть
"0 1 2 ... 1 0 1 1 1 2"
.Стек есть
[0,1,2,...,9,1,0,1,1,1,2]
.Стек 51, по желанию.
Входными данными здесь могут быть любые допустимые выражения GolfScript, которые могут включать в себя экспоненты. Например:
Так как
2(5 + 5) - 8 = 12
. Я думаю, что это должно претендовать на бонус, но, возможно, ожидалось, что это будет, только если в обычной форме, а не обратная польская запись GolfScript.источник
^
??
^
, а не?
илиpow
и т. Д.Рубин, 37 - 50 = -13
Двойной eval, весь путь по небу! Как и с другими решениями Ruby, я думаю, что теоретически это должно быть в состоянии работать с произвольно большими числами, но время выполнения будет ... ужасным.
Старая версия (49 - 50 баллов)
Предполагая, что бонус в 10 символов на самом деле требует, чтобы символ для возведения в степень был каретой, я бы подумал, что кратчайший способ добавить это:
Который стоит больше персонажей, чем даст бонус.
источник
p"#{[*1..eval(gets)]}".chars.map(&:to_i).inject :+
&
почти достаточно в гольфе. На самом деле, вам не нужно пространство междуinject
и:+
либо.Perl 6 (28 - 75 + 0 = -47 байт)
Он может обрабатывать все положительные числа (однако большие будут занимать много времени, потому что в настоящее время реализация Perl 6 медленная, но Perl 6 изначально поддерживает большие целые числа). Он использует
eval
, чтобы реализовать простой калькулятор (штраф в пять символов стоит пятьдесят символов). Это медленно только потому, что текущие реализации медленны, но в теории, это должно быть достаточно быстро (когда реализации Perl 6 улучшаются, то есть). Также, на удивление, я выигрываю с Mathematica (пока).»
в этом коде фактически нет необходимости, но я поместил его здесь из соображений производительности (в противном случае программа выделяла бы всю строку. Причина в том, что Perl 6 не имеет бесконечных строк, но у него есть бесконечные списки.В любом случае, вы можете спросить, как работает этот код. Ну, я собираюсь передать его по частям.
get.eval
Это получает одну строку (
get
функцию) и оценивает ее (eval
метод).1..get.eval
После этого Perl 6 подготавливает объект диапазона от
1
оценочного значения. Это диапазон, поэтому ничего огромного не выделяется.».comb
.comb
Метод разбивает строку на символы ( если не вызывается с аргументом ). Например,'cat'.comb
возвращает'c', 'a', 't'
.»
сопоставляет элементы списка, поэтому.comb
он запускается для каждого элемента, а не только для самого списка (например,(4, 9)».sqrt
дает2, 3
). Это также не выделяет больше, чем нужно, потому что Perl 6 имеет бесконечные списки (как, например, Haskell).»
символ на самом деле не нужен, так как.comb
может использоваться непосредственно в списке, но это подразумевает неявное приведение строк (и Perl 6 не имеет бесконечных строк, так что это приведет к потере памяти). Например,1, 2, 3
список после преобразования в строку возвращает1 2 3
. Для Perl 6 пробел - это идеально точное число, означающее 0, поэтому код будет работать даже при таком преобразовании. Тем не менее, это будет злоупотреблять вычислительными ресурсами.[+]
Это оператор сокращения. По сути,
[]
в этом случае вы можете использовать оператор+
. Список после оператора сокращения уменьшается, так что[+] 1, 2, 3
есть1 + 2 + 3
, который есть6
. Perl 6 использует отдельные операторы для чисел и строк, поэтому он не будет рассматриваться как конкатенация.say
Наконец,
say
выводит результат. В конце концов, вы хотите увидеть конечный результат, не так ли?источник
[+] 1,2,3,4,5,6,7,8,9,10
это1+2+3+4+5+6+7+8+9+10
, я прав?>
может быть связан, так что3 > 2 > 1
это правда. То же свойство применяется для сокращения операторов, так[>] 3, 2, 1
до сих пор так, как это означает , что3 > 2 > 1
-[>]
может быть использовано для определения числа в порядке убывания.get.Int
вместоeval
? Нужны ли математические выражения?sort
без аргумента метода сравнения).Perl 31 - без бонусов
Образец вывода:
Perl 5 с
-p
, 50 - 28 байт: -22Попробуйте онлайн!
источник
J, 22
объяснение
Оценка продолжается справа налево.
источник
+/,10#.inv>:i.
было бы короче. Но это все же функция, а не полная программа, как спросил ОП.R 64 - (50 + 10) = 4
Когда это выполняется, у пользователя запрашивается ввод.
Старая версия (не может обрабатывать выражения): 46 символов:
источник
u<-function(x) utf8ToInt(x)
и так далее.u <- utf8ToInt
обойтись безfunction
. Это может быть полезно для кода гольф, если функция используется несколько раз.Rcheatcodegolf
пакет, разрешено ли использовать предопределенные функции в этом пакете? :-)Партия - (181 - 50) - 131
Просто для удовольствия.
Я сделаю это немного более читабельным:
Старый метод использует цикл для получения вывода команды powershell, а не для записи и чтения из файла:
Установите входные данные для переменной -
v
-,/a
чтобы принимать арифметические выражения.К сожалению, включение отложенного расширения было необходимо.
Используйте цикл for для подсчета от 1 до введенного значения -
v
.Чтобы обработать числа больше 9, мне пришлось использовать powershell, чтобы получить длину строки, а затем использовать другой цикл for, чтобы разбить эту строку, и добавить ее к сумме -
s
.Вы можете изменить имя
powershell.exe
наp.exe
C: \ WINDOWS \ System32 \ WindowsPowerShell \ v1.0 \, а затем вызвать егоp "&{'%%a'.length-1}
, сохранив всего 9 байтов. Но это не совсем в духе этого.Оставил второй, пока я брал перерыв на обед.
Я не могу на самом деле проверить это с числами, которые слишком много, чем это из-за того, как медленно это. Однако это должно работать для довольно большого числа.
2147483647
это наибольшее число, которое потребуется (максимум 32-битное целое), прежде чем выдать следующую ошибку -Это, конечно, лишает меня права на вызов.
источник
v
и использовать%1
напрямую. 2. Вы можете вычесть 1 из своего скрипта PowerShell, а не из длинных,@set /a b=%%b-1
что сэкономит вам кучу. С этими изменениями у меня до 211 с оригинальных 240. :-)[decimal]
тип допускает значения до (2 ^ 96) -1.Дьялог АПЛ , 9 - 160 * = -151
Попробуйте онлайн!
⎕
получить оценку входных данных,например,
"7+5"
дает12
⍳
индексы 1 ... n[1,2,3,4,5,6,7,8,9,10,12]
⍕¨
отформатировать каждое число в строку["1","2","3","4","5","6","7","8","9","10","11","12"]
∊
подключить"123456789101112"
⍎¨
выполнить каждый символ (выдает список из однозначных чисел)[1,2,3,4,5,6,7,8,9,1,0,1,1,1,2]
+/
сумма51
* Подсчет очков
-50 бонус, поскольку он даже принимает выражения в качестве входных данных. Выражение должно быть действительным APL, что является приемлемым согласно OP .
-10 бонус, потому что он также обрабатывает
^
(*
в APL).-100 бонус, потому что ввод выражения обрабатывается без явного использования
eval
(то есть⍎
в APL).источник
eval
или не похож на обработку выражений». Так⍎¨
как кажется, что каждый символ выполняется один за другим, он вроде как eval (за исключением того, что он выполняет символы один за другим вместо всех одновременно, какeval
делает).⍎¨
используется только для преобразования цифр в целые числа, а не для обработки выражений.⎕
своего рода встроенная функция input + eval или eval всегда выполняется неявно при вводе выражений?⎕
всегда принимает выражение в качестве входных данных, оценивает его и возвращает его результат. Таким образом, чтобы ввести строку, вам нужно заключить ее в кавычки. Тот факт, что связанная встроенная функция (⍞
) возвращает входные данные в виде необработанного текста, не должен иметь значения (особенно потому, что символы указывают, что⎕
это основной метод ввода и⍞
является специальным вариантом), так как в противном случае получение бонуса потребовало бы выполнения математических операций. Оценщик - совершенно иная задача, чем основная. Я не люблю бонусы, а -100 просто глупый или имел в виду APL, но имхо, он точно подходит для бонуса.⎕
это действительно нормальный способ получения ввода и автоматической обработки выражений, я действительно считаю, что он вписывается и в бонус, так что +1 от меня. Бонусы в наши дни глупы, но это хороший способ использовать их, чтобы свести к минимуму ваш счет.C # (161)
милая
источник
Python3 + Bash (78 - 185 = -107)
Если результат выражения не является целым числом, он будет сначала обрезан. Если результат выражения отрицательный, результат не определен.
Используйте это как:
1: если только вы не считаете вызов Python из Bash как таковой, но я не думаю, что это так. Если вы думаете, что это действительно так, то скорректированный результат равен -7.
источник
Ява, 254
Обрабатывает выражения. Дайте любое выражение в цель. Ручки, пока длина не может справиться. Если вы убираете все пробелы в одну строку и не печатаете инструкции, это считается до 254 символов (с учетом Java-программирования на основе длинных слов).
PS: это полная программа, а не просто логика. Количество слов, данное для программы, а не только логика.
источник
Ява (JDK8), 272
Мой первый вызов, в котором я нахожусь, предложения приветствуются =)
Отступ:
источник
CJam, 9 - 25 = -16
CJam на несколько месяцев моложе этой задачи, поэтому она не имеет права на зеленую галочку. Кроме того, это не победит Perl. ;) Мне очень понравился подход, поэтому я все равно хотел опубликовать его.
Проверьте это здесь.
Идея состоит в том, чтобы создать диапазон от 0 до N. Затем этот диапазон преобразуется в строку, которая просто объединяет целые числа вплотную. Для N = 12 мы получили бы
Затем каждый символ преобразуется в целое число с
:~
(получая массив целых чисел), а затем суммируется с:+
. CJam может иметь дело с произвольно большими целыми числами.источник
Питон 3 + Астор ,
10171007 байт - (25 + 50 + 100) = Оценка:+842834сохранено 10 байт путем удаления
ts
и измененияp
редактировать: я не могу проверить смехотворно длинное целое число (1234567891234567891234564789087414984894900000000) [зависает мой компьютер], но, насколько мне известно, Python 3 поддерживает произвольно длинные целые числа.
Эта реализация
использованиязлоупотребляет АСТ. Я бы не стал злоупотреблять AST как «eval или похожий».Слишком лениво, чтобы писать без гольфа, поэтому я дам вам объяснение классов:
Последняя строка просто выполняет эти классы в соответствующем порядке на входе, чтобы сохранить порядок операций и предотвратить нежелательное поведение.
Пример использования ($ или> означает пользовательский ввод) и, кстати, фактическая программа принимает ввод только один раз:
источник
C # (108)
милая
источник
int
s; в C все по умолчаниюint
... О, это C #.Рубин -> 83-50 = 33
«Тестировать» версию:
Результаты тестов
источник
C # (80)
Это моя другая попытка.
милая
источник
n--
и+
нужно? Я не думаю, что это на других языках в стиле Си.2^64-1
не вписывается в 64 бит.4.5
; 2) средняя сумма из 20 цифр равна90
(2^64
имеет 20 цифр); поэтому ожидаемое значение будет около90 * 2^64 ≈ 1.66*10^21
. Так что вам понадобится хотя бы71
немного, максимум72
.Рубин 69-50 = 19 (или -4)
Это определенно можно сыграть в гольф вместе, но вот
перваяпятая попыткаОн также работает для всех чисел, но очень медленно для них, поскольку работает медленнее, чем O (n), поэтому я бы не стал добавлять -25. Если медленность в порядке, то это было бы -4 хотя
Рубин 133-50-25 = 58
Это более быстрая версия, которая выполняется менее чем за O (n) времени (и использует реальную математику!), Поэтому она может быстро обеспечить результаты для больших целых чисел, поэтому я добавил -25:
источник
Хаскель, 74-25 = 49
main=getLine>>=print.sum.map(\c->read[c]).concatMap show.(\x->[0..x]).read
источник
interact
и тот факт, что>>=
для списков то же самоеflip concatMap
, вы можетеmain=interact$show.sum.map(\c->read[c]). \x->[0..read x]>>=show
\c->read[c]
этоread.(:[])
ECMAScript 6, 86 - 50 = 36
источник
for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c).join()).length)
..join()
)for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c)).length)
. 78 - 50 = 28 !R (72 балла)
Выход:
источник