นับผลรวมของตัวเลขทั้งหมด


38

ความท้าทายนี้คือการเขียนโปรแกรมหรือสคริปต์ซึ่งนับผลรวมของตัวเลขทั้งหมดภายในจำนวนเต็มตั้งแต่ 1 ถึงและรวมถึงจำนวนที่กำหนด

อินพุตหนึ่งจำนวนเต็มบวก เอาท์พุทผลรวมของตัวเลขในจำนวนนั้นและจำนวนที่น้อยกว่าทั้งหมด

ตัวอย่าง:

Input: 5 
Integer Sequence: 1, 2, 3, 4, 5
Sum of Digits: 1 + 2 + 3 +4 + 5 = 15

Input: 12
Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 
Sum of Digits: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 + 1 + 1 + 1 + 2 = 51

เพื่อความชัดเจนนี่เป็นการนับผลรวมของตัวเลขไม่ใช่จำนวนเต็ม สำหรับอินพุตหลักเดียวนี้จะเหมือนกัน อย่างไรก็ตามอินพุตที่มีขนาดใหญ่กว่า 10 จะมีการตอบสนองที่แตกต่างกัน นี่จะเป็นการตอบสนองที่ไม่ถูกต้อง :

Input: 12
Output: 78

อีกตัวอย่างหนึ่งเพื่อแสดงความแตกต่าง:

Input: 10

Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Sum of Integers (INCORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55

Digit Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0
Sum of Digits (CORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 = 46

กรณีทดสอบที่ใหญ่กว่า (การตอบสนองที่ถูกต้อง):

Input: 1000000
Output: 27000001

กฎและแนวทางปฏิบัติ:

  • รหัสที่ส่งจะต้องเป็นโปรแกรมหรือสคริปต์ที่สมบูรณ์ - ไม่ใช่เพียงฟังก์ชั่น หากรหัสนั้นต้องมีการรวมการนำเข้าและอื่น ๆ จะต้องรวมอยู่ในรหัสที่โพสต์
  • จำนวนจะต้องป้อนโดยผู้ใช้ - ไม่ตายตัว อาจได้รับการป้อนข้อมูลเป็นอาร์กิวเมนต์บรรทัดคำสั่งไฟล์ stdin หรือวิธีการอื่นใดที่ภาษาของคุณสามารถป้อนข้อมูลผู้ใช้
  • (2^64)-1รหัสจะต้องสามารถจัดการกับปัจจัยการผลิตอย่างน้อยถึง
  • รหัสควรส่งออกผลรวมเท่านั้น
  • โปรแกรมและสคริปต์ที่ส่งมาควรเป็นมิตรกับผู้ใช้และไม่สิ้นเปลืองทรัพยากรของคอมพิวเตอร์ (เช่น: พวกเขาไม่ควรประกาศอาร์เรย์ที่มีขนาดใหญ่อย่างเมามันเพื่อเก็บอักขระทุกตัว) ไม่มีโบนัสหรือการลงโทษที่เข้มงวดสำหรับเรื่องนี้ แต่โปรดเป็นโปรแกรมเมอร์ที่ดี

เกณฑ์การให้คะแนน:

กลไกการให้คะแนนหลักคือความยาวรหัส คะแนนต่ำกว่าดีกว่า โบนัสและบทลงโทษต่อไปนี้มีผลใช้งานด้วย:

  • -25 โบนัสหากรหัสของคุณสามารถจัดการกับจำนวนบวกทั้งหมดเช่น:1234567891234567891234564789087414984894900000000
  • -50 โบนัสหากรหัสของคุณสามารถจัดการกับนิพจน์อย่างง่าย55*96-12ได้ เพื่อให้มีคุณสมบัติสำหรับโบนัสนี้รหัสควรจัดการ+ - / *(เพิ่มเติม, ลบ, หาร, การคูณ) ตัวดำเนินการและบังคับใช้ลำดับของการดำเนินการ Division คือการหารจำนวนเต็มปกติ
    • ตัวอย่างที่กำหนด ( 55*96-12) 5268ประเมิน รหัสของคุณควรจะกลับเหมือนกันสำหรับทั้งของปัจจัยการผลิตเหล่านั้น - 81393คำตอบที่ถูกต้องคือ
  • -10 โบนัสหากรหัสของคุณมีคุณสมบัติเพียงพอสำหรับ -50 โบนัสและสามารถจัดการ^ผู้ประกอบการ (เลขยกกำลัง)
  • -100 โบนัสหากรหัสของคุณมีสิทธิ์ได้รับ -50 โบนัสและไม่ได้ใช้evalหรือคล้ายกับการจัดการการแสดงออก
  • +300 โทษหากรหัสของคุณขึ้นอยู่กับแหล่งข้อมูลบนเว็บใด ๆ

2
และสิ่งที่ควร55*96-12กลับมา?
ProgramFOX

1
55 * 96-12 = 5268 ควรเป็นผลลัพธ์เดียวกันกับที่ป้อน 5268
ST3

3
โบนัสอาจจะเป็นประเด็นใหญ่ดูเหมือนว่าจะกลายเป็นการแข่งขันที่มีคะแนนติดลบมากที่สุด :)
โจอาคิม Isaksson

7
@ ST3 หากแทบจะเป็นไปไม่ได้เลยหากไม่มีโบนัสจากนั้นก็เกือบจะดีกว่าถ้าทำตามความต้องการหรือคุ้มค่าน้อยกว่า
Cruncher

3
-1 เนื่องจากความท้าทายนี้ใช้สิ่งจูงใจการให้คะแนนที่ล้าสมัย (และแย่มาก) ของ "โบนัส"
mbomb007

คำตอบ:


9

Perl 6: 108 - (25 + 50 + 100) + 0 = -67 คะแนน

สารละลาย Golfed (บรรทัดสุดท้ายจากโซลูชันที่ยอดเยี่ยมของ xfix ):

$!=get;for '*',&[*],'/',&[/],'+',&[+],'-',&[-] ->$s,&f{$!~~s:g[(\d+)$s(\d+){}]=f |@()}
say [+] (1..$!)».comb

วิธีแก้ปัญหาที่ไม่ตีกอล์ฟ:

my $expression = get;
for '*', &[*],
    '/', &[/],
    '+', &[+],
    '-', &[-]
-> $sym, &infix {
    $expression ~~ s:g[(\d+) $sym (\d+) {}] = infix($0, $1)
}
say [+] (1..$expression)».comb

ขั้นตอนการประเมินผลการทำงานโดย iterating มากกว่าสัญลักษณ์ของแต่ละ*, /, +, -หาเมื่อที่อยู่ระหว่างสองจำนวนเต็มแทนว่าการใช้ฟังก์ชั่นที่แสดงให้เห็นถึงสัญลักษณ์

รายละเอียดเพิ่มเติม: ใช้แต่ละสัญลักษณ์ (เช่น+) และฟังก์ชั่น infix ที่ควรแสดง (เช่น&[+]ชวเลข&infix:<+>และฟังก์ชัน Perl 6 สายเดียวกันเมื่อคุณเรียกใช้1 + 2) และทำการทดแทนทั่วโลก ( s:g[…] = …ซึ่งเหมือนกับ Perl 5 s/…/…/ge) ซึ่งตรงกับจำนวนเต็มสองจำนวนคั่นด้วยสัญลักษณ์ ( (\d+) $sym (\d+)) และแทนที่ด้วยเอาต์พุตของฟังก์ชัน infix ที่สอดคล้องกันที่เรียกว่าด้วยจำนวนเต็มเหล่านั้น ( infix($0, $1))

ในที่สุดการแสดงออกการประเมินนี้จะป้อนเข้าสู่say [+] (1..$expression)».combซึ่งxfix อธิบายได้เป็นอย่างดีในการแก้ปัญหาของเขา

ขออภัยที่มาช้าไปงานเลี้ยง☺

แก้ไข: ลบการสนับสนุนสำหรับ exponents; อย่างไรก็ตามมีความยาว 10 อักขระและไม่สามารถเชื่อมโยงได้อย่างถูกต้อง


มันเยี่ยมมาก ฉันชอบวิธีที่คุณทำ parser ง่าย ๆ - ฉันพยายาม แต่ฉันไม่สามารถทำอะไรสั้น ๆ อย่างนี้ แทนที่จะเป็นmy $gคุณอาจต้องการใช้สิ่งที่กำหนดไว้ล่วงหน้า (ฉันคิดว่า$!สามารถใช้งานได้ แต่ฉันยังไม่ได้ทดสอบ)
Konrad Borowski

@ แก้ไขข้อผิดพลาดฉันไม่แน่ใจว่าจะช่วยกอล์ฟได้อย่างไร มีวิธีหนึ่งที่จะตีกอล์ฟได้จริงแต่ต้องใช้ซินแท็กซ์ "infix: [$ var]" ที่ยังใช้งานไม่ได้: my$g=get;for <* / + -> {$g~~s:g[(\d+)$^s(\d+){}]=infix:[$^s] |@()};say [+] (1..$g)».combจะได้คะแนนลงมาที่ 88 chars หรือ -97 points
Mouq

โอ้ $! จะช่วยกำจัด 'ของฉัน'! ขอบคุณ @xfix
Mouq

14

Mathematica 30- (10 + 50) = -30

สั้นลง 4 ตัวอักษรด้วย ybeltukov

Range@nส่งกลับตัวเลขตั้งแต่ 1 nถึง

Integerdigits@n แยกตัวเลขเหล่านั้นออกเป็นตัวเลข

Total[n,2]สรุปตัวเลข 2 คือการอนุญาตให้รวมในระดับต่าง ๆ เช่นรายการของ

IntegerDigits@Range@#~Total~2&

การทดสอบ

IntegerDigits@Range@#~Total~2&[12]

51

IntegerDigits@Range@#~Total~2 &[1000000]

27000001


การแสดงออก

IntegerDigits@Range@#~Total~2 &[55*96 - 12]

55*96 - 12

81393
5268

IntegerDigits@Range@#~Total~2 &[5268]

81393


IntegerDigits@Range@#~Total~2 &[55*96^2 - 12]
55*96^2 - 12

12396621
506868

IntegerDigits@Range@#~Total~2 &[506868]

12396621


คุณควรเพิ่มข้อมูลเกี่ยวกับข้อโต้แย้งที่ถูกต้องเพื่อรับคะแนนบราวนี่ทั้งหมด: D
Yves Klett

1
ฉันไม่ทราบว่าฉันจะพิจารณาว่าไม่ได้ใช้ Eval
Cruncher

3
Re: Eval ใน Mathematica มันเป็นภาษาสัญลักษณ์ที่ front-end มักจะพยายามที่จะแก้ปัญหาทางคณิตศาสตร์เช่นนั้นโดยอัตโนมัติ คุณต้องเพิ่มรหัสเพิ่มเติม (กดปุ่ม []) เพื่อป้องกันไม่ให้ทำเช่นนั้น
Michael Stern

1
Tr@Flattenสามารถลดลงได้:Total[...,2] IntegerDigits@Range@#~Total~2&
ybeltukov

1
คุณไม่ได้จัดการกับ int ขนาดใหญ่ตามอำเภอใจและสมควรได้รับ -25 อื่นหรือไม่
aka.nice

12

C: 150 138 - (100 + 50) = -12

a,b,c;main(d){for(scanf("%d ",&a);~scanf("%c%d ",&d,&b);a=d^43?d%5?d%2?a/b:a*b:a-b:a+b);for(;a;)for(b=a--;b;b/=10)c+=b%10;printf("%d",c);}

การขโมย @Fors อย่างน่าละอายตอบจากที่นี่เพื่อทำการประเมินผลการแสดงออก: https://codegolf.stackexchange.com/a/11423/13877

ตัวอย่างการใช้งาน:

./a.exe <<< "5 + 7"
51

หมายเหตุ: การนำนิพจน์ไปใช้จะไม่ถือว่าตัวดำเนินการมาก่อนและใช้ค่าตามที่รับ อดีตมากกว่าปกติ1+2*3 = 97


1
สิ่งนี้ไม่ได้เกี่ยวข้องกับลำดับความสำคัญของโอเปอเรเตอร์ แต่คำถามไม่ได้ระบุว่าควรใช้ลำดับความสำคัญของโอเปอเรเตอร์มาตรฐาน ... ping @ ST3 หรือไม่ซึ่งอาจจะมีการชี้แจงให้ชัดเจน อย่างไรก็ตามมันควรจะกล่าวถึงในคำตอบ
FireFly

@FireFly ฉันแก้ไขคำตอบเพื่อสะท้อนความจริงนี้
Josh

@Josh - โปรดให้คำตอบสำหรับ 2 ^ 64 - 5
SergeyS

10

sed, 411 283 - 25 = 258

ตอนนี้ฉันไม่สามารถตีมันได้อีกแล้ว :-) ไม่แนะนำให้ใช้กับเลขจำนวนเต็มขนาดใหญ่จากระยะไกล แต่ในทางเทคนิคแล้วมันสามารถจัดการกับจำนวนเต็มขนาดใหญ่ได้ตามอำเภอใจ เอก)

