표준 숫자를 합산


32

한 줄에 하나의 정수를 가진 스트림 / 파일을 고려하십시오. 예를 들면 다음과 같습니다.

123
5
99

코드는이 숫자의 합, 즉를 출력해야합니다 227.

입력 형식은 라인 당 하나의 정수입니다. 예를 들어, 입력이 정수 배열로 한 줄에 있다고 가정 할 수 없습니다.

STDIN에서 파일 이름 형식으로 또는 원하는 이름의 파일을 입력 할 수 있습니다. 당신은 어느 것을 선택할 수 있습니다. 입력을받는 다른 방법은 허용되지 않습니다.

입력에는 하나 이상의 정수가 포함됩니다. 모든 정수가 음이 아니며 총 합이보다 작다고 가정 할 수 있습니다 .232


2
후행 줄 바꿈이 있습니까? 그 줄 바꿈은 선택 사항입니까?
악의를 그만두십시오.

9
안녕! 제한적인 입력 형식을 가짐으로써 수용 가능한 입력 / 출력 형식에 대한 커뮤니티 표준 에 위배되기 때문에이 과제를 하향 조정했습니다 .
AdmBorkBork

1
@AdmBorkBork와 나는 이것을 대화방에서 길게 논의했습니다. 우리는 동의하지 않기로 동의했습니다 :)

22
의에 - 피할 것 -의 저자로 성가신 I / O임의 무시 기본적으로 , 나는 그 근거로이 문제를 방어하고자합니다. 여기서 처리 입력은 주요 과제를 방해하는 추가 작업이 아니라 도전의 고기입니다. 이상한 I / O 요구 사항이있는 "숫자 추가"가 아니라 단계적으로 추가하는 "I / O 수행"입니다. 기본 작업을 바로 잡지 않기 위해 표준 I / O를 무시해야합니다.
xnor

2
기능 입력을 사용할 수없는 이유는 무엇입니까?
CalculatorFeline

답변:


15

05AB1E , 2 바이트

|O

설명:

|   Get input as array
 O  Sum

온라인으로 사용해보십시오!


6
그건 말도 안돼 :)

이것은 표준에서 읽었습니까?

1
@Lembik이합니다.
Okx

나는 당신의 2 바이트 답변이 처음이라고 생각합니다. 당신은 승자입니다! (누군가 1 바이트 답변을 찾지 않는 한)

3
@Lembik 또는 0 바이트 답변 ....
SparklePony 동지

21

배쉬 + coreutils, 16 바이트

xargs|tr \  +|bc

온라인으로 사용해보십시오!

뒤에 공백이 두 개 있습니다 \. 이것은 음수에도 적용됩니다.

설명:

xargs             # known trick to turn newlines into spaces, while adding a
                  #trailing newline when printing the result (needed for bc)
|tr \  +          # turn spaces into '+'s
|bc               # calculates the sum

tr \\n +|bc개행을 직접 '+'로 변환하기 때문에 왜 좋지 않은지 궁금 할 것 입니다. 글쎄, 그것은 예기치 않은 두 가지 오류가 있습니다.

  • 입력에 후행 줄 바꿈이 있으면 후행 '+'로 변환되므로 추가 후 수행 할 숫자가 없습니다.
  • 가장 이상한 문제는 bc에 입력 뒤에 줄 바꿈이 필요하지만 모든 입력 줄 바꿈을 '+'로 바꾼 것입니다.

나는 이것을 좋아한다. 멋지고 영리합니다.

xargs없이 tr \\ n +를 대신 사용할 수 있습니까?

1
@Lembik 무슨 뜻 tr \\n +|bc인가요? 그렇다면 업데이트 된 설명을 참조하십시오. 좋은 질문.
seshoumara

paste -s -d+|bc15 바이트입니다
David Conrad

1
@Lembik이 경우를 고려하지 않았지만 다행히도 스크립트는 여전히 작동합니다. xargs|tr \ +이 경우 아무 것도 수행하지 않으며 bc는 숫자를 받아서 다시 인쇄합니다.
seshoumara

