'a'및 'Y'와 같이 숫자가 아닌 숫자로 구분 된 문자열의 정수 합


14

프로그램에서 변수로 설정된 문자열에서 찾은 모든 정수를 합산하는 프로그램을 만듭니다 (따라서 프로그램은 입력을 처리 할 필요가 없습니다). 정수는 숫자가 아닌 숫자 (0, 1, 2, 3 ... 9 이외)로 구분됩니다.

예 :

  • e7rde f ,fe 43 jfj 54f4sD = 7 + 43 + 54 + 4 = 108
  • 5 = 5
  • 64 545,5445-32JIFk0ddk = 64 + 545 + 5445 + 32 + 0 = 6086
  • 0ab0 = 0 + 0 = 0

추가 메모 :

  • 유니 코드 지원은 필요 하지 않지만 허용
  • -n( n정수)는 음수로 계산 되지n 않지만 하이픈 뒤에 n.

답변은 화면에 인쇄 될 수 있습니다 (필수 사항 아님).

최단 답변 (문자)이 이깁니다.


결과도 인쇄해야합니까? (당신은 I / O를 언급하지 않습니다).
Wile E. Coyote

@Dogbert-나는 그것에 대해 생각하지 않았다. 미안합니다 게시물을 업데이트하겠습니다.
Anto

일부 사람들은 이미 답변을 받았으며 "상처"하지 않기로 변경했습니다. 나는 지금 잠을 자야한다고 생각한다. 그래서 조금 더 명확하게 생각할 것이다.)
Anto

2
Anto : 솔루션에 관측 가능한 부작용이없는 작업은 그리 좋지 않습니다.
Joey

방금 마주 5a-3친 흥미로운 테스트 사례는 -다음과 같습니다 (번호가 바로 뒤에 오면 내 코드는 건너 뛰지 만 숫자가 아닌 번호는 없으면 건너 뜁니다 ).
Martin Ender

답변:


10

펄, 15

에 입력 $_, 합계 $c:

s/\d+/$c+=$&/ge

14

루비 1.9, 21 자

eval a.scan(/\d+/)*?+

솔루션을 표준 출력으로 인쇄하려면 2 개의 추가 문자가 필요합니다.

p eval a.scan(/\d+/)*?+

사전 정의 된 변수를 사용하는 대신 stdin에서 읽으려면 다른 3자를 사용해야합니다.

p eval gets.scan(/\d+/)*?+

루비 1.8를 들어, 교체 ?+"+"22 자에서 작동하는 솔루션을 얻을.


입력은 stdin이 아닌 변수에서 가져와야합니다. 또한 scan보다 짧습니다 split. 따라서 솔루션은 eval s.scan(/\d+/)*?+-21자가됩니다.
sepp2k

@ sepp2k : 예, 설명을 제대로 읽지 못했습니다. 나는 다른 골프 작업에 익숙합니다. 여기서 stdin에서 읽고 stdout으로 인쇄해야합니다. 좋은 지적 scan, 감사합니다!
Ventero

+1, 위대한 사용 eval* '+'
책략 E. 코요테


5

루비 -36 34 자

s.scan(/\d+/).map(&:to_i).reduce:+

결과를 인쇄하려면 36 자.

p s.scan(/\d+/).map(&:to_i).reduce:+

입력이 s에 문자열로 가정합니다.


4

자바 스크립트 (ES6), 30

c=0,s.replace(/\d+/g,d=>c+=+d)

주석이 달린 버전 :

// Store the sum.
c=0,
// Process every number found in the `s`.
s.replace(/\d+/g,
  // Convert the number into an integer.
  // Add it to the sum.
  d => c += +d
)

3

Windows PowerShell, 23 25 29 31

출력

$x-replace'\D','+0'|iex

실제로 출력이 없으면 정확히 동일하므로 필요할 때 다른 곳에 파이프하면됩니다.


2

제이 - 40 38 자