s/$/x0123456789/
:l
/9$/H
:b
s/(.)(y*x\1)/y\2/
/(.)y*x\1/b b
s/(.)([xy].*)(.)\1/\3\2\3\1/
:c
s/y(.*(.))/\2\1/
/y/b c
/0$/b f
/^0*x.*9$/!b l
x
s/x[^\n]*\n//g
:d
s/(.)(.*x.*(.)\1)/z\3\2/
/[^z0]x/b d
s/0|x.*|\n//g
H;x
s/./0/g
s/$/x9876543210/
x
:e
x
b l
:f
x
s/.//
/./b e
x
s/^0+|x.*//g

ตัวอย่างการใช้

(บรรทัดอินพุตเยื้องเพื่อให้อ่านง่ายขึ้น)

  5
15
  12
51
  33
183

8

หลาม, 55- (50 + 25 + 10) = -30

มีประสิทธิภาพ แต่สั้นกว่าและยังสามารถจัดการกับนิพจน์ได้

แก้ไข:ขอบคุณWolframhและlegoStormtrooprสำหรับเทคนิค: D

s,t=0,input()
while t:s+=sum(map(int,`t`));t-=1
print s

หลาม, 149- (25 + 50 + 10) = 64

รุ่นแรกของฉัน

def d(n):
 if n/10==0:return n*(n+1)/2
 c,t=0,n
 while t/10:c,t=c+1,t/10
 p=10**c;m=n%p
 return d(m)+t*(m+1)+p*t*(t-1)/2+p*c*t*45/10
print d(input())

การป้อนข้อมูล:

1234567891234567891234564789087414984894900000000

เอาท์พุท:

265889343871444899381999757086453238874482500000214

ฉันได้รับข้อผิดพลาดล้นเมื่อฉันพยายามของคุณทำงานxrangeแก้ปัญหาบน1234567891234567891234564789087414984894900000000
จอช

1
@Josh กำจัดxrange: D
Wasi

2
บางคำแนะนำ: คุณสามารถแทนที่โดยeval(raw_input()) ห่วงอาจจะเป็นเสื้อ input()whilewhile t:s+=sum(map(int,));t-=1
Reinstate Monica

2
คุณสามารถลดระยะนี้โดยเพียงแค่ใช้input()แทนeval(raw_input())เป็นinputแล้วevals แสดงออก! นั่นหมายความว่าคุณจะได้รับ -10 binus สำหรับสัญลักษณ์พลังงานและ -100 โบนัสสำหรับการไม่ใช้eval!!!

@ LegoStormtroopr กฎพูดevalและคล้ายกันดังนั้นฉันคิดว่า -100 จะไม่นับ
SztupY

