필터링 및 합산


16

직무

작업은 매우 간단합니다. 숫자 , 대문자 및 소문자를 포함하는 비어 있지 않은 문자열이 주어지면 나머지 숫자의 합계를 출력합니다. 예를 들면 다음과 같습니다.

a1wAD5qw45REs5Fw4eRQR33wqe4WE

모든 문자를 필터링하면 다음과 같은 결과가 발생합니다.

 1   5  45   5  4    33   4

이 숫자의 합은입니다 1 + 5 + 45 + 5 + 4 + 33 + 4 = 97. 따라서 출력은입니다 97.

테스트 사례

a > 0
0 > 0
5 > 5
10 > 10
a0A > 0
1a1 > 2
11a1 > 12
4dasQWE65asAs5dAa5dWD > 79
a1wAD5qw45REs5Fw4eRQR33wqe4WE > 97

이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!


나는 이전에 Labyrinth 프로그램을 작성했다는 것을 알았습니다 ... 여기에도 같은 도전이 있지만 음수도 있습니다 (일부 언어에서는 놀랍도록 큰 차이가 생겨서 나는 그것이 속고 있다고 생각하지 않습니다).
— Martin Ender

@ MartinBüttner 음수를 포함하지 않는 것 같습니다. "-n (여기서 n은 정수)은 음수 n으로 계산되지 않지만 하이픈 뒤에 n이옵니다."
— Paul

아 무슨 말인지 알 겠어 하이픈이 있지만 그렇지 않은 것입니다.
— Paul

답변:


22

GS2, 2 바이트

Wd

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

작동 원리

W     Read all numbers.
      For input x, this executes map(int, re.findall(r'-?\d+', x)) internally.
 d    Compute their sum.

11
글쎄요, 이것은 예기치 않은 일이었습니다 ...
— Adnan

@Adnan : 데니스입니다. 충분한 시간이 주어지면 4 바이트 미만의 코드 골프 솔루션을 찾을 수 있습니다.
— Deusovi

13

미로 , 8 바이트

피시스 ...

?+
;,;!@

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

설명

일반적인 프라이머 (Sp3000에서 도난) :

  • 미로는 2D 및 스택 기반입니다. 스택의 맨 아래에는 무한의 0이 있습니다.
  • 명령 포인터가 접점에 도달하면 스택의 상단을 확인하여 다음 회전 위치를 결정합니다. 음수는 남아 있고, 0은 앞으로, 양수는 오른쪽입니다.

여기에서 정말 유용하는 것은 미로는 두 개의 서로 다른 입력 명령을 가지고 있다는 것입니다 ,및 ?. 전자는 STDIN 또는 -1EOF 에서 단일 바이트를 읽습니다 . 후자는 STDIN에서 정수를 읽습니다. 숫자 가 아닌 모든 것을 건너 뛰고 찾은 첫 번째 십진수를 읽습니다. 이것은 0EOF로 돌아 오므로 여기서는 EOF를 안정적으로 확인하는 데 사용할 수 없습니다.

프로그램의 주요 루프는 다음과 같은 컴팩트 비트입니다.

?+
;,

와 ?함께 우리 정수 (모든 문자를 무시)을 읽는 +우리는 (스택 하단의 암시 제로의 한으로 밖으로 시작) 누적 합계에 추가합니다. 그런 다음 ,EOF를 확인하기 위해 다른 문자를 읽습니다 . 우리가 EOF에 있지 않는 한, 읽기 문자는 양의 문자 코드를 가진 문자가 될 것이므로 IP는 오른쪽에서 (즉, 서쪽으로) 바뀝니다. ;캐릭터가 필요하지 않기 때문에 캐릭터를 버리고 루프에 다시 들어갑니다.

우리가 EOF에 들어가면, ,밀어 -1는 IP 회전 왼쪽 있도록 (동쪽) 대신. ;다시을 버리고 -1, !누계를 정수로 인쇄 @하고 프로그램을 종료합니다.


멋진 물건 마틴!
— 시몬스

6

CJam, 13 바이트

Dennis 덕분에 숫자없이 입력으로 작동하도록 수정되었습니다! 또한 문자 배열을 코드 포인트 64 이상의 ASCII 배열로 대체하여 바이트를 저장했습니다. 그런 다음 Dennis가 저장 한 다른 바이트입니다.

q_A,s-Ser~]1b

문자에서 공백으로 간단한 음역, 그런 다음 평가 및 합계. 온라인으로 사용해보십시오 .



5

망막 ,22 11

\d+
$0$*1
1

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

