Рассчитать сумму ILD

21

Входные данные:

Целое число

Выход:

Сумма самого ввода + длина входа + каждая отдельная цифра ввода.

nr + nr-length + {sum of digits} = output

Примеры:

Вход: 99
Выход: 99(nr) + 2(nr-длина) + (9 + 9)(цифры) →119

Вход: 123
Выход: 123 + 3 + (1 + 2 + 3)132

Правила соревнований:

  • Входные данные также могут содержать отрицательные входные данные, которые разрешаются специальным образом. Знак -/ минус также +1для длины, и является частью первого digit.
    Например:

    Вход: -123
    Выход: -123 + 4 + (-1 + 2 + 3)-115

  • Вы можете предположить, что ни ввод, ни вывод никогда не будут выходить за пределы (32-разрядного) целого числа.

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Также, пожалуйста, добавьте объяснение, если это необходимо.

Тестовые случаи:

87901 → 87931
123 → 132
99 → 119
5 → 11
1 → 3
0 → 1
-3 → -4
-123 → -115
-900 → -905
-87901 → -87886

Полусвязанные: подсчитать сумму всех цифр

Кевин Круйссен
источник
Я думаю, что с отрицательными числами, например, -123цепочка сумм должна быть (-1 + 1 + 2 + 3)вместо (-1 + 2 + 3), верно?
Yytsi
@TuukkaX Нет, так и должно быть -1 + 2 + 3. Для этой задачи я решил объединить -знак / минус с первой цифрой в одну отрицательную цифру, чтобы сделать ее немного интереснее.
Кевин Круйссен

Ответы:

10

05AB1E, 28 20 18 8 байтов

ÐgsS'+ýO

объяснение

Ð           # triplicate input
 g          # get length of input
  sS'+ý     # split input and merge with '+' as separator 
       O    # sum and implicitly display

Попробуйте онлайн

Сохранено 10 байтов благодаря @Adnan

Emigna
источник
2
К счастью, 05AB1E делает автоматическую оценку на арифметических выражений, так что вы можете сделать это: ÐgsS'+ýO.
Аднан
1
@Adnan: Хорошо! Я не знал, что это сделал.
Эминья
13

Python 2, 39 байт

lambda x:x+len(`x`)+eval("+".join(`x`))

Тестирование

Используя тот же трюк eval, что и в моем Pyth-ответе .

Denker
источник
Я никогда не использовал Python, так что забудь мое возможное невежество, но как же evalи joinзнать , чтобы взять на себя отрицательную первую цифру для отрицательного входа? Я ожидал -123бы стать чем-то вроде - + 1 + 2 + 3выписанного, но, по-видимому, это не так ... (Или это так, и оно автоматически объединяется - + 1в -1качестве второго шага?)
Кевин Круйссен
2
@KevinCruijssen, как вы сказали, -123становится "-+1+2+3"после присоединения, что дает правильный результат, когда вы evalего. Попробуйте, eval("-+1")например, что приводит к -1.
Денкер
1
@KevinCruijssen - + 1-> - 1. Оператор унарный плюс существует, поэтому, - + 1по сути, такой же, как -(+(1)). +aтак же, как a, для чисел.
Эрик Outgolfer
9

Pyth, 11 10 байт

Спасибо @LeakyNun за байт!

++vj\+`Ql`

Тестирование

объяснение

++ vj \ + `Ql`QQ # Q = ввод, два последних неявно добавлены

  vj \ + `Q # Присоединиться к входу в '+' и оценить его
        l`Q # Длина ввода
           Q # Сам вход
++ # Добавьте эти три значения, чтобы получить результат
Denker
источник
7

CJam, 18

q_,\~__Ab(@g*\~]:+

Попробуйте онлайн

Объяснение:

q_      read the input and make a copy
,\      get the string length and swap with the other copy
~__     evaluate the number and make 2 copies
Ab      convert to base A=10 (array of digits), it uses the absolute value
(       take out the first digit
@g*     get a copy of the number, get its sign and multiply with the digit
\~      dump the other digits on the stack
]:+     add everything together
aditsu
источник
6