8

Python - 108 ตัวอักษรลบ 85 โบนัส 23 จังหวะจัดการอินพุตที่มีขนาดใหญ่มาก

โซลูชันเหล่านี้ส่วนใหญ่ดูเหมือนจะวนลูปมากกว่า int ทั้งหมดน้อยกว่าอินพุทและบวกผลรวมหลักทั้งหมด ใช้งานได้ แต่ฉันรู้สึกว่าไม่เหมาะสมและจะถามว่าพวกเขามีสิทธิ์ได้รับโบนัส 25 แต้มจริงหรือไม่เนื่องจากฉันไม่คิดว่าพวกเขาจะสามารถจัดการกับข้อมูล1234567891234567891234564789087414984894900000000ภายในช่วงอายุของเราได้ อันที่จริงแล้วการป้อนnตัวเลขการแก้ปัญหาเหล่านี้ต้องใช้O(10^n)เวลา ฉันเลือกแทนที่จะโยนคณิตศาสตร์บางอย่างที่ปัญหานี้

#Returns the sum of all digits in all x-digit numbers
def f(x):
    return x*(10**(x-1))*45

#Returns the sum of all numbers up to x
def g(x):
    return x*(x+1)/2

#Solves the problem quickly
def magic(x):
    digits = [int(y) for y in list(str(x))]
    digits.reverse()
    total = 0

    for (sig, val) in enumerate(digits):
        total += (10**sig)*g(val-1) + val*f(sig) + val + (val*10**sig)*sum(digits[sig+1:])
    return int(total)

ชุดของxตัวเลขหลักคือ isomorphic {0,1,2,3,4,5,6,7,8,9}^xการตั้งค่า สำหรับคง(n,sig)มีxค่าแตกต่างกันสำหรับsig, 10^x-1จุดกับsigSET Index วันที่ไปnและผลรวมของตัวเลขทั้งหมด0-9เป็น 45 fทั้งหมดนี้จัดการโดย

g เป็นสิ่งที่เราทุกคนอาจคุ้นเคย

magicใช้ตัวเลขทั้งหมดในหมายเลขอินพุตและวนซ้ำจากน้อยไปหามากที่สุด 1,234,567มันเป็นเรื่องที่ง่ายที่สุดในการติดตามนี้กับการป้อนข้อมูลตัวอย่างเช่นสมมติว่า

เพื่อจัดการกับช่วง1,234,567-1,234,560ที่เราจะต้องเพิ่มขึ้นตัวเลขทั้งหมดจากการ1ไป7และเพิ่มใน7ครั้งผลรวมของตัวเลขอื่น ๆ 1,234,560ที่จะจัดการกับตัวเลขทั้งหมดมากกว่า ตอนนี้เราต้องจัดการกับส่วนที่เหลือ

เพื่อจัดการกับช่วง1,234,560-1,234,500เราเพิ่มใน6( val) และวางขีด จำกัด 1,234,559บนไป ในการทำให้ส่วนที่เหลือของการลดลงเราจะเห็นทุกตัวเลขหลักเดียว 6 ครั้ง ( val*f(sig)) เราจะเห็นตัวเลขทั้งหมดจาก0การ5ว่า10ครั้งในแต่ละ ( (10**sig)*g(val-1)) เราจะเห็นตัวเลขอื่น ๆ ทั้งหมดในจำนวนนี้อย่างแน่นอน 60 ครั้ง ( (val*10**sig)*sum(digits[sig+1:])) 1,234,500เราได้กระทำตอนนี้มีตัวเลขทั้งหมดอย่างเคร่งครัดมากกว่า ตรรกะเดียวกันจะใช้การเหนี่ยวนำข้ามความสำคัญทั้งหมด

การเล่นกอล์ฟนี้ด้วย WolframH ช่วยลดปัญหานี้ได้

d=map(int,str(input()))
print sum(v*(10**s*((v-1)/2+sum(d[:~s]))-~s*9*10**s/2)for s,v in enumerate(d[::-1]))

และผลรวมของผลรวมหลักของจำนวนเต็มทั้งหมด1234567891234567891234564789087414984894900000000เท่ากับ265889343871444927857379407666265810009829069029376

จำนวนที่มากที่สุดที่ฉันสามารถจัดการได้ที่เวอร์ชัน golfed คือ 10 ^ 300 ตรงจุดที่ลอยเริ่มล้นและความไม่แน่นอนเชิงตัวเลขเริ่มทำให้เกิดปัญหา ด้วยฟังก์ชันการยกกำลังสองและการคูณอย่างรวดเร็วปัญหานี้จะหายไป

และรองรับ LaTeX ประโยชน์จริงๆ ...


ดี ฉันพยายามที่จะโจมตีปัญหานี้ด้วยคณิตศาสตร์เมื่อไม่นานมานี้ แต่ติดอยู่ ฉันจะต้องข้ามสิ่งนี้อย่างระมัดระวังในภายหลังและต้องคิดเกี่ยวกับวิธีการทำงาน
FireFly

คำตอบที่ดี! มันก็คล้าย ๆ ไปในทางที่ผมนับว่าจะถ้าใส่เป็น 1000000 :)
ST3

1
+1 สำหรับการใช้คณิตศาสตร์ อย่างไรก็ตามฉันได้รับ2.65889343871e+50ซึ่งเป็นจุดลอยตัวประมาณของการแก้ปัญหาที่แท้จริง เห็นได้ชัดว่าคุณพิมพ์int(t)แทนที่จะtเป็นในรหัสที่คุณให้ ว่าเป็นสิ่งที่ผิด; 265889343871444899381999757086453238874482500000214วิธีการแก้ปัญหาที่แท้จริงคือ เพียงแค่หลีกเลี่ยงการใช้ลอยคือแทนที่โดยสั้น**(x-1) **x/10
Reinstate Monica

1
การเล่นกอล์ฟนี้อีกเล็กน้อย เป็นที่ชัดเจนว่าสิ่งเดียวที่ทั่วโลกต้องการคือd(เพราะมันใช้สองครั้ง) กำจัดสิ่งอื่น (และใช้กลอุบาย) อย่างใดอย่างหนึ่งถึงd=map(int,str(input()))\nprint sum(v*(10**s*((v-1)/2+sum(d[:~s]))-~s*9*10**s/2)for s,v in enumerate(d[::-1]))(108 ตัวอักษร) ทำงานได้ดีกับอินพุตทุกขนาด (เช่นint("1"*1000))
Reinstate Monica

1
@ymbritt 10**-1คือ0.1และจากนั้นทุกอย่างจะกลายเป็นลอย 1/10คือ0(การหารจำนวนเต็ม) และทุกอย่างสามารถอยู่intได้
Reinstate Monica

8

TI-BASIC, 137 - (50 + 10 + 100) = -23

Input A:Disp cumSum(randIntNoRep(1,A))→L₁:"?:For(A,1,dim(L₁:Ans+sub("ABCDEFGHIJKLMNOPQRSTUVWXYZ",L₁(A),1:End:Disp sub(Ans,2,length(Ans)-1

อินพุตจัดการตัวเลขได้ถึง1E100และประเมินโดยอัตโนมัติ สามารถจัดการการแสดงออก

แม้ว่ามันจะเป็นอาร์เรย์ขนาดใหญ่เมามันผมไม่เสียคอมพิวเตอร์ทรัพยากร (ซึ่งมีการเรียกใช้จากเครื่องคิดเลข )


1
คำตอบที่ดีที่สุดสำหรับคำถามนี้ฉันคิดว่า ใช้ภาษาเครื่องคิดเลขในการเขียนคำตอบรหัสกอล์ฟเพื่อเพิ่มตัวเลขเข้าด้วยกัน เจ๋ง!
มาลาคี

1
@ Malachi ตามที่ฉันพูดเสมอเมื่อ code golf = math ถึงเวลาที่ต้องใช้เครื่องคิดเลข
Timtech