Martin 덕분에 11 바이트 (!)가 절약되었습니다!

기본적으로 십진수에서 단항으로 1s 를 계산하십시오 .


1
$0대체가로 시작하면 암시 적으로 만들어야 합니다 $*. 매우 일반적인 패턴으로 Pyth를 이길 수있었습니다. ;)
— Martin Ender 2016

@ MartinBüttner 당신이 그것에있는 동안 당신은 올바른 문자도 뭔가를 기본값으로 만들 수 있습니다 : O
— FryAmTheEggman

흠, 나쁜 생각이 아닙니다. 나는 그것에 대해 생각합니다.
— Martin Ender

5

apt, 2 바이트

Nx

온라인으로 테스트하십시오!

작동 원리

N    // Implicit: N = (parse input for numbers, "strings", and [arrays])
x    // Sum. Implicit output.

내가 오류 "Japt.stdout"를 얻고 것은는 HTMLElement로 보내야합니다
— Downgoat

@Downgoat 가끔 발생합니다. 왜 그런지 잘 모르겠습니다. 페이지를 새로 고침하면 문제가 해결 된 것 같습니다.
— ETHproductions

5

자바 스크립트 ES6, 35 바이트

s=>eval(s.replace(/\D+/g,'+')+'.0')

작동 원리

먼저 숫자가 아닌 각 문자열을로 바꿉니다 "+". 기본적으로 네 가지 방법이 있습니다.

1. 1b23c456   => 1+23+456
2. a1b23c456  => +1+23+456
3. 1b23c456d  => 1+23+456+
4. a1b23c456d => +1+23+456+

사례 1과 2는 이미 처리되었습니다. 그러나 우리는 어떻게 든 +오류를 일으키지 않도록 마지막을 수정해야합니다 . 로 제거 할 수 .replace(/\+$,"")있지만 너무 비쌉니다. 0끝에 a 를 추가 할 수 있지만 문자열이 a로 끝나지 않으면 마지막 숫자에 영향을 미칩니다 +. 타협은 append입니다 .0. 이는 자체적으로 유효한 숫자이며 다른 정수의 값에는 영향을 미치지 않습니다.

다음과 같은 다른 값도 있습니다.

.0
-0
 +0
-""
-[]
0/10
0e-1
.1-.1

대체 버전, 35 바이트

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

다른 대체 버전, 36 바이트

s=>s.split(/\D/).map(d=>t+=+d,t=0)|t

4

Pyth, 12 11 10 바이트

ssM:z"\D"3
    z        autoinitialized to input()
   : "\D"3   split on non-digits
 sM          convert all elements of resulting array to ints
s            sum

다행히 빈 문자열에 적용 s하면 (int로 변환)이 반환 0되므로 split("a1b", "\D+")return 이 사실에 대해 걱정할 필요가 없습니다 ["", "1", ""]. 마찬가지로을 split("a", "\D+")반환합니다 ["", ""].

때문에 심지어 나에게 개별적으로 모든 비 자리에 분할 할 수 있습니다 1 + 0 + 0 + 0 + 0 + 2와 같은 것입니다 1 + 2.

바이트에 대해 Thomas Kwa 에게 감사합니다 !


4

Gol> <> , 4 바이트

iEh+

너무 짧아서 더미 텍스트가 필요합니다 ...


3
아마도 당신은 여분의 공간으로 코드를 설명해야 할 것입니다 :)
— nneonneo

4

펄 6 , 18 바이트

{[+] .comb(/\d+/)}
{[+] .split(/\D/)}

용법:

my &code = {[+] .comb(/\d+/)}

say code 'a'; # 0
say code '0'; # 0
say code '5'; # 5
say code '10'; # 10
say code 'a0A'; # 0
say code '1a1'; # 2
say code '11a1'; # 12
say code '4dasQWE65asAs5dAa5dWD'; # 79
say code 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'; # 97

3

젤리, 6 바이트

&-ṣ-ḌS

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

작동 원리

&-ṣ-ḌS  Main link. Input: L (string)

&-      Take the bitwise AND of L's characters and -1.
        This attempts to cast to int, so '0' & -1 -> 0 & -1 -> 0.
        On failure, it returns the integer argument (if any), so 'a' & -1 -> -1.
  ṣ-    Split the resulting list at occurrences of -1.
    Ḍ   Convert each chunk from decimal to integer. In particular, [] -> 0.
     S  Compute the sum of the results.

3

펄, 21 + 1 = 22 바이트

$_=eval join"+",/\d+/g

-p플래그가 필요합니다 :

$ perl -pe'$_=eval join"+",/\d+/g' <<< 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'
97

