Hitung jumlah ILD


21

Memasukkan:

Bilangan bulat

Keluaran:

Jumlah input itu sendiri + panjang input + setiap digit input individu.

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

Contoh:

Input: 99
Output: 99(nr) + 2(panjang nr) + (9 + 9)(digit) →119

Input: 123
Output: 123 + 3 + (1 + 2 + 3)132

Aturan tantangan:

  • Input juga dapat berisi input negatif, yang diselesaikan khusus. Tanda -/ minus juga +1untuk panjangnya, dan merupakan bagian dari yang pertama digit.
    Sebagai contoh:

    Input: -123
    Output: -123 + 4 + (-1 + 2 + 3)-115

  • Anda dapat mengasumsikan bahwa input atau output tidak akan pernah berada di luar kisaran integer (32-bit).

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji:

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

Semi-terkait: Hitung Jumlah semua Digit


Saya pikir dengan angka negatif, misalnya -123rantai penjumlahan seharusnya (-1 + 1 + 2 + 3)bukan (-1 + 2 + 3), bukan?
Yytsi

@ TuukkaX Tidak, seharusnya begitu -1 + 2 + 3. Untuk tantangan ini saya memilih untuk menggabungkan -/ minus-tanda ke digit pertama sebagai satu digit negatif untuk membuatnya sedikit lebih menarik.
Kevin Cruijssen

Jawaban:


10

05AB1E, 28 20 18 8 byte

ÐgsS'+ýO

Penjelasan

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

Cobalah online

Disimpan 10 byte berkat @Adnan


2
Untungnya, 05AB1E melakukan auto-evaluasi ekspresi aritmatika, sehingga Anda dapat melakukan ini: ÐgsS'+ýO.
Adnan

1
@ Adnan: Bagus! Saya tidak tahu itu benar.
Emigna

13

Python 2, 39 byte

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

Suite uji

Menggunakan eval-trick yang sama seperti pada Pyth-answer saya .


Saya tidak pernah menggunakan Python, jadi lupakan kemungkinan ketidaktahuan saya, tetapi bagaimana cara evaldan jointahu untuk mengambil digit pertama negatif untuk input negatif? Saya akan mengharapkan -123untuk menjadi sesuatu seperti - + 1 + 2 + 3ditulis, tapi rupanya itu tidak .. (Atau itu, dan secara otomatis bergabung - + 1ke -1sebagai langkah kedua?)
Kevin Cruijssen

2
@KevinCruijssen seperti yang Anda katakan -123menjadi "-+1+2+3"setelah bergabung yang menghasilkan hasil yang benar ketika Anda evalmemilikinya. Coba eval("-+1")misalnya yang menghasilkan -1.
Denker

1
@KevinCruijssen - + 1-> - 1. Operator plus unary ada, jadi - + 1pada dasarnya sama dengan -(+(1)). +asama dengan a, untuk angka.
Erik the Outgolfer

9

Pyth, 11 10 byte

Terima kasih kepada @LeakyNun untuk satu byte!

++vj\+`Ql`

Suite uji

Penjelasan

++ vj \ + `Ql`QQ # Q = input, dua terakhir ditambahkan secara implisit

  vj \ + `Q # Bergabung dengan input pada '+' dan evaluasi
        l`Q # Panjang input
           Q # Input itu sendiri
++ # Tambahkan ketiga nilai tersebut untuk mendapatkan hasilnya

7

CJam, 18

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

Cobalah online

Penjelasan:

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

Brachylog , 35 32 byte

lL,?: ef +:?: L + I, (0>? h: 2 *: Ir-: 1 +.; I.)
lL, (0>? h: 1 - I; I0) ,? b: ef +:?: L: I +.

Penjelasan

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 (tanpa EXSLT), 673 byte

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

Ringan meningkat:

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

Jalankan menggunakan xsltproc:

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