2
เวอร์ชันของฉันที่อนุญาตให้มีตัวเลขสูงถึง 9E99 นั้นไม่ดีพอดังนั้นฉันคิดว่าคุณไม่สามารถนับโบนัสนั้นได้ นอกจากนี้ฉันค่อนข้างแน่ใจว่าคุณจะต้องนับอินพุตเป็น "with eval" ตามคำตอบ Mathematica ของ Carraher
FireFly

1
เห็นด้วยกับ FireFly ไม่evalควรใช้โบนัสที่ไม่ได้ใช้
ST3

3
เครื่องคิดเลขไม่ใช่คอมพิวเตอร์ได้อย่างไร
David Conrad


6

C, 77 74

n,v,i;main(){scanf("%d",&n);for(;i||(i=n--);i/=10)v+=i%10;printf("%d",v);}

C, 150 124 - 25 = 99

นี่คือรุ่นทางเลือกที่ทางเทคนิคควรมีสิทธิ์ได้รับโบนัส25สำหรับจำนวนเต็มบวก "ใด ๆ " แต่มันทำงานช้ามากเนื่องจากอัลกอริทึมนั้นเป็นเส้นตรงเวลาในอินพุต มันสนุกที่จะเขียน ลบตัวเลขที่อ่านด้วยตนเองเป็นอักขระ ASCII ด้วยตนเอง รุ่นนี้คือ150ตัวอักษร (ตอนนี้ด้วยโค้ดที่น่ากลัว, การโต้เถียงอย่างรุนแรง, ลูป!)

n,v;main(int n,char**a){char*p;do{for(p=a[1];*p>47;p++)v+=*p-48;for(;*--p==48;)*p=57;
p[0]--;}while(p>=a[1]);printf("%d",v);}

C, 229 224 - (50 + 100) = 74

รูปแบบการจัดการนิพจน์ / * - +ความสำคัญผู้ประกอบการดำเนินการตามกฎทั่วไป: จำกัด 97 โทเค็น = 48 คำ

#define F(X,Y)for(q=n+1;q+1!=p;)*q-X?q+=2:(q[-1]Y##=q[1],memmove(q,q+2,(p-q)*4))
n[99],*p,*q,v,i;main(){for(p=n;~scanf("%d%c",p,p+1);)p+=2;F('/',/);F('*',*);
F('-',-);F('+',+);for(;i||(i=n[0]--);i/=10)v+=i%10;printf("%d",v);}

จำนวนเต็มบวกทั้งหมดหมายความว่าควรจัดการได้นานกว่า 99 หลัก
ST3

@Firefly อัลกอริทึมเจ๋ง ๆ ในการทำงานกับตัวเลขที่มากกว่าตัวเลขในตัว!
Josh

5

GolfScript 18 - 50 = -32

~),{`+}*' '*~]{+}*

คำอธิบาย: สมมติว่าอินพุตคือ "12":

~), # turn input into integer, increment, and then turn into an array of all numbers less than or equal to input.  

[0,1,2,3,...,12]กอง

{`+}* # fold string concatenation across the array

"01234...9101112"กอง

' '* # join a space between all characters

"0 1 2 ... 1 0 1 1 1 2"กอง

~] # evaluate the stack into an array.  No `[` is necessary since the stack is otherwise empty.

[0,1,2,...,9,1,0,1,1,1,2]กอง

{+}* # fold addition across the new array

สแต็คคือ 51 ตามที่ต้องการ

อินพุตที่นี่อาจเป็นนิพจน์ GolfScript ที่ถูกต้องซึ่งอาจรวมถึง exponents ตัวอย่างเช่น:

echo "5 5 + 2 * 8 -" | ruby golfscript.rb h.gs
-> 51

2(5 + 5) - 8 = 12ตั้งแต่ ฉันคิดว่าสิ่งนี้น่าจะมีสิทธิ์ได้รับโบนัส แต่อาจเป็นไปได้ว่าหากอยู่ในรูปแบบปกติไม่ใช่สัญกรณ์โปแลนด์ย้อนกลับของ GolfScript


มันรองรับ^เช่นกัน?
SztupY

รองรับการยกกำลังในรูปแบบ GolfScript ซึ่งก็คือ?
Ben Reich

คุณไม่ได้รับโบนัส 10 เพราะโปรแกรมจะต้องสนับสนุน^ไม่ใช่?หรือpowและอื่น ๆ
ST3

@ ST3 ตามที่คุณต้องการ!
Ben Reich

4

ทับทิม, 37 - 50 = -13

เพิ่มทวีคูณไปอีกฟากหนึ่งของท้องฟ้า! เช่นเดียวกับโซลูชัน Ruby อื่น ๆ ฉันคิดว่านี่ควรจะเป็นไปได้ในทางทฤษฎีที่จะทำงานกับตัวเลขจำนวนมากโดยพลการ

p eval [*1..eval(gets)].join.chars*?+

รุ่นเก่า (49 - 50 คะแนน)

p"#{[*1..eval(gets)]}".chars.map(&:to_i).inject:+

สมมติว่าโบนัสตัวละครทั้ง 10 ตัวนั้นต้องการตัวอักษรสำหรับการยกกำลังเพื่อเป็นคาเร็ตวิธีที่สั้นที่สุดที่ฉันคิดได้คือ:

.gsub ?^,'**'

ซึ่งมีค่าใช้จ่ายอักขระมากกว่าโบนัสจะให้


คุณสามารถลบตัวอักษรบางตัวออก:p"#{[*1..eval(gets)]}".chars.map(&:to_i).inject :+
SztupY

@ SztupY โทรดีขอบคุณ! ฉันใช้&กอล์ฟไม่เพียงพอ ในความเป็นจริงคุณไม่ต้องการช่องว่างระหว่างinjectและ:+อย่างใดอย่างหนึ่ง
Paul Prestidge

4

Perl 6 (28 - 75 + 0 = -47 ไบต์)

say [+] (1..get.eval)».comb

มันสามารถจัดการกับจำนวนบวกทั้งหมด (อย่างไรก็ตามใหญ่จะใช้เวลานานเนื่องจากการใช้งาน Perl 6 ช้า แต่ Perl 6 รองรับจำนวนเต็มขนาดใหญ่โดยกำเนิด) จะใช้evalเพื่อที่จะใช้เครื่องคิดเลขอย่างง่าย (โทษห้าตัวสำหรับห้าสิบตัวอักษรมีค่า) มันช้าเพียงเพราะการใช้งานในปัจจุบันช้า แต่ในทางทฤษฎีมันควรจะเร็วพอ (เมื่อการใช้งาน Perl 6 ดีขึ้นนั่นคือ) นอกจากนี้ฉันยังชนะ Mathematica (ตอนนี้) อย่างน่าประหลาดใจ

