필터링 및 합산


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.