คำนวณผลรวมของ 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 Nope -1 + 2 + 3มันควรจะเป็น สำหรับความท้าทายนี้ฉันเลือกที่จะรวม-/ ลบเครื่องหมายหลักแรกเป็นตัวเลขลบหนึ่งหลักเพื่อให้น่าสนใจขึ้นอีกเล็กน้อย
Kevin 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

ลองออนไลน์

บันทึก 10 ไบต์ขอบคุณ @Adnan


2
โชคดีที่ไม่ 05AB1E ÐgsS'+ýOอัตโนมัติประเมินการแสดงออกทางคณิตศาสตร์เพื่อให้คุณสามารถทำสิ่งนี้:
Adnan

1
@Adnan: ดี! ฉันไม่รู้ว่ามันทำ
Emigna

13

Python 2, 39 ไบต์

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

ชุดทดสอบ

ใช้ EVAL เคล็ดลับเช่นเดียวกับในของฉันPyth คำตอบ


ผมไม่เคยใช้งูหลามเพื่อให้ลืมความไม่รู้เป็นไปได้ของฉัน แต่อย่างไรevalและjoinรู้ว่าจะใช้หลักแรกเชิงลบสำหรับการป้อนข้อมูลเชิงลบได้อย่างไร ผมจะคาดหวัง-123ที่จะกลายเป็นสิ่งที่ชอบ- + 1 + 2 + 3เขียนออกมา แต่เห็นได้ชัดว่ามันไม่ได้ .. (หรือจะเป็นโดยอัตโนมัติและรวม- + 1ไป-1เป็นขั้นตอนที่สอง?)
เควิน Cruijssen

2
@KevinCruijssen เช่นคุณกล่าวว่า-123จะกลายเป็น"-+1+2+3"หลังจากที่เข้าร่วมที่ทำให้ผลที่ถูกต้องเมื่อคุณevalมัน ลองยกตัวอย่างซึ่งผลในการeval("-+1") -1
Denker

1
@KevinCruijssen ->- + 1 - 1ผู้ประกอบการบวกเอกที่มีอยู่เพื่อให้เป็นหลักเช่นเดียวกับ- + 1 เหมือนกับตัวเลข -(+(1))+aa
Erik the Outgolfer

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

Brachylog , 35 32 ไบต์

LL,: EF +:: L + I (0> H: 2 *: IR-: 1 + .; ฉัน.)
(? 0> H: 1 - ฉัน; I0) LL, ,? 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"?
Erik the Outgolfer

แน่นอนคุณไม่ต้องการพื้นที่หลังจากอัญประกาศname="i" select="..."เช่น<with-param name="i"select="substring($i,$s+2)"/>?
แมว

@cat มีเพียงสามรายการในเอกสารทั้งหมดและการลบช่องว่างทำให้ xsltproc สำลัก
psmay

1
@psmay โอ้มันแปลกมาก Erik บอกว่าถ้าคุณลบเครื่องหมายอัญประกาศอาจเป็นเทคนิคที่ไม่ถูกต้องตามมาตรฐาน แต่ยังคงทำงานได้อย่างถูกต้องเช่น 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 )และ evals ทุกอย่างจะสวยอย่างที่มันเป็นมาสร้างสตริงจากจำนวนความยาวของมันแล้วแมปสัญลักษณ์ของการแทนสตริงแต่ละจำนวนยกเว้นลบตัวมันเองบวกช่องว่างและลบยังคงเหมือนเดิม

คุณสามารถเห็นมันทำงานที่นี่: https://ideone.com/FG4lsB


4

Dyalog APL , 19 17 16 ไบต์

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

รับค่าสตริงและส่งคืน

length
+plus
#ใน
การประเมินรูทเนมสเปซของ
'\d'⎕R'&+'regex ต่อท้ายตัวเลขด้วยเครื่องหมายบวก
,ตามด้วย
สตริงที่ไม่ได้แก้ไข

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

1
sum(t+1)+nสั้นกว่าsum([n numel(t) t])
Luis Mendo

1
โอ้โหฉันใช้เวลาซักพักคิดว่าทำไมมันถึงใช้ได้ เยี่ยมมากขอบคุณ!
pajonk

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

มันซับซ้อนกว่าที่ฉันคาดไว้มาก! ความท้าทายที่ดี :)