» ในรหัสนี้ไม่จำเป็นจริง ๆ แต่ฉันวางไว้ที่นี่เพื่อเหตุผลด้านประสิทธิภาพ (มิฉะนั้นโปรแกรมจะจัดสรรสตริงทั้งหมดเหตุผลที่มาที่นี่ก็คือ Perl 6 ไม่มีสตริงที่ไม่มีที่สิ้นสุด

อย่างไรก็ตามคุณอาจถามว่ารหัสนี้ทำงานอย่างไร ฉันจะผ่านมันไปทีละส่วน

  • get.eval

    สิ่งนี้รับหนึ่งบรรทัด ( getฟังก์ชัน) และประเมิน ( evalเมธอด)

  • 1..get.eval

    หลังจากนั้น Perl 6 เตรียมวัตถุช่วงจาก1การประเมินมูลค่า นี่คือช่วงดังนั้นจึงไม่มีการจัดสรรขนาดใหญ่

  • ».comb

    .combวิธีการแยกสตริงลงบนตัวละคร ( เว้นแต่เรียกว่ามีข้อโต้แย้ง ) ตัวอย่างเช่นผลตอบแทน'cat'.comb แม็พอิลิเมนต์รายการดังนั้นจึงรันบนทุกไอเท็ม - ไม่เพียง แต่ในรายการเท่านั้น (ตัวอย่างเช่นให้) สิ่งนี้ยังไม่จัดสรรเกินความจำเป็นเนื่องจาก Perl 6 มีรายการไม่สิ้นสุด (เช่น Haskell เป็นต้น)'c', 'a', 't'».comb(4, 9)».sqrt2, 3

    »ไม่จำเป็นต้องใช้ตัวอักษรเนื่องจาก.combสามารถใช้โดยตรงในรายการ แต่สิ่งนี้เกี่ยวข้องกับการบังคับใช้สตริงโดยนัย (และ Perl 6 ไม่มีสตริงไม่ จำกัด ดังนั้นสิ่งนี้จะทำให้เสียหน่วยความจำ) ยกตัวอย่างเช่นรายการหลังจากการแปลงผลตอบแทนสตริง1, 2, 3 1 2 3สำหรับ Perl 6 ช่องว่างคือจำนวนที่ดีที่สุดซึ่งแปลว่า 0 ดังนั้นโค้ดจะใช้ได้แม้ว่าจะมีการแปลงเช่นนี้ก็ตาม อย่างไรก็ตามมันจะใช้ทรัพยากรในทางที่ผิด

  • [+]

    นี่คือตัวดำเนินการลด โดยทั่วไป[]คุณสามารถใช้โอเปอเรเตอร์เพื่อใช้งานในกรณี+นี้ รายการหลังจากที่ลดผู้ประกอบการจะลดลงเพื่อให้[+] 1, 2, 3เป็นซึ่งเป็น1 + 2 + 3 6Perl 6 ใช้ตัวดำเนินการแยกสำหรับตัวเลขและสตริงดังนั้นมันจะไม่ถูกพิจารณาว่าเป็นการต่อกัน

  • say

    ในที่สุดsayผลลัพธ์ผลลัพธ์ ท้ายที่สุดคุณต้องการเห็นผลลัพธ์สุดท้ายใช่ไหม?


อืมม ... [+] 1,2,3,4,5,6,7,8,9,10เป็น1+2+3+4+5+6+7+8+9+10ฉันขวา?
ST3

@ ST3: ใช่ ตัวดำเนินการลดสามารถใช้ในวิธีที่น่าสนใจมากมายใน Perl 6 ตัวอย่างเช่น>สามารถถูกล่ามโซ่ดังนั้นจึง3 > 2 > 1เป็นความจริง คุณสมบัติเดียวกันนี้ใช้เพื่อลดโอเปอเรเตอร์ดังนั้นจึง[>] 3, 2, 1ยังคงเป็นจริงตามความหมาย3 > 2 > 1- [>]สามารถใช้เพื่อกำหนดว่าหมายเลขเรียงตามลำดับจากมากไปน้อย
Konrad Borowski

คุณไม่สามารถใช้get.Intแทนeval? มันต้องการนิพจน์ทางคณิตศาสตร์หรือไม่?
Ven

@ user1737909: "-50 โบนัสถ้ารหัสของคุณสามารถจัดการกับนิพจน์ง่าย" ยิ่งไปกว่านั้น Perl 6 ไม่ต้องการการหล่อด้วยการออกแบบ (นอกเหนือจากเคสขอบที่หายากบางตัวเช่นsortไม่มีอาร์กิวเมนต์เมธอดเปรียบเทียบ)
Konrad Borowski


3

J, 22

([:+/[:"."0[:":>:@:i.)

คำอธิบาย

ประเมินผลจากขวาไปซ้าย

i. n -> 0 1 2...n-1

>: n -> n+1

": numbers -> 'numbers'

"."0 -> (on each scalar item) apply ". -> '123' -> 1 2 3

+/ -> sum

Downvoter ต้องอธิบายคำคัดค้านต่อคำตอบนี้ ฉันเพิ่งลองและในขณะที่มันไม่ได้รับโบนัสใด ๆ มันทำงานได้ดีเท่าที่ฉันเห็น
Gareth

ที่จริงแล้วเมื่อดูคำตอบที่ดีที่สุดอันนี้ก็ดูเหมือนจะได้รับการแสดงออกและโบนัสผู้ประกอบการพลังงานสำหรับคะแนน 22-60 = -38
Gareth

นี่+/,10#.inv>:i.จะสั้นกว่านี้ แต่มันยังคงเป็นฟังก์ชั่นและไม่ใช่โปรแกรมที่สมบูรณ์ตามที่ OP ถาม
หวด

@Gareth โบนัสไม่สามารถใช้กับคำตอบนี้ได้เพราะคุณเพียงแค่เขียนนิพจน์ในรหัสและไม่ใช่อินพุต
หวด

1
@swish นั่นคือสิ่งที่ฉันคิดตอนแรก แต่คำตอบของ Mathematica ดูเหมือนว่าจะทำงานได้ดีเช่นนี้
Gareth

3

R, 64 - (50 + 10) = 4

sum(utf8ToInt(paste(0:eval(parse(t=scan(,""))),collapse=""))-48)

เมื่อสิ่งนี้รันผู้ใช้จะถูกถามให้ป้อนข้อมูล


รุ่นเก่า (ไม่สามารถจัดการกับนิพจน์): 46 ตัวอักษร:

sum(utf8ToInt(paste(0:scan(),collapse=""))-48)

เกิดขึ้นกับฉันว่า codegolf ลำเอียงอย่างดุเดือดต่อภาษาที่มีฟังก์ชั่นสัญลักษณ์เดียว การแก้ปัญหานี้จะสั้นลงอย่างมากหากเรากำหนดไว้ล่วงหน้าu<-function(x) utf8ToInt(x)และอื่น ๆ
Carl Witthoft

@CarlWitthoft นี่เป็นความจริง แต่การกำหนดล่วงหน้ายังนับจำนวนตัวอักษรด้วย โดยวิธีการ: มันเพียงพอที่จะมีได้โดยไม่ต้องu <- utf8ToInt functionสิ่งนี้มีประโยชน์สำหรับการเขียนโค๊ดกอล์ฟหากใช้ฟังก์ชั่นหลายครั้ง
Sven Hohenstein

ดังนั้นถ้าฉันสร้างRcheatcodegolfแพ็คเกจมันถูกต้องหรือไม่ที่จะใช้ฟังก์ชั่นที่กำหนดไว้ล่วงหน้าในแพ็คเกจนั้น :-)
Carl Witthoft

@CarlWitthoft ใช่สามารถใช้แพ็คเกจได้ แน่นอนแพคเกจไม่ควรเขียนสำหรับงาน แต่ถ้ามันมีชื่อสั้น ๆ สำหรับฟังก์ชั่นเท่านั้นมันก็โอเค
Sven Hohenstein

3

แบทช์ - (181 - 50) - 131

เพื่อความสนุกสนาน

@set/av=%1
@setLocal enableDelayedExpansion&for /L %%a in (1,1,%v%)do @set a=%%a&powershell "&{'%%a'.length-1}">f&set/pb=<f&for /L %%c in (0,1,!b!)do @set/as+=!a:~%%c,1!
@echo !s!

ฉันจะทำให้อ่านง่ายขึ้นอีกเล็กน้อย:

@set /a v=%1
setLocal enableDelayedExpansion
for /L %%a in (1,1,%v%) do (
    @set a=%%a
    powershell "&{'%%a'.length-1}">f
    set /p b=<f
    for /L %%c in (0,1,!b!) do @set /a s+=!a:~%%c,1!
)
@echo !s!

วิธีเก่าใช้สำหรับวนรอบเพื่อรับเอาต์พุตของคำสั่ง powershell ซึ่งตรงข้ามกับการเขียนและอ่านจากไฟล์:

@set /a v=%1
@setLocal enableDelayedExpansion&for /L %%a in (1,1,%v%)do @set a=%%a&for /F usebackq %%b in (`powershell "&{'%%a'.length-1}"`)do @for /L %%c in (0,1,%%b)do @set /a s+=!a:~%%c,1!
@echo !s!

ตั้งค่าอินพุตเป็นตัวแปร - v- ใช้/aเพื่อยอมรับนิพจน์ทางคณิตศาสตร์
น่าเสียดายที่การเปิดใช้งานการขยายล่าช้านั้นจำเป็น
ใช้สำหรับวงที่จะนับตั้งแต่วันที่ 1 ถึงมูลค่าป้อน v-
ในการสั่งซื้อไปยังหมายเลขที่จับมากกว่า 9 ผมใช้ PowerShell ที่จะได้รับความยาวของสตริงแล้วใช้อีกสำหรับวงที่จะแยกสตริงที่ขึ้นและเพิ่มไปยังผลรวมs -
คุณสามารถเปลี่ยนชื่อของpowershell.exeเป็นp.exeภายใต้ C: \ WINDOWS \ System32 \ WindowsPowerShell \ v1.0 \ จากนั้นเรียกใช้เพียงแค่p "&{'%%a'.length-1}ประหยัด 9 ไบต์ แต่นั่นไม่ได้อยู่ในจิตวิญญาณของมัน

H:\>sumof.bat 12
51
H:\>sumOf.bat (55*96-12)
81393

ปล่อยให้สิ่งที่สองทำงานในขณะที่ฉันหยุดพักกลางวัน

ฉันไม่สามารถทดสอบด้วยตัวเลขที่ใหญ่กว่านี้มากเกินไปเนื่องจากความช้าของมัน อย่างไรก็ตามควรทำงานสำหรับจำนวนค่อนข้างมาก 2147483647เป็นจำนวนมากที่สุดที่จะใช้ (จำนวนเต็มสูงสุด 32 บิต) ก่อนที่จะให้ข้อผิดพลาดดังต่อไปนี้ -

H:\>sumOf.bat 2147483648
Invalid number.  Numbers are limited to 32-bits of precision.

แน่นอนว่านี่เป็นการตัดสิทธิ์ฉันจากการท้าทาย


1
ทางออกที่ดี! มีสองสามวิธีในการลงเล่นกอล์ฟนี้ 1. คุณสามารถกำจัดตัวแปรชั่วคราวvและใช้%1โดยตรง 2. คุณสามารถลบ 1 ในสคริปต์ PowerShell แทนความยาว@set /a b=%%b-1ซึ่งจะช่วยให้คุณประหยัดได้มาก ด้วยการเปลี่ยนแปลงเหล่านั้นฉันได้ลดลงเหลือ 211 จากเดิม 240 :-)
Mark

โอ๊ะฉันรู้แล้วว่าทำไมคุณเก็บตัวแปรชั่วคราวไว้ (สำหรับคะแนนโบนัส) เคล็ดลับ PowerShell ยังคงอยู่แม้ว่า ...
Mark

เห็นดีขอบคุณ จะเปลี่ยนที่ตอนนี้
ลุง

ชุดจะไม่ทำงาน มัน จำกัด อยู่ที่ (2 ^ 31) -1 (จำนวนเต็มแบบ 32 บิตที่ลงชื่อแล้ว) ความท้าทายต้องการการจัดการอินพุตที่มากถึง (2 ^ 64) -1 (จำนวนเต็ม 64 บิตที่ไม่ได้ลงนาม แต่เอาต์พุตสำหรับค่านั้นจะล้นได้) นี่คือที่ PowerShell มีข้อได้เปรียบที่แตกต่าง - [decimal]ประเภทของมันอนุญาตให้มีค่าสูงสุด (2 ^ 96) -1
Iszi

1
ฉันจะให้เครดิตที่ดีสำหรับแบทช์สำหรับการผิดนัดการหารจำนวนเต็ม นั่นเป็นสิ่งที่ PowerShell หายไปอย่างสิ้นเชิง
Iszi

3

Dyalog APL , 9 - 160 * = -151

+/⍎¨∊⍕¨⍳⎕

ลองออนไลน์!

ได้รับการประเมินผลการป้อนข้อมูล
 เช่น"7+5"ให้12

ดัชนี 1 ... n
[1,2,3,4,5,6,7,8,9,10,12]

⍕¨ จัดรูปแบบแต่ละตัวเลขเป็นสตริง
["1","2","3","4","5","6","7","8","9","10","11","12"]

เกณฑ์ (แบน)
"123456789101112"

⍎¨ ดำเนินการแต่ละตัวละคร (รายการผลผลิตของตัวเลขตัวเลขหลักเดียว)
[1,2,3,4,5,6,7,8,9,1,0,1,1,1,2]

+/ รวม  51


* เกณฑ์การให้คะแนน

-50โบนัสเพราะมันยอมรับการแสดงออกเป็นอินพุต นิพจน์ต้องเป็น APL ที่ถูกต้องซึ่งเป็นที่ยอมรับตาม OPOP

-10โบนัสเพราะเพราะมันยังจัดการ^(*ใน APL)

-100โบนัสเนื่องจากนิพจน์ป้อนข้อมูลถูกจัดการโดยไม่มีการใช้งานที่ชัดเจนeval(เช่นใน APL)


คุณแน่ใจหรือว่าเพิ่มโบนัส -100 ที่นี่? เพราะมันระบุว่า " -100 โบนัสถ้ารหัสของคุณมีคุณสมบัติสำหรับ -50 โบนัสและไม่ได้ใช้eval หรือคล้ายกับการจัดการการแสดงออก " เนื่องจาก⍎¨ดูเหมือนว่าจะดำเนินการแต่ละตัวละครทีละคนมันค่อนข้างเหมือนกับ eval ทีละคนแทนทั้งหมดในเวลาเดียวกันเหมือนที่evalทำ)
Kevin Cruijssen

@KevinCruijssen ใช่เพราะมันไม่ได้ใช้ eval หรือคล้ายกันในการจัดการการแสดงออก ⍎¨ใช้เพื่อแปลงตัวเลขเป็นจำนวนเต็มไม่ใช่เพื่อจัดการกับนิพจน์
อดัม

เดี๋ยวก่อนฉันดูคำอธิบายของคุณไม่ถูกต้อง แต่ไม่ใช่แล้วอินพุท + Eval จะถูกสร้างขึ้นในตอนนั้นหรือ Eval จะทำโดยปริยายเสมอเมื่อมีการใส่นิพจน์
Kevin Cruijssen

1
@KevinCruijssen รับนิพจน์เป็นอินพุตประเมินค่าและส่งคืนผลลัพธ์เสมอ ดังนั้นในการป้อนสตริงคุณต้องใส่เครื่องหมายคำพูดล้อมรอบมัน ความจริงที่ว่าบิวด์อินที่เกี่ยวข้อง ( ) ส่งคืนอินพุตเป็นข้อความดิบไม่สำคัญ (โดยเฉพาะอย่างยิ่งเนื่องจากสัญลักษณ์ระบุว่าเป็นวิธีการอินพุตหลักและเป็นตัวแปรพิเศษ) เนื่องจากการรับโบนัสจะต้องใช้คณิตศาสตร์ ผู้ประเมิน - เป็นงานที่แตกต่างอย่างสิ้นเชิงจากงานหลัก ฉันไม่ชอบโบนัสและ -100 นั้นโง่หรือมี APL อยู่ในใจ แต่ก็น่าจะเหมาะสำหรับโบนัส
อดัม

หากเป็นวิธีปกติในการรับข้อมูลและจัดการการแสดงออกโดยอัตโนมัติฉันเห็นว่ามันพอดีกับโบนัสเช่นกันดังนั้น +1 จากฉัน โบนัสเป็นเรื่องโง่วันนี้ แต่วิธีที่ดีในการใช้พวกเขาเพื่อลดคะแนน
Kevin Cruijssen

2

C # (161)

using C=System.Console;using System.Linq;class X{static void Main(){C.WriteLine(Enumerable.Range(1,int.Parse(C.ReadLine())).SelectMany(i=>i+"").Sum(c=>c-48));}}

น่ารัก

using C = System.Console;
using System.Linq;

class X
{
    static void Main()
    {
        C.WriteLine(
            Enumerable.Range(1, int.Parse(C.ReadLine()))
                .SelectMany(i => i + "")
                .Sum(c => c - 48)
            );
    }
}

2

Python3 + Bash (78 - 185 = -107)

python3 -c"print(sum(sum(map(int,str(x+1)))for x in range(int(${1//^/**}))))"
  • สามารถจัดการกับจำนวนบวกทั้งหมด
  • สามารถจัดการนิพจน์ด้วยการดำเนินการ + - / *
  • สามารถจัดการตัวดำเนินการ ^ (พลังงาน)
  • สามารถจัดการกับนิพจน์โดยไม่ต้อง eval หรือคล้ายกันได้

หากผลลัพธ์ของการแสดงออกไม่ใช่จำนวนเต็มจะถูกตัดทอนก่อน หากผลลัพธ์ของนิพจน์เป็นลบผลลัพธ์จะไม่ถูกกำหนด

ใช้มันเหมือน:

bash golf.sh "12 + (42 / 3 + 3^4)"

1: เว้นแต่คุณจะนับการเรียกใช้ Python จาก Bash เช่นนี้ แต่ฉันไม่คิดว่าเป็นเช่นนั้น หากคุณคิดว่ามันเป็นจริงแล้วคะแนนที่ปรับคือ -7


ฉันจะบอกว่าถ้าคุณไม่ได้เขียนตัวประเมินการแสดงออกคุณก็กำลังใช้สิ่งที่เทียบเท่ากับการประเมิน แต่ฉันไม่ใช่ OP โชคดีมาก!
Tobia

เห็นด้วยกับ @Tobia ไม่มีโบนัสสำหรับผู้ประเมินผลการแสดงออก
ST3

2

Java, 254

class T
{
    public static void main(String[] a)
    {
        long target = 10, count = 0;
        String[] digits = new String[50];
        for (long i = 1; i <= target; i++)
        {
            digits = String.valueOf(i).split("(?!^)");
            for (int j = 0; j < digits.length; j++)
                if (digits.length > j)
                    count += Integer.parseInt(digits[j]);
        }
        System.out.println(count);
    }
}

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

PS: นี่เป็นโปรแกรมที่สมบูรณ์ไม่ใช่แค่ตรรกะ จำนวนคำที่ให้สำหรับโปรแกรมไม่ใช่แค่ตรรกะ


2

Java (JDK8), 272

ความท้าทายแรกของฉันฉันอยู่ข้อเสนอแนะยินดีต้อนรับ =)

import java.util.*;import java.util.stream.*;class C{public static void main(String[]a){System.out.print(Arrays.asList(IntStream.range(1,new Integer(a[0])).mapToObj(s->s+"").collect(Collectors.joining()).split("")).stream().map(Integer::valueOf).reduce(0,Integer::sum));}}

เยื้อง:

import java.util.*;
import java.util.stream.*;

class C {

   public static void main(String[] a) {
     System.out.print(Arrays.asList(IntStream.range(1,new Integer(a[0]))
            .mapToObj(s->s+"")
            .collect(Collectors.joining())
            .split(""))
            .stream()
            .map(Integer::valueOf)
            .reduce(0,Integer::sum));
  }
}

+1 เนื่องจากทุกคนที่ท้าทายรหัสกอล์ฟใน java สมควรได้รับมัน แต่ดูเหมือนว่า Stream API ไม่ได้ให้ประโยชน์ในขณะที่คุณเล่นกอล์ฟ ป่วยเดิมพันถ้าคุณเขียนโซลูชันของคุณและคุณจะใช้ลูปแทนสตรีมมันจะสั้นกว่า
user902383

2

CJam, 9 - 25 = -16

CJam อายุน้อยกว่าความท้าทายนี้สองสามเดือนดังนั้นนี่จึงไม่มีสิทธิ์ใช้เครื่องหมายถูกสีเขียว นอกจากนี้นี่ไม่ใช่การเต้น Perl ในตอนแรก ;) ฉันชอบวิธีการค่อนข้างมากดังนั้นฉันจึงต้องการโพสต์ไว้