Ya, ild.xslditeruskan dua kali: Sekali sebagai dokumen XSLT dan kemudian sebagai dokumen XML yang akan diubah. Dokumen input harus ada karena prosesor XSLT umumnya mengharuskan satu untuk mulai berjalan. (XSLT dirancang untuk mendefinisikan transformasi dari dokumen masukan menjadi dokumen keluaran; menjalankan transformasi semata-mata dengan parameter baris perintah seperti yang saya lakukan di sini tidak biasa.) Untuk program ini, dokumen XML yang terbentuk dengan baik akan cukup sebagai input , dan, XSLT sebagai aplikasi XML, setiap transformasi XSLT yang baik adalah definisi dokumen XML yang baik.


1
Memberi +1 untuk menggunakan sesuatu yang sama sekali tidak dimaksudkan untuk menghitung angka dan tetap membuatnya bekerja.
DJMcMayhem

Tidak bisakah Anda menghapus beberapa kutipan untuk membuatnya "tidak valid tapi bagus untuk codegolf"?
Erik the Outgolfer

Tentunya Anda tidak perlu spasi setelah tanda kutip di name="i" select="..."eg <with-param name="i"select="substring($i,$s+2)"/>?
kucing

@ kucing Hanya ada tiga di seluruh dokumen, dan benar-benar menghapus ruang menyebabkan xsltproc tersedak.
psmay

1
@psmay Oh, itu aneh. Erik mengatakan jika Anda menghapus tanda kutip, secara teknis dapat menjadi tidak valid sesuai dengan standar tetapi masih berfungsi dengan baik seperti HTML, sebagian besar implementasi yang akan membuat tag tanpa nilai atribut yang dikutip <p id=hello>dll. Saya kira jikaxsltproc peduli tentang spasi putih itu tidak akan membiarkan tanda kutip hal oleh.
kucing

4

MATL, 20 byte

tVtnw48-PZ}t0<?x_]vs

Cobalah secara Online

Semua uji kasus

Penjelasan

        % 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 byte

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

Fungsi anonim yang membangun string yang mirip (+ -123 4 -1 2 3 )dan mengevaluasinya. Semuanya cukup verbose seperti itu, membangun string dari angka, panjangnya, dan kemudian memetakan setiap simbol representasi string dari angka kecuali minus untuk dirinya sendiri ditambah ruang dan minus tetap sama

Anda dapat melihatnya berjalan di sini: https://ideone.com/FG4lsB


4

Dyalog APL , 19 17 16 byte

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

Mengambil string dan kembali

panjang
+plus
#di root namespace
evaluasi
'\d'⎕R'&+'regex append digit dengan plus
,diikuti
string yang tidak dimodifikasi

–3 terima kasih kepada ngn


3

Matlab, 76 67 byte

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

9 byte disimpan berkat @Luis Mendo

Penjelasan:

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)+nlebih pendek darisum([n numel(t) t])
Luis Mendo

1
Wah, saya menghabiskan waktu memikirkan mengapa ini berhasil. Terima kasih banyak!
pajonk

3

dc, 57 byte

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

Dijelaskan:

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

Ini jauh lebih rumit dari yang saya duga! Tantangan bagus :)


Saya berusaha tidak melihat Anda sampai saya bekerja untuk melihat apakah kami memiliki pendekatan yang sama ... Tapi saya melihat Anda bisa mendapatkan byte kembali dengan menukar Anda 10~untuk A~!
brhfl

3

Bash + coreutils, 36 byte

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

Penjelasan:

     $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

Selain itu, \Bjuga cocok antara dua karakter non-kata berturut-turut, jadi untuk angka negatif cocok dengan '^' dan '-'. Perhatikan 0$1trik yang diperlukan untuk \Bmemberi 0-1+2+3, misalnya.

Jalankan contoh: 'input.txt' berisi semua kasus uji dalam pernyataan pertanyaan

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

Keluaran:

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

@ DigitalTrauma yang tidak akan berfungsi untuk bilangan bulat negatif.
seshoumara