게으른 버전. 문자열 라이브러리가 필요합니다.

+/".(,' ',.~a.-.'0123456789')charsub y

유니 코드를 지원합니다. 인코딩을 지원하고 생각하십시오!
MPelletier

2

자바

대회에서

public static long sum(String s) {
    long sum = 0;
    String p = "";
    char[] ch = s.toCharArray();
    for (int i = 0; i < ch.length; i++) {
        boolean c = false;
        if (Character.isDigit(ch[i])) {
            if (i + 1 < ch.length) {
                if (Character.isDigit(ch[i + 1])) {
                    p += ch[i];
                    c = true;
                }
            }
            if (!c) {
                p += ch[i];
                sum += Integer.valueOf(p);
                p = "";
                c = false;
            }
        }
    }
    return sum;
}

2

자바 스크립트 [30 바이트]

eval(s.match(/\d+/g).join('+'))

2

미로 , 29 21 바이트

(면책 조항 : 미궁은이 도전보다 최신입니다.)

또한 Labyrinth에는 변수가 없으므로 정상적인 입력 / 출력 프로그램을 사용했습니다.

)_"+`
( "?"
";;,;;(!@

이것은 Labyrinth의 입력 명령이 작동하는 방식으로 인해 매우 간단했습니다. ?STDIN에서 부호있는 정수를 읽으려고 시도하고 숫자가 아닌 첫 번째 숫자에서 중지합니다. 정수를 읽을 수없는 경우 (다음 문자 -뒤에 숫자가 없거나 다른 숫자가 아니거나 EOF에 도달했기 때문에) 0대신에 반환 됩니다. ,반면에 후속 바이트를 읽고 바이트 값을 푸시합니다. 이것이 EOF에서 호출되면 반환됩니다-1 대신 됩니다.

솔루션에 대한 의사 코드는 다음과 같습니다.

running total = 0
while(true)
  while(true)
    try reading a non-zero integer N with ?
    if(N < 0)
      running total -= N
    else if(N > 0)
      running total += N
    else
      break
  // We've either read a zero or hit a something that isn't a number
  try reading a character with ,
  if(that returned -1)
    break
print running total

음수를 올바르게 처리하면이 솔루션이 상당히 복잡해집니다. 그렇지 않은 경우이 8 바이트 솔루션을 사용합니다.

?+
;,;!@

1

PHP-37

인쇄하지 않고;

<?array_sum(@split("[^0-9]+",`cat`));

인쇄시 (38) :

<?=array_sum(@split("[^0-9]+",`cat`));

1

펄, 16 자

s/\d+/$r+=$&/ge;

입력을 받아 $_출력을 켭니다 $r. 마지막 세미콜론은 불필요하지만 프로그램이 더 많은 일을 할 때 필요할 것입니다. say$r출력을 위해 추가하십시오 .


죄송합니다. 게시 할 때 정확히 같은 답을 보지 못했습니다. 세미콜론 없이도 한 문자를 더 세어 보았습니다.
JB

@JB : 나는 셀 수 없다! :피. 실제로 큰 따옴표로 묶인 문자열을 에 에코하는 실수를 했습니다 wc -c.
ninjalj

1

J-23 자

승자는 아니지만 상당히 드문 프리미티브가 작동합니다.

+/".(,_=_"."0 y)}y,:' '

설명 :

  • _"."0 y-입력 문자열의 각 문자에 y대해 숫자로 읽으십시오. 당신이 할 수 없다면, _대신 기본값 (무한대)을 사용하십시오.

  • ,_=-각 결과가와 같은지 확인한 _다음 0과 1의 최종 배열을 벡터로 실행합니다. (결과에 "."0항상 하나 이상의 측정 기준을 추가하므로 여기에서 수정합니다.)

  • y,:' ' -입력 문자열 아래에 공백 행을 추가하십시오.

  • }- 그것은 여기에 같이 사용 }라고 개정 항목 과 지표가 오른쪽 인자의에서 그릴 수 행을 선택으로는 왼쪽에 0과 1의 목록을 사용합니다. 따라서 오른쪽에있는 각 열에 대해 숫자로 읽을 수있는 경우 원래 문자를 사용하고 그렇지 않으면 그 아래에 공백을 사용합니다. 따라서 숫자가 아닌 문자는 공백으로 덮습니다.

  • +/". -이제이 전체 문자열을 숫자 목록으로 변환하고 합산하십시오.