l~),s:~:+

ทดสอบที่นี่

แนวคิดคือการสร้างช่วงจาก 0 ถึง N ช่วงนี้จะถูกแปลงเป็นสตริงซึ่งจะเชื่อมต่อจำนวนเต็มกลับไปด้านหลัง สำหรับ N = 12 เราจะได้

"0123456789101112"

แล้วตัวละครแต่ละตัวจะถูกแปลงเป็นจำนวนเต็มด้วย:~(ผลผลิตอาร์เรย์ของจำนวนเต็ม) :+แล้วสรุปได้ด้วย CJam สามารถจัดการกับจำนวนเต็มขนาดใหญ่โดยพลการ


2

Python 3 + astor ,1017 1007 ไบต์ - (25 + 50 + 100) = คะแนน: 842 834

บันทึก 10 ไบต์โดยการลบtsและเปลี่ยนp

แก้ไข: ฉันไม่สามารถทดสอบจำนวนเต็มยาวขัน (1234567891234567891234564789087414984894900000000) [แฮงคอมพิวเตอร์ของฉัน] แต่จากความรู้ของฉัน Python 3 รองรับจำนวนเต็มยาวโดยไม่ได้ตั้งใจ

การดำเนินการนี้ การใช้งานการละเมิด AST ฉันจะไม่พิจารณาการใช้ AST ในทางที่ผิดว่าเป็น "Eval หรือคล้ายกัน"

