문자열 내 숫자의 뺄셈


14

문자열을 입력으로 사용하고 문자열의 모든 숫자를 더하기 / 빼기를 ​​수행하여 해당 연산의 합계를 결과로 출력하십시오.

규칙

  • 문자열의 숫자는 왼쪽에서 오른쪽으로 읽습니다.
  • 숫자 (n)가 홀수이면 다음 숫자 (n + n1)로 더하기를 수행하십시오.
  • 숫자 (n)가 짝수이면 다음 숫자 (n-n1)로 빼기를 수행하십시오.
  • 문자열의 마지막 숫자에 도달 한 경우 문자열의 첫 번째 숫자로 작업을 수행하십시오.
  • 결과는 모든 결과 값의 합입니다
  • 문자열에 숫자가 하나 뿐인 경우 자체적으로 작업을 수행하십시오 (n + n 또는 nn).
  • 문자열에 숫자가 없으면 출력은 0입니다.

Input: r5e6o9mm!/3708dvc    
Process: (5+6) + (6-9) + (9+3) + (3+7) + (7+0) + (0-8) + (8-5)
Output: 32

노트

  • 기능 또는 전체 프로그램이 허용됩니다
  • 최대 입력 길이는 문자열 입력에 대한 언어 제한에 따라 다릅니다.
  • 문자 입력에는 제한이 없지만 반 자릿수 만 출력에 포함됩니다.
  • 가장 적은 바이트가 승리

4
몇 가지 예가 더 좋습니다
dylnan

2
홀수 자릿수로 끝나는 테스트 사례를 추가하는 것이 좋습니다.
Arnauld

3
제안 된 테스트 케이스 : "", "0","1"
TSH

1
문자열 대신 문자 배열로 입력을 취할 수 있습니까? (줄리아는이 두 가지를 구별합니다.)
Sundar-Reinstate Monica

4
@sundar 현재 합의 는 문자열이 일련의 문자로 정의된다는 것입니다. 따라서 언어에 기본 문자열 유형 이 있더라도 기본적으로 문자 배열이 허용됩니다 .
Arnauld

답변:


6

젤리 , 17 15 12 바이트

fØDV€ḂT‘ịƲSḤ

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

테스트 사례를 시도하십시오.

프로그램은 홀수 자릿수 뒤에 오는 자릿수 만 유지 한 다음 합계의 두 배를 계산합니다.

fØDV€ḂT‘ịƲSḤ   
f                   Remove anything that isn't...
 ØD                 a digit.
   V€               Cast each digit to an integer
         Ʋ          Monad:
     Ḃ              Parity of each digit.
      T             Indices of truthy elements (odd digits).
       ‘            Increment.
        ị           Index into list of digits.
                    Wraps to beginning and if there are no digits this returns 0.
          S         Sum.
           Ḥ        Double.

3

K (oK) , 47 43 40 31 바이트

해결책:

{+/(1_x,*x)*2*2!x^:(x-:48)^!10}

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

설명:

숫자가 아닌 문자열에서 모든 모듈을 제거하고 모듈로 2, 2를 곱하고 x에 1을 곱한 값을 곱하고 합산하십시오.

{+/(1_x,*x)*2*2!x^:(x-:48)^!10} / solution
{                             } / lambda taking implicit x
                           !10  / range 0..10
                          ^     / except
                   (     )      / do this together
                    x-:48       / subtract 48 from x (type fudging char ascii value -> ints), save back into x
                x^:             / x except right, and save back to x
              2!                / modulo 2
            2*                  / multiply by 2
           *                    / multiply by
   (      )                     / do this together
        *x                      / first element of x
       ,                        / append to
      x                         / x
    1_                          / drop first (ie rotate everything by 1)
 +/                             / sum, add (+) over (/)

순진한 솔루션 :

숫자가 아닌 문자열에서 모든 것을 제거하고 (변환하는 동안) 2 항목 슬라이딩 창을 가져 와서 홀수인지 짝수인지 파악하고 적절하게 더하기 / 빼기를 ​​적용한 다음 요약하십시오.

