Обчисліть суму ILD


21

Вхід:

Ціле число

Вихід:

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

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

Приклади:

Вхід: 99
Вихід: 99(nr) + 2(nr-length) + (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


2
На щастя, 05AB1E робить автоматичну оцінку на арифметичних виразів, так що ви можете зробити це: ÐgsS'+ýO.
Аднан

1
@Adnan: Приємно! Я не знав, що це так.
Емінья

13

Python 2, 39 байт

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

Тестовий набір

Використовуючи той самий eval-трюк, як і в моєму Pyth-відповіді .


Я ніколи не використовував Python, тому забуваю моє можливе незнання, але як же evalі joinзнати, щоб взяти негативну першу цифру за негативне введення? Я хотів би очікувати , -123щоб стати чимось - то начебто - + 1 + 2 + 3написано, але , мабуть , це не .. (Або це, і вона автоматично об'єднуються - + 1в -1якості другого кроку?)
Кевін Cruijssen

2
@KevinCruijssen, як ви сказали, -123стає "-+1+2+3"після приєднання, який дає правильний результат, коли ви evalце зробите . Спробуйте, eval("-+1")наприклад, які результати призводять до -1.
Денкер

1
@KevinCruijssen - + 1-> - 1. Оператор unary plus існує, тому - + 1по суті такий же, як -(+(1)). +aте саме a, що і для чисел.
Ерік Аутгольфер

9

Pyth, 11 10 байт

Дякуємо @LeakyNun за байт!

++vj\+`Ql`

Тестовий набір

Пояснення

++ vj \ + `Ql`QQ # Q = вхід, останні два неявно додані

  vj \ + `Q # Приєднайтеся до вводу на" + "та оцініть його
        l`Q # Довжина вводу
           Q # Сам вхід
++ # Додайте ці три значення, щоб отримати результат

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

6

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

lL,?: ef +:?: L + I, (0>? h: 2 *: Ir-: 1 +; I.)
lL, (0>? год: 1 - I; I0),? b: ef +:?: 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

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.


1
+1 за використання чогось, що зовсім не призначене для обчислення кількості та змушення його працювати.
DJMcMayhem

Чи не можете ви видалити кілька лапок, щоб зробити його "недійсним, але хорошим для codegolf"?
Ерік Аутгольфер

Напевно вам не потрібно місця після лапок, 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

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


4

Діялог APL , 19 17 16 байт

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

Займає рядок і повертається

length
+плюс
#в
оцінці простору імен кореневого
'\d'⎕R'&+'додавання цифр з плюсом,
,за яким слідує
незмінений рядок

–3 завдяки ngn


3

Матлаб, 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)

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~!
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

@DigitalTrauma, яка не працюватиме для негативних цілих чисел.
seshoumara

@DigitalTrauma Ну, так (але розмір коду не зміниться) і ні (якщо sed залишиться як є). Причина полягає в тому, що зворотна косою рисою буде розглядатися по-різному при використанні підстановки команд із зворотними посиланнями порівняно з $(). Існує два альтернативних способи зробити це за допомогою зворотних посилань, але обидва дають врешті-решт 36 байт: sed 's:\B:+:g'<<<0$1і sed s:\\\B:+:g<<<0$1.
seshoumara

2

PowerShell v4, 48 байт

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

Це повинно працювати в v2 +, але я протестував лише в v4.

Бере введення $n. Створює новий масив з ,оператором, що складається з $nі .lengthколи $nперетворюється в рядок. З'єднується з тим, що рядок $nпередається як масив char. Потім весь цей масив -joinредагується разом із +тим, як переводитись у трубу iex(подібний до eval). Результат залишається на конвеєрі і вихід неявний.

Наприклад, для введення -123буде виглядати масив (-123, 4, -, 1, 2, 3), а рядок після цього -joinвиглядатиме -123+4+-+1+2+3. Тоді Invoke-Expressionтрапляється, і результат -115як очікується.


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;}

Те, що вам потрібно місця в 1+ ++iабсолютно смішному imo
кішка

Ви праві, але я не знав, як це зробити без цього ...
ScifiDeath

1
ви можете зробити, s[i]<46щоб перевірити мінус
cliffroot

@ScifiDeath Ви не можете ++i+1?
Ерік Аутгольфер

@ 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();}

Негольфінований (свого роду)

    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();
    }

2
майже впевнений, що ви можете замінити рядок на var та "-" на 45
ScifiDeath

ви можете зробити (n)=>{....для анонімного лямбда
кота

кішку, ви могли б розробити? Я намагаюся зрозуміти це сам, але це не працює для мене. я ніколи цього не робив
downrep_nation

Я знаю, що минув час, але ви можете пограти в гольф до 89 байт: n=>n+(n+"").Length+(n+"").Select((k,j)=>int.Parse((n+"")[k<48?1:j]+"")*(k<48?-2:1)).Sum()Хоча вам доведеться додати +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 працює ваш варіант? спочатку він дає неправильні відповіді, а потім виходить з ладу.
скеля

@LeakyNun Ваш код не працює в тестовому випадку для 0.
Кевін Круїйсен

1
О, як смішно; змінити два входження 38до 48.
Leaky Nun

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;}yay
скеля

1

Perl 6 - 30 байт

Настільки ж буквально, як це виходить

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

Використовуйте його як анонімну функцію

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

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% вибере цілі числа. Я в основному додав його для рідкісних мов, які підтримують лише рядки, але я вилучу цю частину з мого питання, оскільки майже кожна мова.
Kevin Cruijssen

@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;
}


1

Javascript (за допомогою зовнішньої бібліотеки) (45 байт)

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

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

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


1
Посилання на бібліотеку?
фаза

github.com/mvegh1/ Численні . Документів поки немає, вибачте
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);}

Потрібен один аргумент.


1

Perl, 27 байт

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

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

Пояснення

Використовує параметр -aautosplit з порожнім роздільником ( -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!

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перш ніж брати суму.


1

RProgN, 30 байт

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

Роз'яснення

]               # 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.

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



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 байт)?
Kevin Cruijssen

Ви абсолютно праві @KevinCruijssen. Дурний мене.
Роберт Бенсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.