문자열에서 정수 합


11

입력

문자열

산출

줄에있는 모든 정수의 합입니다.

제약

선 ≤500의 1≤Length

샘플 테스트 사례

입력

the 5is 108 seCONd4 a

산출

117

설명

합계 : 5 + 108 + 4 = 117


6
안녕하세요, PPCG에 오신 것을 환영합니다. 단일 언어에 대한 도전은 대개 PPCG에서 눈살을 찌푸립니다. 어쩌면 당신은 일반적인 문제로 변경할 수 : 문자열의 모든 숫자의 합 출력, 문자열 주어, 다른 모든 것들을 무시하고 (즉 "the 5is 108 seCONd4 a"발생합니다 117때문에 5+108+4=117). 또한 여기에있는 모든 '질문'에는 당첨 조건 태그 가 있어야합니다 . 이 경우 [code-golf] (가장 짧은 솔루션 임)라고 가정합니까?
Kevin Cruijssen

4
SO에 비슷한 질문 을 게시 것으로 보이며 PPCG 도전 과제가 아니며 골프 코드가 아닌 '사용 가능한'코드를 찾고 있음을 확인하는 경향이 있습니다. 대신 사이트의 규칙에 더 잘 맞도록 SO에 대한 원래 질문을 개선하는 것이 좋습니다.
Arnauld

4
귀하의 게시물을 Google 표준에 맞게 정비했습니다. 결과가 마음에 들지 않으면 자유롭게 편집하십시오.
Adám


2
이 경우 string x='-12hello3';음수를 계산합니까 (예 : -12 + 3 === -9)?
Shaun Bebbers

답변:


4

자바 스크립트, 34 32 바이트

s=>eval(s.match(/\d+/g).join`+`)

모든 숫자를 일치시키고 +5 + 108 + 4로 바꾸어 결과를 평가하십시오.
양의 정수에서만 작동합니다.

Arnauld 덕분에 2 바이트 절약

f=
    s=>eval(s.match(/\d+/g).join`+`)

g=()=>b.innerHTML = f(a.value)
g()
<input id=a value="the 5is 108 seCONd4 a" onkeyup="g()">
<pre id=b>


콘솔에서 string.length를 사용하여 문자를 계산하는 것은 이스케이프 문자가 포함되어있을 때 좋은 생각이 아닙니다. 다시 Thx
Bassdrop Cumberwubwubwub

약간 더 나은 옵션은 console.log(f.toString().length)이지만 100 % 신뢰할 수는 없습니다 .
Arnauld

아니면 그냥 TIO를 사용하여 ...
Jo King


4

05AB1E , 11 6 바이트

þмS¡þO

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

설명:

þм       # Only leave the non-digits of the (implicit) input-string
         #  i.e. "the 5is 108 seCONd4 a" → "the is  seCONd a"
  S      # Split it into a list of characters
         #  → ["t","h","e"," ","i","s"," "," ","s","e","C","O","N","d"," ","a"]
   ¡     # Split the (implicit) input-string by each of these characters
         #  → ["","","","","5","","","108","","","","","","","4","",""]
    þ    # Remove the empty strings by only leaving the digits
         #  → ["5","108","4"]
     O   # And sum these numbers (which is output implicitly)
         #  → 117

1
이봐, 영리한 사용법 ¡!
Outgolfer Erik


3

APL (Dyalog Unicode) , 11 바이트

익명의 암묵적 prefic 기능

+/#⍎¨∊∘⎕D⊆⊢

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

 논쟁 거리

 로 분할 (True가 조각이되고 False가 분리기가됩니다)

 회원
 의
⎕D 숫자의 집합

#⍎¨ 루트 네임 스페이스에서 각각 평가

+/ 합집합




2

, 5 바이트

IΣ⁺ψS

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명 : Charcoal의 Sum연산자는 문자열에서 숫자를 자동으로 추출하지만 문자열에 숫자가 아닌 문자가 포함되어 있지 않으면 대신 디지털 합계를 취하므로이를 방지하기 위해 널 바이트를 연결합니다. 그런 다음 결과는 암시 적 출력을 위해 문자열로 캐스트됩니다.



2

Zsh , 21 바이트