1

gs2, 4 바이트

W#Θd

CP437로 인코딩 됨 ; 세 번째 바이트는 E9입니다.

W/-?\d+/문자열에서 모든 숫자 를 읽고 절대 값, d합계를 매핑 합니다.

(gs2도이 도전보다 새로운 것이지만, 그 read-nums명령은 총 우연의 일치입니다.)


0

스몰 토크 (Smalltalk / X) (51 자)

정규식 패키지 사용하기 :

(s regex:'\d+' matchesCollect:[:n|n asNumber])sum

wo 정규식 :

((s asCollectionOfSubCollectionsSeparatedByAnyForWhich:[:c|c isDigit not]) map:#asNumber)sum

s의 입력


0

R, 30

sum(scan(t=gsub("\\D"," ",x)))

여기서, x변수의 이름입니다.

예:

> x  <- "e7rde f ,fe 43 jfj 54f4sD"
> sum(scan(t=gsub("\\D"," ",x)))
Read 4 items
[1] 108

0

자바 스크립트-43 자

나는 그것이 길다는 것을 알고 있지만 JS 솔루션은 없었습니다. :)

c=0
a=a.split(/[^\d]/g)
for(i in a)c+=+a[i]

a문자열입니다. c답변이 들어 있습니다.


0

Tcl, 30

expr [regsub -all \\D+ $a.0 +]

입력이 변수에 $a(공식적으로 in a) 있다고 가정 하고 해석기를 인터프리터 결과에 저장합니다. I / O는 연습으로 남습니다.


0

APL, 16 바이트

{+/⍎b\⍵/⍨b←⍵∊⎕d}

⎕d숫자 (0-9)를 포함하는 내장입니다. b0/1의 벡터에 할당됩니다. 여기서 1은 숫자 인 문자에 제공됩니다. b주어진 문자 배열을 압축 한 다음 다시 확장하여 공백을 삽입하는 데 사용됩니다. 이 경우 문자열을 벡터로 변환하는 APL eval 입니다. +/합계를 계산합니다.


길이는 동일하지만 흥미 롭습니다.+/2⊃⍞⎕VFI⍨⎕AV~⎕D
Adám

0

스위프트 3, 78

s.characters.split{!("0"..."9"~=$0)}.flatMap{Int(String($0))}.reduce(0){$0+$1}

s문자열이 어디 있어요



0

실제로 14 바이트 (비경쟁)

9u▀8╙r♂┌-@s♂≈Σ

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

실제로는이 도전보다 상당히 새롭기 때문에이 제출은 경쟁이 아닙니다.

이 프로그램은 입력을위한 CP437 코드 페이지를 지원합니다.

설명:

9u▀8╙r♂┌-@s♂≈Σ
9u▀             base 10 digits (0-9)
   8╙r♂┌        all characters in CP437 (map(ord_cp437, range(2**8)))
        -       set difference
         @s     split input on any value in the resulting list
           ♂≈Σ  convert to ints and sum

0

C 100

t=0;main(i,v)char**v;{for(char*q,*s=v[1];i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}

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

프로그램 내부의 문자열을 하드 코딩하여 비트를 부정하는 이전 85 바이트 버전 :

t=0;main(i){for(char*q,*s;i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}

실제로 85 바이트 프로그램을 사용하려면 다음과 같이 변수를 지정해야합니다.

t=0;main(i){for(char*q,*s="text";i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.