{+/((-;+)2!x).'2':(1+#x)#x^:(x-:48)^!10}

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

노트:

  • -4 바이트더 똑똑한 입력 필터링 방식으로 인해 @ngn 덕분에
  • -3 바이트모양을 바꾸는 대신 슬라이딩 윈도우를 사용하여
  • ngn 솔루션을 이식하는 -9 바이트 (순진하지 않은 접근 방식)

1
x:48!x@&x in,/$!10->x^:(x-:48)^!10
ngn

q / kdb +에 솔루션을 작성한 다음 oK로 포팅했습니다 ... 아직 몇 바이트를 더 짜낼 수 있습니다!
streetster

1
나는 ngn / k에 별도의 답변 을 게시했으며 자유롭게 아이디어를 가져올 수 있습니다. 필자는 파서가 쓰레기로 인해 oK가 가장 짧을 것이라고 생각합니다. 수정 된 할당을 올바르게 구문 분석하지 않습니다. 그건 그렇고, 나는 ':"슬라이딩 창"으로 인식하지 못했습니다 .
ngn

k에 익숙한 것 같습니다. 같은 생각을 가진 사람들과 벡터 프로그래밍에 대해 이야기하거나 나머지 사람들이보고있는 것을보고 싶다면 이 대화방이 있습니다 . 혼란의 대부분은 APL에 관한 것이지만 k와 J도 주제입니다.
ngn



2

Powershell, 80 78 76 바이트

($d="$args"-split'\D*'-ne'')+$d[0]|?{$p-match'[13579]';$p=$_}|%{$s+=2*$_};$s

-2 바이트 덕분에 Neil 망막 솔루션

-2 바이트 감사 AdmBorkBork

테스트 스크립트 :

$f = {
($d="$args"-split'\D*'-ne'')+$d[0]|?{$p-match'[13579]';$p=$_}|%{$s+=2*$_};$s
}

&$f 'r5e6o9mm!/3708dvc'

설명

우선 : 이전 숫자가 홀수이면 2 * n을 더하고 이전 숫자가 짝수이면 0을 더합니다.

($d="$args"-split'\D*'-ne'')+ # let $d is array contains digits only, each element is a digit
$d[0]|                        # apend first digit to the end of the array
?{                            # where for each digit
    $p-match'[13579]'         # predicate is 'previous digit is odd' (it is false on the first iteration because $p is null)
    $p=$_                     # let previous digit is current
}|
%{                            # for each digit matched to the predicate
    $s+=2*$_                  # add current digit multiply 2 to $s. 
}
$s                            # return sum

추가, 99 바이트

@Neil에서 영감을 얻었습니다. '이전 자릿수는 홀수'인 정규식 일치 자릿수입니다. Matches자동 변수 .

param($d)$d+($d-match'\d')+$Matches[0]|sls '(?<=[13579]\D*)\d'-a|%{$_.Matches.Value|%{$s+=2*$_}};$s

1
와 같은 parens 로 이동 하여 바이트 스와핑 |?{$_}을 절약하십시오 . -ne''$d="$args"-split'\D*'-ne''($d="$args"-split'\D*'-ne'')+$d[0]
AdmBorkBork

2

MATL , 18 17 바이트

t4Y2m)!Ut1YSof)sE

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

(Luis Mendo / Giuseppe / both 덕분에 1 바이트!)

설명:

     % Implicit input
 t   % duplicate input
     % stack: ['r5e6o9mm!/3708dvc' 'r5e6o9mm!/3708dvc']
 4Y2 % push inbuilt literal, characters '0':'9'
     % stack: ['r5e6o9mm!/3708dvc' 'r5e6o9mm!/3708dvc' '0123456789']
 m)  % extract only characters from input that belong to '0':'9'
     % stack: ['5693708']
 !U  % transpose and convert each value from string to number
     % stack: [5 6 9 3 7 0 8]
 t   % duplicate that
 1YS % circular shift by 1
     % stack: [[5 6 9 3 7 0 8] [8 5 6 9 3 7 0]]
 o   % parity check - 1 for odd, 0 for even
     % stack: [[5 6 9 3 7 0 8] [0 1 0 1 1 1 0]]
 f   % find non-zero value indices in last array
     % stack: [[5 6 9 3 7 0 8] [2 4 5 6]]
 )   % index at those places in the first array
 s   % sum
 E   % multiply by 2
     % (implicit) convert to string and display

기본 아이디어는 짝수 뒤에 오는 숫자는 무시할 수 있고 홀수 뒤에 오는 숫자는 두 배가되고 최종 결과는이 두 배 값의 합입니다.

나는 f패리티 검사 o가 필요 하다고 생각하지 않았지만 어떤 이유로 MATL은 o논리 배열로서의 0과 1의 배열을 논리 배열로 보지 않고 대신 숫자 인덱스와 인덱스로 위치 1와로 가져 end갑니다.


!U대신 사용할 수 있다고 생각합니다 48-. 조옮김은 여기서 아무런 해를 끼치 지 않는 것 같습니다. o위한 double입력 단이고 mod(...,2), 그래서 출력된다 double. 좋은 NaN입력 트릭! 이것이 STDOUT의 외부 출력을 해결하기위한 것이라면 Dennis 는 아이디어를 가지고 있고 곧 고칠 것입니다.
Luis Mendo

!U대신48-
Giuseppe