숫자가 없을 때 작동합니까? 예를 들어 a?
— FryAmTheEggman

@FryAmTheEggman 좋은 질문, 그것은 숫자 문맥에서 0;-) 아무것도 인쇄하지 않을 것 같아요
— andlrc

3

줄리아, 35 바이트

s->sum(parse,matchall(r"\d+","0"s))

이것은 문자열을 받아들이고 정수를 반환하는 익명 함수입니다. 호출하려면 변수에 지정하십시오.

우리 matchall는 정규 표현식과 일치하는 배열을 얻는데 사용 하는데 \d+, 이것은 문자열의 정수일뿐입니다. 문자열 앞에 0을 붙여야합니다. 그렇지 않은 경우 "a"빈 배열에 대해 합산하면 오류가 발생합니다. 그런 다음 parse각 문자열 일치에 적용 하여 정수로 변환하고 합계를 가져옵니다.


parse될 수 있습니다 int당신이 중단 경고 괜찮다면.
— Dennis

@Dennis 나는 비록 ._.
— Alex A.

2

PHP, 64 바이트

<?php preg_match_all("/\d+/",$argv[1],$a);echo array_sum($a[0]);

다음과 같이 실행하십시오.

php -f filterOutAndAddUp.php <test_case>

https://eval.in/517817


프로그래밍 퍼즐 및 스택 교환에 오신 것을 환영합니다. 이것은 훌륭한 답변 (+1)이지만 코드 설명과 분석을 추가하여 향상시킬 수 있습니다. 또한 <?대신에 사용할 수 <?php있습니까?
— wizzwizz4

2

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

s=>eval((s.match(/\d+/g)||[0]).join`+`)


2

수학, 51 바이트