Брахилог , 35 32 байта

Ll,: эф +:?: L + I, (? 0> ч: 2 *: Ir-: 1 + .; I).
Ll, (? 0> ч: 1 - I, I0) ,? б: эф +:: L: I +?.

объяснение

lL,             L is the length of the Input
(
    0>?         Input < 0
       h:1--I   I is (First digit - 1) * -1
;               Or
    I0          I is 0
),
?b:ef+          Sum all digits of the Input
      :?:L:I+.  Output = sum of digits + (Input minus first digit) + L + I
Fatalize
источник
6

XSLT 1.0 (без EXSLT), 673 байта

<transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0"><output method="text"/><param name="i"/><template match="/"><variable name="d"><variable name="s">0<if test="0>$i">1</if></variable><variable name="d"><call-template name="d"><with-param name="i" select="substring($i,$s+2)"/></call-template></variable><value-of select="substring($i,1,$s+1)+$d"/></variable><value-of select="$i+string-length($i)+$d"/></template><template name="d"><param name="i"/>0<if test="$i!=''"><variable name="d"><call-template name="d"><with-param name="i" select="substring($i,2)"/></call-template></variable><value-of select="substring($i,1,1)+$d"/></if></template></transform>

Слегка надутый:

<transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <output method="text"/>
    <param name="i"/>
    <template match="/">
        <variable name="d">
            <variable name="s">0<if test="0&gt;$i">1</if></variable>
            <variable name="d">
                <call-template name="d">
                    <with-param name="i" select="substring($i,$s+2)"/>
                </call-template>
            </variable>
            <value-of select="substring($i,1,$s+1)+$d"/>
        </variable>
        <value-of select="$i+string-length($i)+$d"/>
    </template>
    <template name="d">
        <param name="i"/>0<if test="$i!=''">
            <variable name="d">
                <call-template name="d">
                    <with-param name="i" select="substring($i,2)"/>
                </call-template>
            </variable>
            <value-of select="substring($i,1,1)+$d"/>
        </if>
    </template>
</transform>

Запустите с помощью xsltproc:

xsltproc --param i -87901 ild.xsl ild.xsl

Да, ild.xslпередается дважды: сначала как документ XSLT, а затем как документ XML, подлежащий преобразованию. Входной документ должен присутствовать, потому что процессору XSLT обычно требуется один, чтобы начать работать. (XSLT предназначен для определения преобразования из входного документа в выходной документ; выполнение преобразования исключительно с параметрами командной строки, как я это сделал здесь, нетипично.) Для этой программы любой правильно сформированный XML-документ будет достаточен в качестве ввода и, поскольку XSLT является приложением XML, любое правильно сформированное XSLT-преобразование по определению является правильно сформированным XML-документом.

psmay
источник
1
+1 за использование чего-то, что совершенно не предназначено для вычисления числа и заставить его работать в любом случае.
DJMcMayhem
Не можете ли вы удалить некоторые цитаты, чтобы сделать его "недействительным, но хорошо для codegolf"?
Эрик Outgolfer
Конечно, вам не нужно место после кавычек, name="i" select="..."например <with-param name="i"select="substring($i,$s+2)"/>?
кот
@cat Во всем документе их всего три, и фактически удаление пробела приводит к удушению xsltproc.
psmay
1
@psmay О, это странно. Эрик говорил , если вы удалите кавычки, это может быть технически недействительным в соответствии со стандартом , но по- прежнему работать правильно , как HTML, большинство реализаций которого делают тег без цитируемых значений атрибутов и <p id=hello>т.д. Я думаю , если xsltprocзаботится о пробельном он не будет препятствовать неупомянут все по.
кот
4

MATL, 20 байтов

tVtnw48-PZ}t0<?x_]vs

Попробуйте онлайн

Все тесты

объяснение

        % Implicitly grab the input
tV      % Duplicate the input and convert to a string
tn      % Duplicate and find the length of this string
w       % Flip the top two stack elements to get us the string again
48-     % Subtract 48 (ASCII 'O'). Yields a negative number for a negative sign
        % and digits otherwise