@LuisMendo welp, 당신은 펀치에 나를 이겼다!
주세페

@Giuseppe :-D :-D
Luis Mendo

편집 해 주셔서 감사합니다. @LuisMendo 언제 o논리 배열 출력을 제공합니까? (필자는 MATLAB의 숫자 형 시스템을 한번도 본 적이 없다고 고백해야한다.) 그리고 그래, 나는 NaN어디에서든 실제 입력이 될 수 없기 때문에 좋은 센티넬을 만들 것이라고 생각 했지만, 더 이상 필요하지 않을 것이라는 것을 아는 것이 좋다 !
sundar-복원 모니카

2

K (ngn / k) , 33 바이트

{+/(1_x,*x)*2*2!x:-48+x^x^,/$!10}

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

{ } 인수가있는 함수입니다 x

!10 목록입니다 0 1 ... 9

$ 문자열로 변환

,/ 사슬 같이 잇다

x^x오른쪽에없는 것을 의미

x^x^수단 x오른쪽에 무엇이와 교차는, 즉에서만 숫자를 유지x

-48+빼기 ( 48의 ASCII 코드)"0"

x: 할당하다 x

2! 모드 2

2* 2 곱하기

1_x,*xx다음 중 하나의 드롭 입니다 x. 즉x 한 단계 씩 왼쪽으로 회전

+/ 합집합


2

apt (v2.0a0), 25 19 바이트

-6 덕분에 바이트 얽히고 설킨 .

kè\D
íȰ*2*Y°u}Ué)x

여기 사용해보십시오 .

이번에는 숫자없이 작동합니다! 입력은 문자 목록입니다.


Japt v2 로의 전환을 포함하여 19 바이트 x그러나 함수 의 배열에 만족하지 않습니다 . 궁금한 점이 있으면 채팅으로 핑을 보내십시오 .
얽히고 설킨

입력에 숫자가 없으면이 기능이 전혀 작동하지 않습니다.
얽히고 설킨

또한 v2.0a0의 소스 인 @Shaggy는 어디에 있습니까? 레포에서 찾을 수 없습니다.
LegionMammal978

이것은 v1이고 이것은 v2입니다.
얽히고 설킨

채팅에서 놓친 경우 12 바이트 로 줄였습니다.
얽히고 설킨

2

05AB1E , 12 9 바이트

Dylnan의 패리티 트릭 을 활용하여 순진한 방법보다 1 바이트 절약 Xcoder
덕분에 3 바이트 절약

þDÁ€ÉÏSO·

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

설명

þ              # push only digits of input
 D             # duplicate
  Á            # rotate right
   ۃ          # get the parity of each
     Ï         # keep only true items
      SO       # calculate digit-sum
        ·      # double

흠, 것 þÀIþ€ÉÏSO·, þÀDÁ€ÉÏSO·, þÀ¹þ€ÉÏSO·또는 þÀsþ€ÉÏSO·-2 바이트 모든 테스트 케이스를 통과?
Mr. Xcoder

@ Mr.Xcoder : 아, 그렇습니다. 좋은! 우리는 심지어 þDÁ€ÉÏSO·-3을 위해 할 수 있습니다 :)
Emigna

1

망막 , 37 바이트

(\d).*
$&$1
L$`(?<=[13579]\D*).
2**
_

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

(\d).*
$&$1

첫 번째 숫자의 사본을 추가하십시오.

L$`(?<=[13579]\D*).

첫 번째 이전 자릿수가 홀수 인 모든 항목을 찾습니다.

2**

모든 일치 항목을 단항으로 변환하고 두 배로 만듭니다. 숫자가 아닌 숫자는 0으로 처리됩니다.

_

합계를 가져옵니다. 일치하는 항목이 없으면 필요한만큼 0을 생성합니다.

Retina 0.8.2에서 할 수있는 최선은 44 바이트였습니다.

[^\d]

(.).*
$&$1
(?<![13579]).

.
$*
.
..
.

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

[^\d]

숫자가 아닌 숫자를 삭제하십시오.

(.).*
$&$1

첫 번째 숫자의 사본을 추가하십시오.

(?<![13579]).

홀수 자릿수를 따르지 않는 자릿수를 삭제하십시오.

.
$*

단항으로 변환합니다.

.
..

두 배로

.

합계를 가져옵니다.


마지막 숫자가 홀수가 아닌 경우 결과가 정확하지 않을까 걱정됩니다.
mazzy

1
@mazzy 마지막 숫자를 말할 때 첫 번째 숫자를 끝까지 복사하기 전 또는 후에 의미합니까?
Neil

'끝까지'. '첫 번째 숫자의 복제본 추가'단계가 끝으로 복사되고 있습니까? 확인. 멋있는. 감사합니다
mazzy