14

MATL , 2 바이트

Us

이것은이라는 텍스트 파일의 입력을 예상합니다 defin.

Gif 또는 발생하지 않았습니다 .

enter image description here

또는 온라인으로 사용해보십시오! ( 설정해 주신 Dennis에게 감사합니다! )

설명

MATL 프로그램이 실행될 때, 호출 된 파일 defin이 발견되면 (이름은 "기본 입력"을 참조), 내용은 자동으로 텍스트로로드되고 코드를 실행하기 전에 문자열로 스택에 푸시됩니다.

함수 U는 문자열을 평가하여 숫자로 구성된 열 벡터로 변환하고 s암시 적으로 표시되는 합계를 계산합니다.



12

붙여 넣기 + bc, 13 바이트

paste -sd+|bc

설명:

paste -s        Take one line at a time from input
        d+      Joining by '+'
          |bc   Pass as expression to bc

또 다른 쉘 답변!


1
매우 깔끔하고 깔끔합니다.

오, 나는 paste -s -d+|bc스위치를 통합 할 수 있다는 것을 몰랐다. 산뜻한!
David Conrad

12

펄 6 , 13 바이트

say sum lines

시도 해봐

설명

  • lines()에서 라인의 목록 반환 $*IN또는 $*ARGFILES는 "마법"명령 줄 입력 핸들을.
  • sum(…)펄 6에 추가 할 수 있도록 [+] List처럼 자신의 모든 값을 생성하지 않고 그 합을 계산할 수 있습니다 Positionals에 최적화하기 위해 1..100000
    (난 그냥 생각 sum사용에 여기 너무 귀여웠다 [+]나는 평소처럼)
  • say(…).gist입력 에서 메소드를 호출하고 추가 줄 바꿈으로 인쇄합니다.

펄 5 란 무엇입니까?

14
이것은 lolcode처럼 읽습니다
Bryan Boettcher

@Lembik 명확하게 Perl 6 으로 표시되는데, 이는 Perl 5 의 자매 언어 입니다.
브래드 길버트 b2gills 2

오타가있었습니다. 나는 Perl 5에서 무엇을 의미 했습니까?

1
$a+=$_ for <>;print $aPerl 5에서는 잘 작동하지만 더 짧은 방법이있을 수 있습니다.
브래드 길버트 b2gills

10

C, 53 바이트

r;main(i){for(;~scanf("%d",&i);r+=i);printf("%d",r);}

C : 해당 자격 증명을 다시 표시 :)

2
나는 더 짧은 방법이 있어야한다고 생각하지만 그것을 보지 못했습니다 :)
Digital Trauma


9

망막 , 11 7 바이트

마틴 엔더 덕분에 -4

.*
$*
1

온라인으로 사용해보십시오!


단항으로 변환 :

.*
$*

의 개수를 센다 1:

1

1
정규식 기반 언어 인 Retina가 지금까지 게시 한 가장 짧은 bash 답변보다 적은 바이트 수로 합계를 수행하는 방법에 흥미가 있습니다. +1
seshoumara

이 책은 표준에서 읽었습니까?

2
@Lembik 그렇습니다.
Riley

단항으로 입력이 허용 된 경우 1 바이트에 불과합니다.
mbomb007

@ mbomb007 나는 이미 sed에서 시도했다.
Riley

8

Brain-Flak , 20 바이트

(([]){[{}]{}([])}{})

온라인으로 사용해보십시오!

설명

이것은 채팅에서 Riley에 의해 만들어진 솔루션 의 골프 입니다. 그의 해결책은 다음과 같습니다.

([])({<{}>{}<([])>}{})

Brain-Flak에 대해 잘 알고 있다면 설명이 필요 없습니다. 스택 높이를 푸시하고 카운트 다운 할 때 하나의 값을 팝하고 결국 모든 런의 합을 푸시합니다.

그것은 꽤 좋은 골프하지만 그는 모두를 제로로 {}하고 ([])그러나 이들 대신에 우리가 마스크를 제거하고 거의 상쇄해야 두 음 중 하나를 만들 그렇다면 하나만큼 다른 값을 가질 것이다.

