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です。このチャレンジでは、-/ minus-signを最初の数字に1つの負の数字としてマージして、少し面白くすることを選択します。
ケビンCruijssen

回答:


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

オンラインで試す

@Adnanのおかげで10バイト節約


2
幸いなことに、05AB1Eは算術式の自動評価を行うため、これを行うことができますÐgsS'+ýO
アドナン

1
@アドナン:いいね!私はそれがそうであることを知りませんでした。
エミグナ

13

Python 2、39バイト

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

テストスイート

私のPyth-answerと同じeval-trickを使用しています


私は、Pythonは、ので、私の可能性の無知を忘れて使用されることはありませんが、どのようにevalして、join負の入力のための負の最初の数字を取るために知っていますか?私が期待する-123ようなものになるために- + 1 + 2 + 3書き出さが、どうやらそうではない..です(あるいは、それは、それが自動的にマージ- + 1する-1?第二段階として)
ケビンCruijssen

2
@KevinCruijssenは、あなたが言った-123ように"-+1+2+3"、参加すると正しい結果が得られるようになりますevaleval("-+1")結果がである例を試してください-1
デンカー

1
@KevinCruijssen- - + 1> - 1。単項プラス演算子が存在するため- + 1、本質的にはと同じ-(+(1))です。+aは、a数字の場合と同じです。
エリックアウトゴルファー

9

Pyth、 11 10バイト

@LeakyNunに感謝します!

++vj\+`Ql`

テストスイート

説明

++ vj \ + `Ql`QQ#Q =入力、最後の2つは暗黙的に追加

  vj \ + `Q# '+'で入力を結合して評価する
        l`Q#入力の長さ
           Q#入力自体
++#これらの3つの値を追加して結果を取得します

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

Brachylog35 32バイト

lL、?:ef +:?:L + I、(0>?h:2 *:Ir-:1 + .; I。)
lL、(0>?h: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.xsl2回渡されます。一度はXSLTドキュメントとして、次にXMLドキュメントとして変換されます。XSLTプロセッサは通常、実行を開始するために入力ドキュメントを必要とするため、入力ドキュメントが存在する必要があります。(XSLTは、入力ドキュメントから出力ドキュメントへの変換を定義するように設計されています。ここで行ったように、コマンドラインパラメーターのみを使用して変換を実行するのは一般的ではありません。) XSLTはXMLのアプリケーションであり、整形式のXSLT変換は、定義により整形式のXMLドキュメントです。


1
+1は、数値を計算してとにかく動作させることを完全に意図していないものを使用したことに対するものです。
DJMcMayhem

引用符をいくつか削除して「無効ですが、codegolfに適している」ようにできませんか?
エリックアウトゴルファー16

name="i" select="..."たとえば、引用符の後にスペースは必要ありません<with-param name="i"select="substring($i,$s+2)"/>か?

@catドキュメント全体には3つしかありません。実際にスペースを削除すると、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

Dyalog APL19 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)

@Luis Mendoのおかげで9バイト節約

説明:

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
おっと、これがなぜ機能するのかを考えながらしばらく過ごしました。まことにありがとうございます!
パジョン

3

dc、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では、\B2つの連続する非単語文字間でも一致するため、負の数の場合は「^」と「-」の間で一致します。例えば、与える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がそのままの場合)。理由は、バックスラッシュでコマンド置換を使用する場合、バックスラッシュとは異なる扱いになるためです$()。そこバッククォートでそれを行うには、2つの代替方法がありますが、最終的に36バイトの溶液を得両方:sed 's:\B:+:g'<<<0$1sed s:\\\B:+:g<<<0$1
seshoumara

2

PowerShell v4、48バイト

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

これ v2 +で動作するはずですが、v4でしかテストしていません。

入力を受け取ります$n,からなる演算子を使用して新しい配列を作成し$n.lengthwhenを$n文字列に変換します。文字列が文字$n配列としてキャストされることと連結します。次に、その配列全体が-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のテストケースをファクターテストスイートに変えることができます。

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は完全にとんでもないイモです

あなたは正しいが、私はこれなしでそれを行う方法を知りませんでした
...-ScifiDeath

1
s[i]<46マイナスをチェックすることができます
クリフルート