P       % Flip the resulting array
Z}      % Break the array up so each element is pushed to the stack
t0<?    % If the first character was a negative sign
  x_    % Pop the negative sign off the stack and negate the first digit
]       % End of if
vs      % Vertically concatenate and sum all stack contents
        % Implicitly display the result
Suever
источник
4

Clojure, 102 байта

(fn[n](load-string(str"(+ "n" "(count(str n))" "(apply str(map #(if(= % \-)%(str %" "))(str n)))")")))

Анонимная функция, которая создает строку, которая выглядит (+ -123 4 -1 2 3 )и обличает ее. Все довольно многословно, как есть, строит строку из числа, его длины, а затем отображает каждый символ строкового представления числа, кроме минуса на себя, плюс пробел и минус, остается тем же

Вы можете увидеть это работает здесь: https://ideone.com/FG4lsB

cliffroot
источник
4

Дьялог АПЛ , 19 17 16 байт

≢+#⍎'\d'⎕R'&+',⊢

Принимает строку и возвращает

длина
+плюс
#в
оценке корневого пространства имен
'\d'⎕R'&+'чисел добавления регулярных выражений со знаком плюс,
,за которым следует
неизмененная строка

–3 благодаря ngn

Адам
источник
3

Matlab, 76 67 байт

n=input('');t=num2str(n)-48;if(n<0)t(1)=0;t(2)=-t(2);end
n+sum(t+1)

9 байтов сохранено благодаря @Luis Mendo

Объяснение:

n=input('');     -- takes input
t=num2str(n)-48; -- makes it a string and then array of digits with "-" becoming -3 (48 is code for 0)
if(n<0)
t(1)=0;          -- set first element (-3) to 0
t(2)=-t(2);      -- the second element is the most significant digit, so we have to negate it
end
n+sum(t+1)       -- take sum of n, sum of all digits and length of t
                    (guaranteed by +1 of every element)
pajonk
источник
1
sum(t+1)+nкорочеsum([n numel(t) t])
Луис Мендо
1
Вау, я провел некоторое время, думая, почему это работает. Большое спасибо!
pajonk
3

постоянный ток, 57 байт

dc -e"0 1?rdsc*d[1r]s+d0>+dZr[+la10~lc*rdsaZ1<A]sAdsaZ1<Ala+++f"

Разъяснение:

0 1      # Push 0, then 1 on the stack
?        # Wait for input from stdin
         # If input is negative, the leading minus will subtract 1 from 0
r        # Swap (rotate) top two items on stack.
         # Stack status if input (`$') was...
         #       positive                    negative
         # TOP       1     <- coefficient ->    -1
         #           $                           $
         #           0
dsc      # Store a copy of coefficient in `c'
*        # Multiply input by coefficient:
         #  If input was positive, it stays positive.
         #  If input was negative, it's actually interpreted as positive.
         #   In this case, multiply by -1 to make it negative.
d        # Duplicate signed input
[1r]s+   # Define a function `+': Push 1 and rotate
d 0>+    # If input is negative, push 1 underneath the top of the stack
         # This 1 represents the length of the `-` in the input
         # Note that the stack now has 3 items on it, regardless of input sign
dZ       # Push the length of the input (not including leading minus)
r        # Rotate, moving a copy of the input to the top
[        # Begin function definition
 +       # Add top two items of stack
 la      # Load value from `a' (which holds nothing at time of function definition)
 10~     # Slice the last digit off `a' (spoiler: `a' is going to hold the input while
         #  we gather its digits)
 lc*     # Multiply digit by coefficient
         #  Since the input is signed, the input modulo 10 will have the same sign.
         #  We want all digits to be positive, except the leftmost digit, which should
         #   have the sign of the input.
         #  This ensures that each digit is positive.
 r       # Rotate: move remaining digits to top of stack
 dsa     # Store a copy of the remaining digits in `a'
 Z 1<A   # Count the number of digits left; if more than 1, execute A
]sA      # Store the function as `A'
d sa     # Store a copy of the input in `a'
         #  Props to you if you're still reading this
Z 1<A    # Count the number of digits left; if more than 1, execute A
la       # Load leftmost digit of input (still signed appropriately)
+++      # Add the top four items on the stack
f        # Dump stack

Это было намного сложнее, чем я ожидал! Хороший вызов :)

Джо
источник
Я взял на себя обязательство не смотреть на вас, пока мой не работал, чтобы увидеть, были ли у нас похожие подходы ... Но я вижу, что вы можете вернуть байт, поменяв свой 10~на a A~!
brhfl
3

Bash + coreutils, 36 байт

bc<<<$1+${#1}+$(sed s:\\B:+:g<<<0$1)

Объяснение:

     $1+                      # the input number (+)
     ${#1}+                   # the length of the number, the '-' sign included (+)
     $(sed s:\\B:+:g<<<0$1)   # insert '+' between two consecutive word characters
                              #A word character is any letter, digit or underscore.
bc<<<                         # calculate the sum

В sed \Bтакже совпадает между двумя последовательными несловыми символами, поэтому для отрицательного числа он совпадает между «^» и «-». Обратите внимание на 0$1трюк, необходимый для того, \Bчтобы дать 0-1+2+3, например.

Пример выполнения: «input.txt» содержит все контрольные примеры в формулировке вопроса

while read N;do echo "$N -> "$(./ILD_sum.sh "$N");done < input.txt

Выход:

87901 -> 87931
123 -> 132
99 -> 119
5 -> 11
1 -> 3
0 -> 1
-3 -> -4
-99 -> -96
-123 -> -115
-900 -> -905
-87901 -> -87886
seshoumara
источник
@DigitalTrauma, который не будет работать для отрицательных целых чисел.
Сешумара
@DigitalTrauma Ну, да (но размер кода не изменится) и нет (если sed оставить как есть). Причина в том, что обратная косая черта будет обрабатываться по-разному при использовании подстановки команд с обратными чертами по сравнению с $(). Есть два альтернативных способа сделать это с помощью обратных кавычек, но оба дают 36-байтовое решение в конце: sed 's:\B:+:g'<<<0$1и sed s:\\\B:+:g<<<0$1.
Сешумара
2

PowerShell v4, 48 байт

param($n)$n,"$n".length+[char[]]"$n"-join'+'|iex

Это должно работать в v2 +, но я тестировал только в v4.

Принимает участие $n. Создает новый массив с ,оператором, состоящим из $nи .lengthкогда $nпреобразуется в строку. Объединяет с этим строку, $nприведенную как массив символов. Затем весь этот массив -joinредактируется вместе с ним +перед передачей iex(аналогично eval). Результат остается на конвейере, а вывод неявным.

Например, для ввода -123массив будет выглядеть так (-123, 4, -, 1, 2, 3), а строка после -joinбудет выглядеть -123+4+-+1+2+3. Затем Invoke-Expressionпроисходит, и результат, -115как и ожидалось.

AdmBorkBork
источник
2

Коэффициент с load-all, 175 байтов

Ну, это не очень коротко. Особая обработка унарного минуса действительно раздражает; Я думаю, я мог бы сделать это лучше, и я буду, возможно.

[ dup [ 10 >base length ] [ [ 10 >base >array [ 48 - ] V{ } map-as ] [ 0 < ] bi [ reverse dup pop* dup pop swap [ neg ] dip dup [ push ] dip ] [ ] if 0 [ + ] reduce ] bi + + ]

Используя это регулярное выражение подстановки:

s/(-?[\d]+)\s*->\s*(-?[\d]+)/{ $2 } [ $1 calculate-ild ] unit-test/g

Мы можем превратить контрольные примеры OP в набор тестов Factor.

USING: arrays kernel math math.parser sequences ;
IN: sum-ild

: sum-digits ( n -- x )
    [ number>string >array [ 48 - ] V{ } map-as ]
    [ 0 < ]
    bi
    [
      reverse dup pop* dup pop swap [ neg ] dip dup [ push ] dip
    ]
    [ ] if
    0 [ + ] reduce ;

: calculate-ild ( n -- x )
  dup
  [ number>string length ]
  [ sum-digits ]
  bi + + ;

USING: tools.test sum-ild ;
IN: sum-ild.tests

{ 87931 } [ 87901 calculate-ild ] unit-test
{ 132 } [ 123 calculate-ild ] unit-test
{ 119 } [ 99 calculate-ild ] unit-test
{ 11 } [ 5 calculate-ild ] unit-test
{ 3 } [ 1 calculate-ild ] unit-test
{ 1 } [ 0 calculate-ild ] unit-test
{ -4 } [ -3 calculate-ild ] unit-test
{ -115 } [ -123 calculate-ild ] unit-test
{ -905 } [ -900 calculate-ild ] unit-test
{ -87886 } [ -87901 calculate-ild ] unit-test
Кот
источник
2

C #, 118 байт

int k(int a){var s=a.ToString();for(int i=0;i<s.Length;a+=s[i]<46?-(s[++i]-48)+ ++i-i:(s[i++]-48));return a+s.Length;}
ScifiDeath
источник
То, что вам нужно пространство, 1+ ++iсовершенно нелепо
кошка
Вы правы, но я не знал, как это сделать без этого ...
ScifiDeath
1
Вы можете сделать, s[i]<46чтобы проверить на минус
Cliffroot
@ScifiDeath Не можете ли вы сделать ++i+1?
Эрик Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Нет, из-за глупого порядка оценки инфикса по математике
кот
2

SpecBAS - 147 байт

1 INPUT a$: l=LEN a$: b$="text "+a$+"+"+STR$ l+"+": FOR i=1 TO l: b$=b$+a$(i)+("+" AND i<l): NEXT i: EXECUTE b$

Создает строку, которая затем запускается. К сожалению EXECUTE, не работает с ?сокращением для PRINT, но TEXTсохранил 1 символ.

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

Брайан
источник
2

C #, 106 байт

Я бью Java мой байт, моя жизнь завершена

int r(int n){var s=n+"";return n+s.Length+s.Select((k,j)=>int.Parse(s[k==45?1:j]+"")*(k==45?-2:1)).Sum();}

Ungolfed (вроде)

    public static int r(int n)
    {
            var s = n + "";
            return n + s.Length + s.Select((k, j) =>int.Parse(s[k==45?1:j]+"")*(k==45?-2:1)).Sum();
    }
downrep_nation
источник
2
уверен, что вы можете заменить строку на var и '-' на 45
ScifiDeath
можно сделать (n)=>{....для анонимной лямбды
кошка
кошка не могли бы вы уточнить? Я пытаюсь понять это сам, но это не работает для меня. я никогда этого не делал
downrep_nation
Я знаю, что это было давно, но вы можете n=>n+(n+"").Length+(n+"").Select((k,j)=>int.Parse((n+"")[k<48?1:j]+"")*(k<48?-2:1)).Sum()увеличить его до 89 байт: хотя вам придется добавить +18, using System.Linq;что вы также забыли в своем текущем ответе.
Кевин Круйссен
2

Java 8, 174 136 122 107 105 93 78 байт

i->{int f=0;for(int j:(i+"").getBytes())i+=j<48?f++:f-->0?50-j:j-47;return i;}

-14 байт благодаря @LeakyNun .
-15 байт благодаря @cliffroot .

Объяснение:

Попробуйте онлайн.

i->{                   // Method with integer as both parameter and return-type
  int f=0;             //  Integer-flag, starting at 0
  for(int j:(i+"").getBytes())
                       //  Loop over the digits as bytes
    i+=                //   Increase the input with:
       j<48?           //    If the current byte is '-':
        f++            //     Increase the input with the flag-integer `f` (which is 0),
                       //     and increase the flag-integer `f` by 1 afterwards
       :               //    Else:
        f-->0?         //     If the flag-integer `f` is 1,
                       //     and decrease the flag-integer `f` back to 0 afterwards
         50-j          //      Increase it with 50 minus the current byte
        :              //    Else
         j-47;         //     Increase it with the byte as digit
                       //      + 1 to cover for the length part in ILD
  return i;}           //  Return the modified input as result
Кевин Круйссен
источник
1
int c(int i){char[]c=(i+"").toCharArray();int x=i,l=c.length,s=i+l,j=-1;for(;++j<l;x=1)s+=x>0?c[j]-38:38-c[++j];return s;}
Утренняя монахиня
1
int c(int i){char[]c=(i+"").toCharArray();for(int x=i,j=-1;++j<c.length;i+=1+Integer.parseInt(x<0?"-"+--c[j+=x=1]:c[j]+""));return i;}наконец, я почувствовал, как игра в гольф на Java @ LeakyNun работает ваш вариант? сначала он дает неправильные ответы, а затем вылетает.
Cliffroot
@LeakyNun Ваш код не выполняется в тестовом примере для 0.
Кевин Круйссен
1
О, как смешно; измените два вхождения 38на 48.
Утренняя монахиня
1
int c(int i){byte[]c=(i+"").getBytes();for(int j=-1;++j<c.length;i+=(c[j]<48?50-c[++j]:c[j]-47));return i;}яй
cliffroot
1

Perl 6 - 30 байт

Как буквально, как это становится

{$^a+$^a.chars+[+]($^a.comb)}

Используйте это как анонимную функцию

> {$^a+$^a.chars+[+]($^a.comb)}(99)
119 
malkaroee
источник
1

JavaScript (ES6), 38 байт

n=>eval([n+=``,n.length,...n].join`+`)

Использует старый трюк с присоединением и оценкой. Сохраните 4 байта, если я могу настаивать на вводе строки:

f=
n=>eval([n,n.length,...n].join`+`)
;
<input type=number oninput=o.value=f(this.value)><input id=o readonly>

Нил
источник
«Добавьте 4 байта, если мне нужно разрешить как целые числа, так и строки, представляющие целые числа». Вы не делаете этого, выбор необязателен, но, вероятно, 99,9% выберут целое число. Я в основном добавил его для редких языков, которые поддерживают только строки, но я уберу эту часть из моего вопроса, так как почти все языки поддерживают.
Кевин Круйссен
@KevinCruijssen Извините за неясность ранее; 34-байтовая версия работает только со строками.
Нил
1

C ++, 255 байт

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main(){
    string input;
    cin >> input;
    int sum = atoi(input.c_str()) + input.length();
    for(unsigned i = 0; i < input.length(); ++i)
        sum += input.at(i) - 48;
    return 0;
}
tachma
источник
1

Perl 5 - 37 байт

warn eval(join'+',/./g)+($_+=()=/./g)

Ввод в $ _

Kaundur
источник
1

Javascript (с использованием внешней библиотеки) (45 байт)

Используя библиотеку, которую я написал, чтобы привести LINQ в Javascript, я смог написать следующее:

(i)=>i+(i+"").length+_.From(i+"").Sum(x=>x|0)

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

applejacks01
источник
1
Ссылка на библиотеку?
этап
github.com/mvegh1/Enumerable . Пока нет документов, извините
applejacks01
1

С 132 116 113 80

t,c;f(char*v){for(c=atoi(v+=t=*v==45);*v;t=0,++v)c+=t?50-*v-2*c:*v-47;return c;}

Функция f()принимает входные данные в виде строки и возвращает результат в виде целого числа. Полная версия программы (113 байт):

t;main(int c,char**v){char*p=v[1];c=atoi(p+=t=*p==45);for(c=t?-c:c;*p;++p,t=0)c+=t?50-*p:*p-47;printf("%d\n",c);}

Требуется один аргумент.

owacoder
источник
1

Perl, 27 байт

Код 22 байта + 5 для -paF.

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

объяснение

Использует -aопцию autosplit с пустым delimiter ( -F), создающим массив переданных цифр. Использует магическую переменную, $"которая контролирует, какой символ используется для объединения массива, когда он интерполируется в строку (мы используем"+" здесь), и тот факт, что список используется в скалярном контексте и возвращает длину списка (количество цифр).

использование

echo -n 99 | perl -paF -e'$"="+";$_+=@F+eval"@F"'
119

Perl, 27 байт

Код 22 байта + 5 для -paF.

Альтернативное решение, это гораздо более читабельно, не более байтов. Я предпочитаю другой, так как он выглядит более загадочно!

$_+=@F+eval join"+",@F
Дом Гастингс
источник
1

постоянный ток, 56 байт

?dZrdd1sa[1+r0r-_1sa]sb0>b[A~rd0<x]dsxxrla*[+z1<y]dsyxp

Не короче, чем у Джо, но несколько иная реализация (и та, которая принимает отрицательные числа как входные данные вместо команды вычитания). Возможно, можно играть в гольф больше, но обед длится так долго.

?                #input
dZrdd            #find no. of digits, rotate to bottom of stack, dup input twice
1sa              #coefficient for first digit stored in register 'a'
[1+r0r-_1sa]sb   #macro 'b' executes on negative numbers. add one (for the neg. sign)
                 #rotate this value out of the way, leave a positive copy on top
0>b              #run the above macro if negative
[A~rd0<x]dsxx    #create and run macro 'x'; mod 10 to grab least significant digit
                 #keep doing it if quotient is greater than zero
rla*             #a zero remains in the way of our most significant digit, rotate it down
                 #and multiply said digit by our coefficient 'a' from earlier
[+z1<y]dsyx      #add two top stack values (we left that zero there to ensure this always
                 #works), check stack depth and keep doing it while there's stack
p                #print!
brhfl
источник
1

R, 108 байт

Немного опоздал на вечеринку снова, но здесь это идет:

s=strsplit(paste(n<-scan()),"")[[1]];n+nchar(n)+sum(as.integer(if(n<0)c(paste0(s[1],s[2]),s[1:2*-1])else s))

Чтобы обычно разбивать цифры любого числа (например, суммировать их), R требует, чтобы мы сначала преобразовали в строку, а затем разбили строку на строковый вектор. Чтобы суммировать элементы, вектор строки должен быть преобразован в числовое или целое число. Это вместе с исключением с суммой цифр отрицательного числа съедает много байтов.

Исключение может быть немного изменено (до 96 байт), если разрешены предупреждающие сообщения.

s=as.integer(strsplit(paste(n<-scan()),"")[[1]]);if(n<0){s[2]=s[2]*-1;s=s[-1]};n+nchar(n)+sum(s)

В этом случае строковый вектор преобразуется в целое число напрямую с помощью as.integer. Однако, для отрицательных чисел первого элемент вектора будет знаком минус: "-". Это вызывает некоторые проблемы, например: as.numeric(c("-",1,2,3))вернется NA 1 2 3и предупреждающее сообщение. Чтобы обойти это, удалите NA, а затем умножьте первый элемент на, -1прежде чем брать сумму.

Billywob
источник
1

RProgN, 30 байт

] '' . ] '-?.' | sum _ \ L + +

Explination

]               # Clone the input
                #
'' . ]          # Convert it to a string, then clone it again.
'-?.' | sum     # Split it into chunks via the pattern '-?.' (A - if there is one, followed by a single character). Sum the resulting array.
_               # Floor the value, purely because I hate floats.
\ L + +         # Swap the top value with the value underneith it, to work with the string again. Get it's length, add the top, middle, and bottom, which is now the length, the sum and the input respectively.

Попробуйте онлайн!

Ataco
источник
1

AWK , 64 63 61 байт

{s=j=0;for(;j++<n=split($1,a,"");s+=$1>0||j-2?a[j]:-a[j]);$0+=n+s}1

Попробуйте онлайн!

Ссылка TIO имеет 6 дополнительных байтов s=j=0;для многострочного ввода. Это самый короткий метод, который я мог придумать. Мне любопытно, можно ли это сделать короче AWK.

Сохранено 2 байта, спасибо Кевину

Роберт Бенсон
источник
1
Не может $0=n+s+$0быть в гольф $0+=n+s(-2 байта)?
Кевин Круйссен,
Вы абсолютно правы @KevinCruijssen. Я такой глупый.
Роберт Бенсон