([])({[{}]{}([])}{})

그것들은 항상 하나마다 다르기 때문에 불행히도 우리의 답이 항상 스택 높이에 의해 벗어난 불행한 상황이 있습니다. 이를 해결하기 위해 첫 번째 스택 높이를 포함하도록 푸시 시작을 이동하면됩니다.

(([]){[{}]{}([])}{})

1
나는 네거티브 팝이 이전의 높이 (루프 이전 또는 이전 시간의 끝까지)를 취소하고 마지막 높이가 0이므로 무시할 수 있다고 생각했습니다.
Riley

8

파이썬 2, 40 바이트

import sys;print sum(map(int,sys.stdin))

7

R, 11 바이트

sum(scan())

scan한 줄에 하나씩 숫자를 입력합니다. 그리고 sum, 합계.


7

펄 5 , 9 바이트

8 바이트의 코드 + -p플래그.

$\+=$_}{

온라인으로 사용해보십시오!

을 사용 -p하면 입력이 한 번에 한 줄씩 읽히고 $_매번 저장됩니다 . 우리는 사용 $\덕분에 있기 때문에, 누적으로 -p플래그가,이 암시 적으로 마지막에 인쇄입니다. 타의 추종을 불허이 }{때문에 사용되는 -p플래그는 인쇄 $\대신 인쇄의 말에 한 번 $_$\각 라인에서 그것은 일반적으로하는 것처럼 읽습니다.


파싱조차 못해요! :) 설명하십시오.

@Lembik 여기 있습니다.
Dada

타의 추종을 불허하는 부분은 매우 모호합니다!

@Lembik 이것들은 괄호가 아닙니다 ... 그들은 프랑스어 또는 곱슬 괄호 중 하나는 당신이 묻는 사람에 달려 있지만, 확실히 아닙니다)(
CraigR8806

1
@Lembik accolades입니다.
Michael Vehrs

7

순수 배쉬, 37 36 바이트

바이트에 대한 @KevinCruijssen에게 감사합니다!

while read a;do((b+=a));done;echo $b

온라인으로 사용해보십시오!


3
아주 좋고 깨끗합니다.

나는 Bash 에서 프로그래밍 하지 않지만 사이의 공백을 제거 할 수는 do ((없습니까? TIO가 작동하는 것 같다.
케빈 크루이 센

@KevinCruijssen 그래, 그것은 작동하는 것 같습니다. zsh를 일일 쉘로 사용하고 공백없이 zsh에서 작동하지 않습니다 .Bash에서는 작동하지 않는다고 가정했지만 분명히 작동합니다.
betseg

6

하스켈, 32 바이트

interact$show.sum.map read.lines

온라인으로 사용해보십시오! .

interactstdin에서 전체 입력을 수집하여 인수로 제공된 함수에 전달하고이 함수에서 가져온 문자열을 인쇄합니다. 기능은 다음과 같습니다

            lines   -- split input into list of lines at nl
      map read      -- convert every line to a number (read is polymorphic,
                    -- but as want to sum it later, the type checker knows
                    -- it has to be numbers)
    sum             -- sum the list of numbers
show                -- convert back to string

1
이것은 나를 Haskell처럼 정말로 만듭니다. 스칼라에서는 lines.map(_.toInt) sum이 String 또는 숫자의 경우 암시 적 변환을 기대하기 때문에 해야합니다 .
Stefan Aleksić

6

PHP, 22 바이트

<?=array_sum(file(t));

정수 목록을 가진 "t"라는 파일이 있다고 가정합니다.

file()파일을 열고 각 줄이 배열에 별도의 요소가 저장된 배열을 반환합니다. array_sum()배열의 모든 요소를 ​​합산합니다.


5

Awk, 19 바이트

{s+=$1}END{print s}

설명:

{s+=$1}                For all lines in the input, add to s
        END             End loop
           {print s}    Print s

1
"Explanation coming soon ™"상표 등록되지 않은 경우 새로운 캐치 프레이즈가 될 것입니다 ...
ETHproductions

2
awk의 언어로, 당신의 대답 은 실제로 단지 19 바이트입니다 : {s+=$1}END{print s}:)
Digital Trauma

5

dc , 14 바이트

0[+?z2=a]dsaxp

온라인으로 사용해보십시오!

설명:

 [      ] sa   # recursive macro stored in register a, does the following:
  +            # - sum both numbers on stack
               #   (prints to stderr 1st time since there's only 1)
   ?           # - read next line, push to stack as number
    z          # - push size of stack
     2         # - push 2
      =a       # - if stack size = 2, ? yielded something, so recurse
               # - otherwise end macro (implicit)
0              # push 0 (accumulator)
         d     # duplicate macro before storing it
            x  # Call macro
             p # The sum should be on the stack now, so print it

4

CJam , 5 바이트

q~]1b

온라인으로 사용해보십시오!

작동 원리

q     e# Read all input from STDIN.
 ~    e# Evaluate that input, pushing several integers.
  ]   e# Wrap the entire stack in an array.
   1b e# Convert from base 1 to integer.
      e# :+ (reduce by sum) would work as well, but 1b handles empty arrays.