@ DigitalTrauma Yah, ya (tapi ukuran kode tidak akan berubah) dan tidak (jika sed dibiarkan apa adanya). Alasannya adalah bahwa backslash akan diperlakukan secara berbeda ketika menggunakan substitusi perintah dengan backticks dibandingkan dengan $(). Ada dua cara alternatif untuk melakukannya dengan backticks, tetapi keduanya memberikan solusi 36 byte pada akhirnya: sed 's:\B:+:g'<<<0$1dan sed s:\\\B:+:g<<<0$1.
seshoumara

2

PowerShell v4, 48 byte

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

Ini seharusnya bekerja di v2 +, tapi saya hanya menguji di v4.

Mengambil input $n. Membuat array baru dengan ,operator yang terdiri dari $ndan .lengthkapan $ndikonversi ke string. Digabungkan dengan string yang $ndilemparkan sebagai char-array. Kemudian, seluruh array itu -joindiedit bersama dengan +sebelum disalurkan ke iex(mirip denganeval ). Hasilnya dibiarkan di pipa dan output tersirat.

Misalnya, untuk input -123, array akan terlihat seperti (-123, 4, -, 1, 2, 3), dan string setelah -joinakan terlihat seperti -123+4+-+1+2+3. Kemudian Invoke-Expressionterjadi, dan hasilnya -115seperti yang diharapkan.


2

Faktor dengan load-all , 175 byte

Ya, ini tidak terlalu singkat. Penanganan khusus minus unary benar-benar menjengkelkan; Saya kira saya bisa melakukannya lebih baik dan saya akan, mungkin.

[ 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 + + ]

Menggunakan regex substitusi ini:

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

Kita bisa mengubah test case OP menjadi suite test 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 byte

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

Kenyataan bahwa Anda membutuhkan ruang dalam 1+ ++iadalah imo
cat benar

Anda benar tetapi saya tidak tahu bagaimana melakukannya tanpa ini ...
ScifiDeath

1
dapat Anda lakukan s[i]<46untuk memeriksa minus
cliffroot

@ ScifiDeath Tidak bisakah kamu melakukannya ++i+1?
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Tidak, karena urutan evaluasi bodoh matematika infix
kucing

2

SpecBAS - 147 byte

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$

Membangun string yang kemudian dijalankan. Sayangnya EXECUTEtidak bekerja dengan ?singkatan PRINT, tetapi TEXTmenyelamatkan 1 karakter.

masukkan deskripsi gambar di sini


2

C #, 106 byte

Saya mengalahkan java byte saya, hidup saya selesai

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

Tidak disatukan (agak)

    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
cukup yakin Anda dapat mengganti string dengan var dan '-' dengan 45
ScifiDeath

Anda dapat melakukannya (n)=>{....untuk lambda anonim
kucing

kucing, bisakah Anda menjelaskan? Saya mencoba mencari tahu sendiri tetapi tidak bekerja untuk saya. saya tidak pernah melakukan itu
downrep_nation

Saya tahu ini sudah lama, tetapi Anda bisa mengubahnya menjadi 89 byte: n=>n+(n+"").Length+(n+"").Select((k,j)=>int.Parse((n+"")[k<48?1:j]+"")*(k<48?-2:1)).Sum()Meskipun Anda harus menambahkan +18 using System.Linq;yang Anda juga lupa dengan jawaban Anda saat ini.
Kevin Cruijssen

2

Java 8, 174 136 122 107 105 93 78 byte

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

-14 byte terima kasih kepada @LeakyNun .
-15 byte terima kasih kepada @cliffroot .

Penjelasan:

Cobalah 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;}akhirnya terasa seperti bermain golf di Java @LeakyNun apakah varian Anda berfungsi? itu memberikan jawaban yang salah pada awalnya dan kemudian crash.
cliffroot

@ LeakyNun Kode Anda gagal pada test case for 0.
Kevin Cruijssen

1
Oh, betapa konyolnya; mengubah dua kejadian 38menjadi 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 byte

Seperti literal yang didapat

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

Gunakan itu sebagai fungsi anonim

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

1

JavaScript (ES6), 38 byte

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

Menggunakan trik gabung-dan-lama yang lama. Simpan 4 byte jika saya bisa meminta input string:

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