ฉันทำให้มองไม่เห็นคุณจนกว่าฉันจะทำงานเพื่อดูว่าเรามีวิธีการที่คล้ายกัน ... แต่ฉันเห็นว่าคุณจะได้รับ byte กลับโดยการแลกเปลี่ยนของคุณ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 ถูกทิ้งไว้ตามที่เป็น) เหตุผลก็คือว่าเครื่องหมายจะได้รับการปฏิบัติที่แตกต่างกันเมื่อใช้แทนคำสั่งกับ backticks $()เมื่อเทียบกับ มีสองทางเลือกที่จะทำกับ backticks แต่ทั้งสองให้ 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ถูกแปลงเป็นสตริง เชื่อมต่อกับสตริงนั้น$ncast เป็น char-array จากนั้นอาร์เรย์ทั้งหมดจะถูก-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 + + ]

ใช้ regex ทดแทนนี้:

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เพื่อตรวจสอบเครื่องหมายลบ
หน้าผา

@ScifiDeath คุณทำ++i+1ไม่ได้เหรอ?
Erik the 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();
    }

2
ค่อนข้างแน่ใจว่าคุณสามารถแทนที่สตริงด้วย var และ '-' ด้วย 45
ScifiDeath

คุณสามารถทำ(n)=>{....แลมบ์ดานิรนามได้
cat

คุณสามารถอธิบายรายละเอียดของแมวได้ไหม ฉันพยายามคิดออกเอง แต่มันไม่ทำงานสำหรับฉัน ฉันไม่เคยทำอย่างนั้น
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;ซึ่งคุณลืมคำตอบปัจจุบันของคุณด้วย
Kevin Cruijssen

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 @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;}
Leun 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;}ในที่สุดก็รู้สึกเหมือนเล่นกอล์ฟใน Java @LeakyNun ตัวแปรของคุณทำงานอย่างไร มันให้คำตอบที่ผิดในตอนแรกและจากนั้นเกิดปัญหา
หน้าผา

@LeakyNun 0รหัสของคุณล้มเหลวในกรณีการทดสอบสำหรับ
Kevin Cruijssen

1
โอ้ช่างน่าหัวเราะ เปลี่ยนทั้งสองเกิดขึ้นของการ38 48
Leun 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 ไบต์

ตามตัวอักษรที่ได้รับ

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

ใช้เป็นฟังก์ชั่นไม่ระบุชื่อ

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

1

JavaScript (ES6), 38 ไบต์

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

ใช้เคล็ดลับการเข้าร่วมและ Eval แบบเก่า บันทึก 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 ไบต์ใช้งานได้กับสตริงเท่านั้น
Neil

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

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

ฟังก์ชั่น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 รหัสไบต์ + -paF5

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

คำอธิบาย

ใช้ -aตัวเลือก autosplit โดยใช้ตัวคั่นว่างเปล่า ( -F) สร้างอาร์เรย์ของตัวเลขที่ส่งผ่านใช้ตัวแปรเวท$"ซึ่งควบคุมว่าอักขระใดที่จะใช้ในการเข้าร่วมอาร์เรย์เมื่อถูกแทรกเข้าไปในสตริง (เราใช้"+"ที่นี่) และข้อเท็จจริงที่ว่ารายการ ใช้ในบริบทสเกลาร์จะส่งคืนความยาวของรายการ (จำนวนหลัก)

การใช้

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

Perl, 27 ไบต์

รหัส 22 ไบต์ + 5 สำหรับ -paF5

ทางเลือกอื่นนั่นเป็นจำนวนมากที่อ่านได้ไม่เกินไบต์ ฉันชอบอีกอันเพราะมันดูลึกลับมากขึ้น!

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

1

dc, 56 ไบต์

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

ไม่สั้นกว่าของ Joe ด้านบน แต่มีการนำไปใช้ที่แตกต่างกันบ้าง (และอีกอันหนึ่งที่ใช้จำนวนลบเป็นอินพุตกับคำสั่งการลบ) สามารถเล่นกอล์ฟได้มากกว่านี้ แต่อาหารกลางวันจะอยู่ได้นาน

?                #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 ต้องการให้เราแปลงเป็นสตริงก่อนแล้วจึงแยกสตริงเป็นเวกเตอร์สตริง เพื่อสรุปองค์ประกอบเวกเตอร์สตริงจะต้องถูกแปลงเป็นตัวเลขหรือจำนวนเต็ม ซึ่งรวมถึงข้อยกเว้นด้วยผลรวมของตัวเลขของจำนวนลบจะกินจำนวนมาก

ข้อยกเว้นสามารถ golfed บิต (ถึง 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 + +

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.

ลองออนไลน์!



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 ไบต์ขอบคุณ Kevin


1
ไม่$0=n+s+$0สามารถเล่นกอล์ฟถึง$0+=n+s(-2 ไบต์) ใช่หรือไม่
Kevin Cruijssen

@KevinCruijssen ถูกต้องแล้ว โง่ฉัน
Robert Benson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.