Total@ToExpression@StringCases[#,DigitCharacter..]&

장황한 Mathematica 내장의 잘못된 끝을 잡기. @DavidC의 도움으로 1 바이트 할인


DigitCharacter ..1 바이트를 절약합니다
— DavidC

DigitCharacter우리가 모든 문자를 제거하고 싶지만 모든 숫자를 제거하기 때문에 서면으로 작동하지 않습니다 ...
— 시몬스

1
네 말이 맞아 나는 생각하고 있었다Total@ ToExpression@StringCases[#, DigitCharacter ..] &
— DavidC

내가 참조! 그래, 그 변화는 바이트를 절약 해준다.
— 시몬스

2

R, 46 43 바이트

sum(strtoi(strsplit(scan(,''),'\\D')[[1]]))

설명

                    scan(,'')                  # Take the input string
           strsplit(         ,'\\D')           # Returns list of all numeric parts of the string
                                    [[1]]      # Unlists to character vector
    strtoi(                              )     # Converts to numeric vector
sum(                                      )    # Sums the numbers

샘플 런

> sum(strtoi(strsplit(scan(,''),'\\D')[[1]]))
1: a1wAD5qw45REs5Fw4eRQR33wqe4WE
2: 
Read 1 item
[1] 97

편집 :로 대체 [^0-9]되었습니다 \\D.


프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다. 이것은 훌륭한 첫 번째 대답입니다. 그러나 코드 설명과 분석을 추가하여 개선되므로 작동 방식을 알 수 있습니다.
— wizzwizz4

1

PowerShell, 28 26 바이트

$args-replace"\D",'+0'|iex

입력 $args을 받아 정규 표현식 -replace을 수행하여 문자를 +0로 바꾸고 파이프를 iex(와 짧게 Invoke-Expression및 비슷하게 eval) 파이프합니다 .

PS C:\Tools\Scripts\golfing> .\filter-out-and-add-up.ps1 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'
97

대안 적으로

외부 출력에 문제가 없으면 28 26 바이트 에서도 다음을 수행 할 수 있습니다 .

$args-split"\D"|measure -s

그러면 입력 문자열 걸릴 $args및 -split(공정에서이를 제거하는) 비 숫자의 배열 수준의 문자열로한다. 예를 들어로 1a2b33바뀝니다 ['1','2','33']. 우리는 그것을 매개 변수 Measure-Object와 함께 파이프합니다 -Sum. 출력은 다음과 같습니다.

PS C:\Tools\Scripts\golfing> .\filter-out-and-add-up.ps1 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'

Count    : 21
Average  : 
Sum      : 97
Maximum  : 
Minimum  : 
Property : 

편집-durr, [ ]더 이상 가능한 일치 목록을 지정하지 않기 때문에 정규 표현식에서 필요하지 않습니다 ...


1

Gema, 39 자

<D>=@set{s;@add{${s;};$0}}
?=
\Z=${s;0}

샘플 실행 :

bash-4.3$ gema '<D>=@set{s;@add{${s;};$0}};?=;\Z=${s;0}' <<< 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'

1

정말 13 바이트

,ú;û+@s`≈`MΣl

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

설명:

,ú;û+@s`≈`MΣl
,              push input
 ú;û+          push "abc...zABC...Z" (uppercase and lowercase English letters)
     @s        split on letters
       `≈`M    convert to ints
           Σ   sum
            l  length (does nothing to an integer, pushes 0 if an empty list is left, in the case where the string is all letters)

@Adnan Good catch-로 빈 목록을 출력합니다 a. 1 바이트 수정이어야합니다.
— Mego


1

TI 기본, 106 바이트

TI-83 / 84 계산기에서 작동합니다!

Input Str1
"{0,→Str2
Str1+"N0→Str1
For(I,1,length(Ans
sub(Str1,I,1
If inString("0123456789",Ans
Then
Str2+Ans→Str2
Else
If ","≠sub(Str2,length(Str2),1
Str2+","→Str2
End
End
sum(expr(Ans


1

R, 50 바이트

gsubfn설치 필요

sum(gsubfn::strapply(scan(,''),'\\d+',strtoi)[[1]])

용도 strtoi숫자에 강요


1

루비 45 바이트

$*[0].split(/[a-z]/i).map(&:to_i).inject 0,:+

(첫 번째 시도는 이것을 다시 방문 할 것입니다)


1

POSIX sh + tr + dc, 27 25 바이트

dc -e "0d`tr -sc 0-9 +`p"

모든 비 숫자 (종료 개행 문자 포함)를 +연산자로 변환하고 스택에 두 개의 0을 입력하고 (입력이 비 숫자로 시작하는 경우) 모두 추가하고 결과를 인쇄합니다. 스택의 맨 아래에 여분의 0이 남아있을 수 있지만 우리는 신경 쓰지 않습니다.


1

루아, 51 바이트

한 번은 꽤 짧습니다! Java보다 짧습니다! 입력이 작동하려면 명령 줄 인수 여야합니다.

a=0 arg[1]:gsub("%d+",function(c)a=a+c end)print(a)

언 골프

a=0                 -- Initialize the sum at 0
arg[1]:gsub("%d+",  -- capture each group of digits in the string
  function(c)       -- and apply an anonymous function to each of them
  a=a+c             -- sums a with the latest group captured
end)               
print(a)            -- output a

1

배쉬 + GNU 유틸리티, 29

grep -Eo [0-9]+|paste -sd+|bc

숫자가없는 입력을 지원해야하는 경우 (예 :) a다음을 수행 할 수 있습니다.

배쉬 + GNU 유틸리티, 38

@TobySpeight 덕분에 1 바이트가 절약되었습니다.

(grep -Eo [0-9]+;echo 0)|paste -sd+|bc

입력 할 내용이 없습니다 a. 우리는 현재 그것이 유효한지 아닌지를 논의하고 있습니다.
— Dennis

@ 데니스. 확인. 두 가지 경우 모두를 다루기 위해 다른 버전을 추가했습니다.
— Digital Trauma

해를 끼치 지 않고 항상 0을 추가 하는 ;대신 대신 사용할 수 있습니다 ||.
— Toby Speight

@TobySpeight 예, 좋습니다-감사합니다!
— Digital Trauma

1

파이썬 2, 70 바이트

나는 재미를 위해 파이썬 답변을 넣고 있습니다.

import re
j=0
for i in map(int,re.findall('\d+',input())):j+=i
print j

매우 간단하고 정규식을 사용하여 입력의 모든 숫자를 찾습니다. 온라인으로 사용해보십시오!


1
이 맥락 raw_input에서 python3 을 사용 하거나 python3으로 전환해야합니다. 더 작은 버전 (py3, 56 바이트) : import re;print(sum(map(int,re.findall('\d+',input())))).
— Dica

1

Oracle SQL 11.2, 105 바이트

SELECT NVL(SUM(TO_NUMBER(COLUMN_VALUE)),0)FROM XMLTABLE(('"'||regexp_replace(:1,'[a-zA-Z]','","')||'"'));

정규식은 알파벳 문자를 ','

XMLTABLE은 ','를 구분 기호로 사용하여 문자열에서 항목 당 하나의 행을 만듭니다.

결과를 얻기 위해 행을 합산하십시오.

숫자가없는 문자열을 처리하려면 NVL이 필요합니다.

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