"Tambahkan 4 byte jika saya harus mengizinkan bilangan bulat dan string yang mewakili bilangan bulat" Anda tidak, itu opsional untuk memilih salah satu, tetapi mungkin 99,9% akan memilih bilangan bulat. Saya terutama menambahkannya untuk bahasa langka yang hanya mendukung string, tetapi saya akan menghapus bagian itu dari pertanyaan saya karena hampir setiap bahasa melakukannya.
Kevin Cruijssen

@KevinCruijssen Maaf karena tidak jelas sebelumnya; versi 34-byte hanya berfungsi pada string.
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 dalam $ _


1

Javascript (menggunakan perpustakaan eksternal) (45 byte)

Menggunakan perpustakaan yang saya tulis untuk membawa LINQ ke Javascript, saya bisa menulis yang berikut ini:

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

masukkan deskripsi gambar di sini


1
Tautan ke perpustakaan?
fase

github.com/mvegh1/Enumerable . Belum ada dokumen, maaf
applejacks01

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()mengambil input sebagai string dan mengembalikan hasilnya sebagai integer. Versi program lengkap (113 byte):

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

Membutuhkan satu argumen.


1

Perl, 27 byte

22 byte kode + 5 untuk -paF.

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

Penjelasan

Menggunakan -aopsi autosplit dengan pembatas kosong ( -F) membuat larik digit yang dilewatkan. Menggunakan variabel ajaib$" yang mengontrol karakter mana yang digunakan untuk bergabung dengan array ketika itu diinterpolasi ke dalam string (kami menggunakan"+" sini) dan fakta bahwa daftar digunakan dalam konteks skalar akan mengembalikan panjang daftar (jumlah digit).

Pemakaian

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

Perl, 27 byte

22 byte kode + 5 untuk -paF.

Solusi alternatif, itu jauh lebih mudah dibaca tanpa byte lebih. Saya lebih suka yang lain karena terlihat lebih samar!

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

1

dc, 56 byte

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

Tidak lebih pendek dari Joe di atas, tetapi implementasi yang agak berbeda (dan yang mengambil angka negatif sebagai input vs perintah pengurangan). Mungkin bisa bermain golf lebih banyak, tetapi makan siang hanya berlangsung lama.

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

Agak terlambat ke pesta lagi tapi ini dia:

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

Untuk secara umum membagi digit dari angka apa pun (misalnya untuk menjumlahkannya), R mengharuskan kita untuk terlebih dahulu mengkonversi ke string dan kemudian membagi string menjadi vektor string. Untuk meringkas elemen, vektor string harus dikonversi ke numerik atau bilangan bulat. Ini bersama-sama dengan pengecualian dengan jumlah digit angka negatif memakan banyak byte.

Pengecualian ini bisa sedikit golf (hingga 96 byte) jika pesan peringatan dibolehkan.

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

Dalam hal ini vektor string dikonversi ke integer secara langsung menggunakan as.integer. Namun, untuk angka negatif elemen pertama dalam vektor akan menjadi tanda minus: "-". Ini menyebabkan beberapa masalah, misalnya: as.numeric(c("-",1,2,3))akan kembali NA 1 2 3dan pesan peringatan. Untuk menghindari ini, hapus NA dan kemudian gandakan elemen pertama dengan -1sebelum mengambil jumlah.


1

RProgN, 30 Bytes

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

Penjelasan

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

Cobalah secara Online!



1

AWK , 64 63 61 byte

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

Cobalah online!

TIO link memiliki 6 byte tambahan s=j=0;untuk memungkinkan input multi-line. Ini adalah metode terpendek yang bisa saya buat. Saya ingin tahu apakah itu bisa dilakukan lebih pendekAWK .

Disimpan 2-byte, terima kasih Kevin


1
Tidak $0=n+s+$0bisa di-golf ke $0+=n+s(-2 byte)?
Kevin Cruijssen

@KevinCruijssen Anda benar sekali. Saya konyol.
Robert Benson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.