from ast import*
from astor import*
nt,bo,m,d,a,s,n,p,ty=NodeTransformer,BinOp,Mult,Div,Add,Sub,Num,map,type
class M(nt):
    def visit_BinOp(t,z):
        if ty(z.left)==bo and ty(z.right)==bo:return bo(t.visit_BinOp(z.left),z.op,t.visit_BinOp(z.right))
        if ty(z.left)==bo:return bo(t.visit_BinOp(z.left),z.op,z.right)
        if ty(z.right)==bo:return bo(z.left,z.op,t.visit_BinOp(z.right))
        if ty(z.op)==m:return n(z.left.n*z.right.n)
        if ty(z.op)==d:return n(z.left.n/z.right.n);return z
class A(nt):
    def visit_BinOp(t,z):
        if ty(z.left)==bo and ty(z.right)==bo:return bo(t.visit_BinOp(z.left),z.op,t.visit_BinOp(z.right))
        if ty(z.left)==bo:return bo(t.visit_BinOp(z.left),z.op,z.right)
        if ty(z.right)==bo:return bo(z.left,z.op,t.visit_BinOp(z.right))
        if ty(z.op)==a:return n(z.left.n+z.right.n)
        if ty(z.op)==s:return n(z.left.n-z.right.n);return z
class S(nt):
    def visit_Num(t,z):return n(sum(p(int,list("".join(p(str,range(1,z.n+1)))))))
print(to_source(S().visit(A().visit(M().visit(parse(input()))))))

ขี้เกียจเกินกว่าจะเขียนไม่ได้เขียนดังนั้นฉันจะให้คำอธิบายเกี่ยวกับชั้นเรียนแก่คุณ:

M(NodeTransformer|nt) - converts multiplication and division into their results.
A(NodeTransformer|nt) - converts addition and subtraction into their results.
S(NodeTransformer|nt) - converts numbers into their sum of digits via the Pythonic (naïve) way.

บรรทัดสุดท้ายเพียงแค่เรียกใช้คลาสเหล่านี้ตามลำดับที่เหมาะสมในอินพุตเพื่อรักษาลำดับของการดำเนินการและป้องกันพฤติกรรมที่ไม่พึงประสงค์