<<<$[${1//[^0-9]/+0}]

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

  ${1           }  # the 5is 108 seCONd4 a
  ${1//[^0-9]/+0}  # +0+0+0+05+0+0+0108+0+0+0+0+0+0+04+0+0
$[${1//[^0-9]/+0}] # 117

불행하게도, bash 0108는 8 진수로 해석되기 때문에 불평합니다 . zsh을하지 않는 (하지 않는 한 setopt octalzeroes)



1

파이썬 3 , 63 59 56 바이트

왜 안돼? 의무 정규식 답변. 파이썬 2를 사용하여 6을 도킹 할 수는 있지만 무엇이든 가능합니다. map을 사용하는 대신 eval 접근법을 사용하고 있으므로 더 이상 적용되지 않습니다.

import re;x=lambda y:eval('+'.join(re.findall('\d+',y)))

설명:

import re; # Import regex module
x=lambda y: eval(                                 ) # Run as Python code
                  '+'.join(                     ) # Joined by '+'
                            re.findall('\d+',y) # A list of all matches of regex \d+ in string y

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


좋은! TIO에서는 z == l[1]대신 사용해야 합니다 z is l[1]. 숫자가 충분히 높아지면 현재 코드에서 잘못된 부정을 줄 수 있습니다.
Jakob

1

자바 10, 66 바이트

이것은에서 람다이다 Stringint.

s->{var r=0;for(var n:s.split("\\D"))r+=new Long("0"+n);return r;}

음의 정수는 지원되지 않습니다. 아마 괜찮습니다.

온라인 시도

감사의 말


1
당신은 전환 할 수 있습니다 [^0-9]에 대한 \D또한 전환 할 수 있습니다, 몇 바이트 longString위해 var당신이 반환 형식을 변경해야합니다하지만 (int
무지의 실시

1

루비, 32 27 자

->s{eval s.scan(/\d+/)*?+}

감사의 말


PPCG에 오신 것을 환영합니다! -7 바이트 *?+대신 사용할 수 있습니다 .join ?+.
Conor O'Brien을

1

Cubix , 17 바이트

?|i.I!/s+q;;>p.O@

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

    ? |
    i .
I ! / s + q ; ;
> p . O @ . . .
    . .
    . .

달려 봐

상당히 간단한 것입니다. Icubix에서는 입력에서 첫 번째 정수를 가져 와서 스택으로 푸시합니다. 이것은 모든 문자를 건너 뛰는 효과가 있습니다. 나머지는 추가를 처리하고 입력의 끝을 감지합니다.

  • I! 정수를 입력하고 0을 테스트
  • s+q;;0이 아닌 경우 TOS (강제 및 초기 0)를 교환하고 추가하십시오. 결과를 스택 맨 아래로 밀고 상단을 청소하십시오. 처음으로 돌아갑니다.
  • /i? 0이면 리디렉션하고 문자 입력을 수행하여 확인하십시오.
  • |?;/양수 (문자)가 리플렉션 ?으로 우회전 하면 체커를 통해 다시 밀고 스택에서 팝으로 우회전하여 TOS에 0을 남겨 둡니다. 그런 다음 IP가 기본 루프로 다시 리디렉션됩니다.
  • I>p.O@ 음수 (입력 끝)가 왼쪽으로 돌리면 정수 입력을 수행하고 스택의 맨 아래를 맨 위로 가져 와서 출력하고 정지하십시오.






0

첨부 , 23 바이트

Sum##N=>MatchAll&"\\d+"

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

더 흥미롭지 만 간접적 인 대답 (37 바이트) : {Sum!Reap[ReplaceF[_,/"\\d+",Sow@N]]}

설명

Sum##N=>MatchAll&"\\d+"

형식은 다음과 같습니다.

f##g=>h&x

확장 및 괄호로 묶으면 다음과 같이됩니다.

f ## (g => (h&x))

##두 함수를 함께 구성 =>하고 오른쪽 함수 결과에 대해 왼쪽 함수를 매핑하는 함수를 만들고 함수 &의 측면에 인수를 바인딩합니다. input의 _경우 다음과 같습니다.

{ f[Map[g, h[_, x]]] }

먼저 MatchAll숫자 ( \\d+)를 입력합니다. 그런 다음 N함수를 사용하여 각 런을 실제 정수로 변환 합니다. 마지막으로을 사용하여이 숫자의 합을 취합니다 Sum.


0

APL (NARS), 문자 13, 바이트 26

{+/⍎¨⍵⊂⍨⍵∊⎕D}

테스트:

  f←{+/⍎¨⍵⊂⍨⍵∊⎕D}
  f 'the 5is 108 seCONd4 a'
117



0

Japt v2.0a0 -x, 3 바이트

내 (very-WIP) 통역사를위한 또 다른 테스트 드라이브.

q\D

시도 해봐

q\D     :Implicit input of string
q       :Split on
 \D     :  Non-digit characters (/[^0-9]/)
        :Implicitly reduce by addition and output

0

자바 8, 53130 바이트

정규식 가져 오기의 경우 105 바이트 + 25 바이트

s->{long c=0;for(Matcher m=Pattern.compile("\\d+").matcher(s);m.find();c+=new Long(m.group()));return c;}

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

s->{                                                    // Lambda function
    long c=0;                                           // Sum is zero
    for(Matcher m=Pattern.compile("\\d+").matcher(s);   // Prepare regex matcher
        m.find();                                       // While the string contains unused matches...
        c+=new Long(m.group()));                        // Add those matches to the output
    return c;                                           // Return the output
   }

2
이것이 옳지 않다고 생각합니다. OP의 (전용) 예제는 연속 숫자가 단일 정수를 형성해야한다고 제안하므로 "123"은 코드와 달리 6이 아닌 123을 생성해야합니다.
Michail

불행히도, 가능하면 수정하겠습니다
Benjamin Urquhart

@Michail 수정
Benjamin Urquhart



0

, 6 바이트

$+a@XI

-123음의 정수로 취급 합니다. 온라인으로 사용해보십시오!

  a     Command-line input
   @XI  Regex find all integers (XI is a variable predefined as the regex `-?\d+`)
$+      Fold on +

빼기 부호로 취급하지 않고 하이픈을 무시해야하는 경우 7 바이트에 대해 다음이 작동 합니다 .

$+a@+XD

XD는 사전 설정된 변수입니다 `\d`. +XD정규식 +수정자를 추가하여 1 자리 이상의 숫자와 일치시킵니다.


0

자바 (JDK) , 98 94 93 바이트

s->java.util.Arrays.stream(s.split("\\D")).filter(t->!t.isEmpty()).mapToLong(Long::new).sum()

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

-4 bytesLong::new대신 에 사용하여 Long::valueOf.
-1 byte정규 표현식을 단축하여 나중에 빈 문자열을 제거하고 분할 할 때 여분의 것을 만듭니다.

설명

s->                            // Lambda (target type is ToLongFunction<String>)
    java.util.Arrays.stream(   // Stream the result of
        s.split("\\D")        // splitting on non-digits
    )
    .filter(t->!t.isEmpty())   // Discard any empty strings
    .mapToLong(Long::new)      // Convert to long
    .sum()                     // Add up the stream's values.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.