@ScifiDeathできませんか++i+1
エリックアウトゴルファー16

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀいいえ、中置数学の評価の愚かな順序のため
cat

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$

Builds up a string which then gets run. Unfortunately EXECUTE doesn't work with the ? shorthand for PRINT, but TEXT saved 1 character.

enter image description here


2

C#, 106 bytes

I beat java my a byte, my life is complete

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 (kinda)

    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
pretty sure you can replace string with var and '-' with 45
ScifiDeath

you can do (n)=>{.... for an anonymous lambda
cat

cat could you elaborate? im trying to figure it out by myself but its not working for me. i never did that
downrep_nation

I know it's been a while, but you can golf it to 89 bytes: n=>n+(n+"").Length+(n+"").Select((k,j)=>int.Parse((n+"")[k<48?1:j]+"")*(k<48?-2:1)).Sum() Although you'll have to add +18 for using System.Linq; which you also forgot in your current answer.
Kevin Cruijssen

2

Java 8, 174 136 122 107 105 93 78 bytes

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

-14 bytes thanks to @LeakyNun.
-15 bytes thanks to @cliffroot.

Explanation:

Try it online.

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

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;} it finally felt like golfing in Java @LeakyNun does your variant work? it gives wrong answers at first and then crashes.
cliffroot

@LeakyNun Your code fails at the test case for 0.
Kevin Cruijssen

1
Oh, how ridiculous; change the two occurrences of 38 to 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
cliffroot

1

Perl 6 - 30 bytes

As literal as it gets

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

Use it as an anonymous function

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

1

JavaScript (ES6), 38 bytes

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

Uses the old join-and-eval trick. Save 4 bytes if I can insist on string input:

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


"Add 4 bytes if I have to allow both integers and strings representing integers" You don't, it is optional to choose either, but probably 99.9% will choose integer. I mainly added it for the rare languages that only support strings, but I will remove that part from my question since almost every language does.
Kevin Cruijssen

@KevinCruijssen Sorry for being unclear earlier; the 34-byte version only works on strings.
Neil

1

C++, 255 Bytes

#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

Perl 5 - 37 Bytes

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

Input is in $_



1

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

Function f() takes the input as a string and returns the result as an integer. Full program version (113 bytes):

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

Requires one argument.


1

Perl, 27 bytes

22 bytes code + 5 for -paF.

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

Explanation

Uses the -a autosplit option with an empty delimiter (-F) creating an array of the digits passed in. Uses the magic variable $" which controls which char is used to join an array when it's interpolated into a string (we use "+" here) and the fact that a list used in scalar context will return the length of the list (the number of digits).

Usage

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

Perl, 27 bytes

22 bytes code + 5 for -paF.

Alternative solution, that's a lot more readable for no more bytes. I prefer the other as it looks more cryptic!

$_+=@F+eval join"+",@F

1

dc, 56 bytes

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

No shorter than Joe's above, but a somewhat different implementation (and one that takes negative numbers as input vs. a subtraction command). Can probably be golfed more, but lunch only lasts so long.

?                #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 bytes

A bit late to the party again but here it goes:

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))

In order to generally split the digits of any number (e.g. to sum them), R requires us to first convert to a string and subsequently split the string into a string vector. To sum up the elements, the string vector has to be converted to numeric or integer. This together with the exception with the sum of a the digits of a negative number eats up a lot of bytes.

The exception can be golfed a bit (to 96 bytes) if warning messages are allowed.

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

In this case the string vector is converted to integer directly using as.integer. However, for negative numbers the first element in the vector will be a minus sign: "-". This causes some trouble, e.g.: as.numeric(c("-",1,2,3)) will return NA 1 2 3 and a warning message. To circumvent this, remove the NA and then multiply the first element with -1 before taking the sum.


1

RProgN, 30 Bytes

] '' . ] '-?.' | 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.

Try it Online!



1

AWK, 64 63 61 bytes

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

Try it online!

TIO link has 6 extra bytes s=j=0; to allow for multi-line input. This is the shortest method I could come up with. I'm curious if it can be done shorter in AWK.

Saved 2-bytes, thanks Kevin


1
Can't $0=n+s+$0 be golfed to $0+=n+s (-2 bytes)?
Kevin Cruijssen

You are absolutely right @KevinCruijssen . Silly me.
Robert Benson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.