1

자바 스크립트 (ES6), 56 바이트

문자 배열로 입력을받습니다.

s=>s.map(c=>1/c?r+=p*(p=c*2&2,n=n||c,c):0,n=p=r=0)|r+p*n

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

댓글

s =>                     // given the input array s[]
  s.map(c =>             // for each character c in s[]:
    1 / c ?              //   if c is a digit:
      r +=               //     update r:
        p * (            //       p = either 0 or 2 (always 0 on the 1st iteration)
          p = c * 2 & 2, //       p = 0 if c is even, 2 if c is odd
          n = n || c,    //       if n is still equal to 0 (as an integer), set it to c
          c              //       compute p * c
        )                //     add the result to r
    :                    //   else:
      0,                 //     do nothing
    n = p = r = 0        //   n = first digit, p = previous digit, r = result
  )                      // end of map()
  | r + p * n            // compute the last operation with the 1st digit and add it to r

1

자바 스크립트 (Node.js) , 85 84 83 82 바이트

ovs 덕분에 -1 바이트

s=>(s.match(/\d/g)||[]).reduce((r,n,i,a)=>r+(+n)+a[a[++i]!=null?i:0]*-(1-n%2*2),0)

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

문자열 입력을 취하고 숫자를 문자 배열로 찾거나없는 경우 빈 배열을 반환 한 다음 유형 강제 변환을 사용하여 값을 올바르게 더하거나 뺍니다. 정방향 조회는 색인을 미리 증가시키고 간결성을 위해 널 검사를 사용한 다음 마지막 부분은 숫자가 홀수인지 또는 더하기 또는 빼기 (+ 및-는-등)인지 확인합니다.


n-0할 수 있습니다+n
OVS

PPCG에 오신 것을 환영합니다!
코너 오브라이언

1

R , 58 바이트

function(x,y=strtoi(x[x%in%0:9]))sum(c(y[-1],y[1])*y%%2*2)

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


array출력이 마음에 들지 않으면 67 바이트 .
Giuseppe

1
흠 실제로 빈 배열 때문에 내적을 사용할 수 없으므로 xxx인덱싱 변경을 사용 a하여 생성 하면 68 바이트 y입니다.
주세페

@ 주세페 : 수정, 감사 :)
digEmAll

@ 주세페 : 당신이 더 현명한 코드 골퍼이기 때문에 당신의 의견을 묻습니다 ... 의견에서 우리는 문자 벡터를 사용할 수있는 것 같습니다.이 경우 61 바이트가 가능합니다 : 온라인으로보십시오! 어떻게 생각해 ?
digEmAll

strtoi대신에 사용하십시오 as.double. 그러나 그렇습니다.
주세페



0

C Sharp 180 바이트

이것은 골프가 좋지 않다, 롤.

s=>{var q=new Queue<int>(s.Where(Char.IsNumber).Select(n=>n-48));q.Enqueue(q.First());int t,o=0;o=q.Dequeue();try{while(true){t+=o+(o%2==0?-1:1)*(o=q.Dequeue());}}catch{return t;}}

언 골프 :

var q = new Queue<int>(s.Where(Char.IsNumber).Select(n=>n-48));
int t,o=0;

q.Enqueue(q.First());    
o=q.Dequeue();

try{
    while(true){
        t += o + (o%2==0?-1:1) * (o=q.Dequeue());
    }
}
catch {
    return t;
}

0

Stax , 14 바이트

ÿ←«4é■≥B▬ê→█T♥

실행 및 디버깅

포장을 풀고 포장을 풀고 주석을 달았습니다.

Vd|&    filter out non-digits
c|(\    zip into pairs after rotating right
F       for each digit pair
  B2%s  first-of-pair % 2, then swap top two stack elements
  eH*   eval digit as integer, double, then multiply
  +     add to running total

이것을 실행


0

자바 스크립트 (ES6), 52 바이트

s=>s.filter(t=>1/t&&~(a+=u*t,u=t%2),a=u=0)[0]*u+a<<1

입력을 문자 배열로 예상합니다. 주의 사항 : 비트 시프 팅을 사용하기 때문에 출력의 상한은2^31-1

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

설명

기본적으로 홀수 값 뒤에 오는 자릿수의 두 배입니다.

s => s.filter(             // filter to preserve the first digit
    t =>
        1/t &&             // short-circuits if NaN
        ~(                 // coerce to truthy value
            a += u * t,    // adds value only if previous digit is odd
            u = t%2        // store parity of current digit
        ),
    a = u = 0
)[0]                       // first digit
* u + a
<< 1                       // bit-shift to multiply by 2 (also coerces a NaN resulting from a string devoid of digits to 0)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.