ตัวอย่างการใช้งาน ($ หรือ> หมายถึงการป้อนข้อมูลของผู้ใช้) และโดยวิธีการที่โปรแกรมจริงจะรับเข้าเพียงครั้งเดียว:

$ python3 summer.py
> 5
15
> 10
46
> 12
51
> 1000000
27000001
> 55*96-12
81393

มันน่าทึ่ง แต่ก็น่ากลัว ไม่แน่ใจว่ามันได้รับอนุญาต (เพื่อใช้เป็นทางแก้ปัญหานาน) แต่ 10/10 จากฉัน
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋเหตุใดจึงไม่อนุญาตให้ใช้วิธีแก้ปัญหาอย่างรู้เท่าทัน ฉันไม่เห็นปัญหา อย่างน้อยฉันก็จะชนะการแก้ปัญหาด้วยคะแนน 842+;)

พวกเขาควรจะเป็นcompetetiveตอบหมายถึงความพยายามที่แสดง นอกจากนี้ลบความคิดเห็นที่ SE จำกัด สำหรับอายุเท่ากับ 13 !!! คุณควรรอจนกว่าคุณจะได้รับอนุญาตอย่างถูกกฎหมาย เนื่องจาก COPPA (google it) คุณต้องมีอายุ 13 ปีจึงจะสามารถใช้อินเทอร์เน็ตได้เช่นนี้
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋตอนนี้ฉันอยากรู้ว่าใครเป็นผู้ใช้
แมว

1
@cat ชื่อภาษาอารบิกที่ฉันออกเสียงไม่ออก? บัญชีอาจเป็นนุก
Rɪᴋᴇʀ

1

C # (108)

int c(int n){return string.Join("",Enumerable.Range(1,n).Select(i=>i+"")).ToArray().Select(c=>c-'0').Sum();}

น่ารัก

int c(int n)
{
    return string.Join("", Enumerable.Range(1, n).Select(i => i + "")).ToArray().Select(c => c - '0').Sum();
}

3
มันไม่ได้เป็นคำตอบที่ถูกต้องเพราะมันเป็นฟังก์ชั่นและถ่านนับเป็นชนิดใหญ่
ST3

1
คุณไม่ต้องการints; ใน C ค่าเริ่มต้นทุกอย่างเป็นint... โอ้มันคือ C #
wizzwizz4

1

Ruby -> 83-50 = 33

p (1..eval(gets.chomp)).each.inject{|c,e|c+e.to_s.chars.map{|x|x.to_i}.inject(:+)}                     

รุ่น "เพื่อทดสอบ":

module Math
  class CountSum
    def sum(number)
      (1..number).each.inject do |c, e|
        c + e.to_s.chars.map{ |x| x.to_i }.inject(:+)                                                  
      end
    end
  end
end 

ผลการทดสอบ

$ rspec sum_spec.rb  --format doc --color

Math::CountSum
  #sum
    single digit number
      when 5, should return 15
    double digit number
      when 12, should return 51
    arbitrary number
      when 1000000 should return 27000001

Finished in 5.34 seconds
3 examples, 0 failures

1

C # (80)

มันเป็นความพยายามของฉันอีกครั้ง

double c(int n){double s=0;while(n>0)foreach(var c in n--+"")s+=c-48;return s;}

น่ารัก

double c(int n)
{
    double s = 0;
     while (n > 0)
        foreach(var c in n--+"") 
            s += c - 48;
    return s;
}

ช่องว่างระหว่างn--และ+จำเป็นหรือไม่ ฉันไม่คิดว่ามันเป็นภาษา C แบบอื่น ๆ
FireFly

1
ใช้ได้กับช่วงที่กำหนดหรือไม่ ผลลัพธ์สำหรับ2^64-1ไม่พอดีใน 64 บิต
marinus

2
มันไม่ใช่คำตอบที่ถูกต้องเพราะมันเป็นฟังก์ชั่นและการนับถ่านเป็นเรื่องใหญ่
ST3

@marinus คุณช่วยให้เราได้ผลลัพธ์เป็น 2 ^ 64-1 เพื่อให้เรารู้ว่าต้องทำงานกับช่วงใด ฉันไม่กล้าทดสอบในภาษาของฉัน (PowerShell) เนื่องจากเวลาในการประมวลผลจะยิ่งใหญ่
Iszi

@ Iszi: ฉันจะไม่เรียกใช้จริง แต่คุณสามารถทำคณิตศาสตร์: 1) ค่าเฉลี่ยของตัวเลขคือ4.5; 2) ผลรวมเฉลี่ย 20 หลักคือ90( 2^64มี 20 หลัก); 90 * 2^64 ≈ 1.66*10^21ดังนั้นคาดว่าค่าตัวจะอยู่ที่ประมาณ ดังนั้นคุณจะต้องไม่น้อยกว่าบิตที่มากที่สุด71 72
marinus

1

ทับทิม 69-50 = 19 (หรือ -4)

นี่สามารถเล่นกอล์ฟด้วยกันได้ แต่นี่เป็นความพยายามครั้งที่ห้าครั้งแรก

p (1..eval(gets)).inject{|i,s|i+=s.to_s.chars.map(&:to_i).inject :+}

มันใช้งานได้กับตัวเลขทั้งหมด แต่ช้ามากสำหรับพวกมันเนื่องจากมันทำงานช้ากว่า O (n) ดังนั้นฉันจะไม่เพิ่ม -25 ถ้าช้าจะปรับแล้วมันจะ-4แม้ว่า

ทับทิม 133-50-25 = 58

นี่เป็นรุ่นที่เร็วกว่าซึ่งทำงานในเวลาน้อยกว่า O (n) เวลา (และใช้คณิตศาสตร์จริง!) ดังนั้นจึงสามารถให้ผลลัพธ์สำหรับจำนวนเต็มขนาดใหญ่ได้อย่างรวดเร็วดังนั้นฉันจึงเพิ่ม -25:

n=eval(gets);p (d=->n,l{k=10**l;c,r=n.to_s[0].to_i,n%k;n<10?n*(n+1)/2:c*45*l*k/10+k*(c*(c-1)/2)+(r+1)*c+d[r,l-1]})[n,n.to_s.length-1]

เราเขียนรหัสเดียวกันทั้งหมด (คุณเล่นกอล์ฟอีกเล็กน้อย)!
Beterraba

Yup @Beterraba และเกือบจะในเวลาเดียวกัน แต่คุณเป็นบิตเร็วขึ้นดังนั้นฉันจะต้องคิดออกบางสิ่งบางอย่างที่แตกต่างกัน :)
SztupY

1

Haskell, 74-25 = 49

main=getLine>>=print.sum.map(\c->read[c]).concatMap show.(\x->[0..x]).read


การใช้interactและความจริงที่ว่า>>=สำหรับรายการเหมือนกันflip concatMapคุณสามารถตีกอล์ฟลงได้ถึง 63 ตัวอักษรแบบนี้:main=interact$show.sum.map(\c->read[c]). \x->[0..read x]>>=show
Flonk

อีกหนึ่งไบต์ที่จะบันทึก: \c->read[c]คือread.(:[])
nimi

1

ECMAScript 6, 86 - 50 = 36

for(s="",i=eval(prompt());i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c).join()).length)

ตัวละครตัวหนึ่งน้อยลง: for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c).join()).length).
แปรงสีฟัน

ค่อนข้างบิตขนาดเล็ก (คุณไม่จำเป็นต้อง):.join() 78 - 50 = 28 ! for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c)).length)
แปรงสีฟัน

1

R (72 คะแนน)

f=function(n) sum(as.integer(strsplit(paste0(1:n,collapse=""),"")[[1]]))

เอาท์พุท:

> f(5)
[1] 15
> f(12)
[1] 51
> f(1000000)
[1] 27000001

ในความท้าทายเหล่านี้คุณต้องเขียน "f = function (n)" หรือเขียนฟังก์ชันด้วย n หรือไม่
skan

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