1b합계 는 어떻게 됩니까?
Esolanging 과일

CJam은 숫자를 정수로 변환하기 위해 표준 표현을 요구하지 않습니다. [<x> <y> <z> <w>]<b>b단순히 b³x + b²y + bz + w 를 계산합니다 . 경우 B = 1 , 이는 범 w X + Y + Z를 + .
데니스

4

파이썬, 38 30 바이트

lambda n:sum(map(int,open(n)))

파이썬에서는 파일이 open('filename')(분명히) 열립니다 . 그러나 반복 가능합니다. 파일을 반복 할 때마다 다음 줄이 나타납니다. 따라서 map은 각 목록을 반복하여 호출 int한 다음 결과 목록을 합산합니다.

파일 이름을 입력으로 호출하십시오. (즉 f('numbers.txt'))

map(int, open(n))목록 이해 대신 사용하여 8 바이트를 절약했습니다 . 원본 코드 :

lambda n:sum([int(i)for i in open(n)]) 

1
'open (0)'을 호출하여 표준 입력 으로이 작업을 수행 할 수도 있다고 생각합니다. 그것이 대답을 단축시키는 데 사용될 수 있는지 확실하지 않습니다.
cole

@Cole dennis는 이미 그 솔루션을 가지고 있으므로, 이렇게 대답하겠습니다.
Rɪᴋᴇʀ

내 실수, 그것에 대해 죄송합니다; 나는 당신의 대답에 오기 전에 끝까지 읽지 않았습니다.
Cole

@ 콜 괜찮아, 난 괜찮아
Rɪᴋᴇʀ

4

매스 매 티카, 19 바이트

Mathematica의 노트북 환경을 가정합니다.

Tr[#&@@@Import@"a"]

입력이 파일에있을 것으로 예상합니다 a.


그것은 미친 언어이다 :)

4
@Lembik의 보통 사람들은 이것을 매우 읽기 쉽게 Total @ Flatten @ Import @ "a"또는 심지어 쓸 것 "a" // Import // Flatten // Total입니다. ;)
Martin Ender

Tr[#&@@@Import@#]&허용 되지 않습니까?
ngenisis

4

젤리 , 9 8 바이트

ƈFпFỴVS

STDIN은 실제로 젤리가 아닙니다 ...

온라인으로 사용해보십시오!

작동 원리

ƈFпFỴVS  Main link. No arguments. Implicit argument: 0

  п      While loop; while the condition returns a truthy value, execute the body
          and set the return value to the result. Collect all results (including 0,
          the initial return value) in an array and return that array.
ƈ           Body: Yield a character from STDIN or [] if the input is exhausted.
 F          Condition: Flatten, mapping 0 to [], '0' to "0", and [] to [] (falsy).
    F     Flatten the result.
     Ỵ    Split at newlines.
      V   Evaluate the resulting strings.
       S  Take the sum.

1
두 번째 F명확성을 위해 마찬가지로 될 수도 있습니다 .
Outgolfer Erik


4

순수한 배쉬, 30

read -d_ b
echo $[${b//'
'/+}]

온라인으로 사용해보십시오.

  • read입력 파일을 한 번에 변수에 입력합니다 b. -d_말해 read줄 구분 기호입니다 _대신newline
  • ${b//'newline'/+}개행을 b로 바꿉니다.+
  • echo $[ ... ] 결과 식을 산술적으로 평가하여 출력합니다.

+1 매우 좋습니다. 입력 파일의 마지막 줄 바꿈도 읽습니까? '+'로 바뀌면 $[]후행 '+'로 인해 섹션이 오류가 발생하기 때문에 묻습니다 .
seshoumara

@seshoumara read줄 구분 기호가로 재정의 되어도 마지막 후행 줄 바꿈 을 버리는 것으로 보입니다 _. 이것은 아마도주의 사항 read이지만이 상황에서는 잘 작동합니다.
디지털 외상

나는 항상 순수한 배쉬 솔루션을 보게되어 기쁘다.



3

jq , 5 바이트

add, 명령 줄 플래그 -s.

예를 들면 다음과 같습니다.

% echo "1\n2\n3\n4\n5" | jq -s add
15

6 바이트 . 때문에 -sadd작동하지 않습니다, 공간을 계산합니다.
acc

@agc 내가 틀렸지 만 코드 자체가 add(3 바이트)이고 플래그에 2 바이트 를 추가 해야하는 경우 수정하십시오 -s. 공백은 코드 또는 플래그로 계산되지 않습니다. 언어에서 사용하는 명령 줄 구분 기호입니다.
caird coinheringaahing

1
@ThisGuy,이 -s플래그는 " --slurp "의 약어로 , 전체 입력 스트림을 큰 배열로 읽고 한 번만 필터를 실행합니다 jq. 입력 데이터 해석 방법과 코드 실행 방법이 모두 변경 됩니다. (가)처럼 아니에요 -esed있는 단지 지시 sed이후의 문자열 코드입니다. 는 -s더의 일부처럼 jq언어 자체, 따라서 그 6 번째 바이트 공간도 될 것이다.
agc


3

dc, 22

[pq]sq0[?z2>q+lmx]dsmx

이것은 예상보다 길어 보이지만 파일 끝에 도달하는 시점을 결정하기는 까다 롭습니다. 내가 생각할 수있는 유일한 방법은 ?명령 후 스택 길이를 확인하는 것 입니다.

온라인으로 사용해보십시오 .

[pq]                    # macro to `p`rint top-of-stack, then `q`uit the program
    sq                  # save the above macro in the `q` register
      0                 # push `0` to the stack.  Each input number is added to this (stack accumulator)
       [         ]      # macro to:
        ?               # - read line of input
         z              # - push stack length to stack
          2             # - push 2 to the stack
           >q           # - if 2 > stack length then invoke macro stored in `q` register
             +          # - add input to stack accumulator
              lmx       # - load macro stored in `m` register and execute it
                  d     # duplicate macro
                   sm   # store in register `m`
                     x  # execute macro

매크로 m는 재귀 적으로 호출됩니다. 현대 dc는 이런 종류의 일에 꼬리 재귀를 구현하므로 스택 오버플로에 대해 걱정할 필요가 없습니다.


PPCG에 오신 것을 환영합니다! 설명이 충분하지 않으면 저품질 게시물 필터를 거치게됩니다 .
Matthew Roh

@SIGSEGV 환영받을 필요가 없습니다-나는 여기에 잠시 머물 렀습니다 ;-). 네가 댓글을 달면서 설명을 쓰고있었습니다. 편집을 참조하십시오.
디지털 외상

1
나는 당신에게 빚 을 저장하기 전에 매크로를 복제의 해트트릭 바이트를.
Brian McCutchon

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.