숫자 분배


11

이 과제에서는 여기에 설명 된대로 합계와 숫자의 차이에 대해 제품을 배포 하는 데 사용합니다 .

여기에 이미지 설명을 입력하십시오

예

  Input      |     Output
-------------|-------------
23(12+42)    | (23*12)+(23*42)
9(62-5)      | (9*62)-(9*5)
4(17+8-14)   | (4*17)+(4*8)-(4*14)
15(-5)       | -(15*5)
2(3)         | (2*3)
8(+18)       | +(8*18)
8(-40+18)    | -(8*40)+(8*18)

사양

입력은 n(_)단일 양의 부호없는 정수 n와 괄호로 묶은 표현식 이있는 형식의 문자열입니다 _. 이 표현식 _에 의해 분리 합보다 포지티브 정수 조건 중 하나의 차이가 구성된다 +및 -징후. 첫 번째 용어 앞에 +부호, -부호 또는 부호 없음이 있을 수 있습니다 .

결과에서 초기 값 n은 각 항에 곱하기 위해 분포되어야합니다. 각 항 에는 괄호 로 묶은 표현을 생성하기 위해 a곱한 값을 곱해야하며 ,이 새로운 항은 원래 항과 정확히 같은 방식으로 결합 하고 부호를 붙여야합니다.n(n*a)+-

유효하지 않은 입력

이들은 처리 할 필요가없는 입력의 예입니다.

3(5 plus 3)
6(5 13)
(5+8)(6+6)
(5+3)8

승리

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.


정규식 이이 문제에 정말 적합하다는 것이 나에게 발생합니다. reg-ex 솔루션이 마음에 들지 않으면 사람들이 이미 작업하고 있지만 금지 할 수 있습니다.
— xnor

도서관이 허용됩니까?
— orlp

@orlp 메타 에 대해 어느 정도 논의했습니다 .
— Downgoat

흥미로운 사례 :8(-40+18)
— BrainSteel

답변:


2

핍, 28 바이트

DQaUnxWa^'(xR`\d+`'(.n.`*&)`

설명:

                              a is first cmdline arg (implicit)
DQa                           Remove (DeQueue) the closing paren from a
   UnxWa^'(                   Unify n and x with a split on open paren--Python equivalent
                                n,x=a.split("(")
                              n is thus the number to be distributed, and x is the
                                addition/subtraction expression
           xR                 In x, replace...
             `\d+`            ... regex matching numbers...
                  '(.n.`*&)`  ... with the replacement pattern (n*&), where n is the
                                appropriate number and & substitutes the complete match
                              Print result (implicit)

Pip의 Pattern 객체는 대부분 Python 정규식 구문을 따르지만 &대체 패턴은 sed에서 빌려옵니다.

Github 리포지토리 에서 Pip에 대해 자세히 알아보십시오


9

자바 스크립트 65 바이트

s=>(q=s.split(/[()]/))[1].replace(/(\D?)(\d+)/g,`$1(${q[0]}*$2)`)

입력이 필요합니다. + 또는-를 찾은 다음 숫자를 올바른 순서로 바꾸십시오.

설명

s=>   // Function with argument "s"
  (q= // Set q to...
    s.split(/[()]/) // Splits on parenthesis, returns array
  )
  [1] // Gets second match or text inside brackets
  .replace(/ // Replaces string 
     (\D?)  // Try to match a non-digit, the +-/* (group 1)
     (\d+)  // Then match one or more digits (group 2)
  /,
      // $1 is group 1 and $2 is group 2 q[0] is the text before the parenthesis 
  `$1(${q[0]}*$2)`
  ) 

용법

이것은 Firefox 및 Safari Nightly maybe Edge 에서만 작동 합니까? ES6 기능을 사용하기 때문입니다. 다음을 통해 실행할 수 있습니다.

var t = s => (q = s.split (/ [()] /)) [1] .replace (/ (\ D?) (\ d +) / g,`$ 1 ($ {q [0]} * $ 2)`)

t ( "5 (-6 + 7 + 3-8 + 9)" ); //-(5 * 6) + (5 * 7) + (5 * 3)-(5 * 8) + (5 * 9)

(.?)(\d+)고장났다. 이것은 실패하고 23(12+42)생산을 1(23*2)+(23*42)합니다.
— orlp

@orlp 내가 고쳤습니다

이 코드는 화살표 기능의 Firefox b / c에서만 작동하지만 괜찮습니다
— MayorMonty

@SpeedyNinja Edge에서도 작동합니다. Chrome / Opera의 경우 "실험용 JavaScript 기능"을 활성화해야합니다.
— rink.attendant.6

\D?대신 사용 가능[+-]?
— edc65

6

파이썬 2.7, 110 108 바이트

import re
p=re.findall('([+-]?)(\d+)',raw_input())
print"".join("%s(%s*%s)"%(e[0],p[0][1],e[1])for e in p[1:])

이 프로그램은 stdin에서 입력을 받아 -regex와 일치하는 항목을 검색 ([+-]?)(\d+)하고 출력 문자열을 만듭니다.
그것을 테스트-

<< 23(12+42)
>> (23*12)+(23*42)

<< 9(62-5)
>> (9*62)-(9*5)

<< 4(17+8-14)
>> (4*17)+(4*8)-(4*14)

<< 15(-5)
>> -(15*5)

<< 2(3)
>> (2*3)

<< 8(+18)
>> +(8*18)

<< 8(-40+18)
>> -(8*40)+(8*18)

4

망막 , 40 바이트

+`(\d+)\((\D)?(\d+)
$2($1*$3)$1(
\d+..$
<empty line>

각 줄은 자체 파일로 이동해야하지만 -s플래그를 사용하여 코드를 하나의 파일로 실행할 수 있습니다 . 예 :

>echo -n "8(-40+18)"|retina -s distributing_numbers
-(8*40)+(8*18)

처음 두 줄은 예상 형식으로 모든 숫자 옆에 승수를 밀어 넣습니다.

8(-40+18)
-(8*40)8(+18)
-(8*40)+(8*18)8()

마지막 두 줄은 불필요한 후행 부분을 제거합니다.

-(8*40)+(8*18)8()
-(8*40)+(8*18)

3

sed, 105 바이트

이것이 sed로 수행 할 수 있는지 확인하고 싶었습니다.
조금 오래된 학교 일지 모르지만 작동합니다.

$ cat distnum.sed
s@\([0-9]*\)(\([0-9]*\)\([+-]*\)\([0-9]*\)\([+-]*\)\([0-9]*\))@(\1*\2)\3(\1*\4)\5(\1*\6)@
s@([0-9]*\*)@@g

$ cat distnum.txt
23(12+42)
9(62-5)
4(17+8-14)
15(-5)
2(3)
8(+18)
8(-40+18)

$ sed -f distnum.sed distnum.txt
(23*12)+(23*42)
(9*62)-(9*5)
(4*17)+(4*8)-(4*14)
-(15*5)
(2*3)
+(8*18)
-(8*40)+(8*18)


2

REGXY , 45 바이트

정규식 대체 기반 언어 인 REGXY를 사용합니다.

/(\d+)\((\D)?(\d+)/\2(\1*\3)\1(/
//
/\d+\(.//

어떻게 //작동합니까? 문자열이 변경 될 때까지 맨 위로 반복된다고 가정하지만 esolang 페이지에서 이유를 찾을 수 없습니다.
— randomra

언어 사양에서 모호한 부분에 대한 건방진 악용이지만, 여기에 설명했습니다 : codegolf.stackexchange.com/questions/52946/…
— Jarmex

1
나는 항상 일치 //하는 무한 루프를 만들지 않는 이유를 알지 못 nothing하므로 항상 첫 번째 줄로 돌아갑니다.
— randomra

그거 알아? 나는 왜 그런지 전혀 모른다. 논리적 인 의미는 없지만 제공된 인터프리터에서 확실히 컴파일되고 실행됩니다. 컴파일 된 Perl을 보더라도 혼란스러워합니다. 무한 루프 여야한다는 것이 더 명확
— 해지기 때문입니다

2

펄, 36 바이트

35 바이트 코드 + 1 바이트 명령 행

($a,$_)=split/[()]/;s/\d+/($a*$&)/g

용법:

echo "4(17+8-14)" | perl -p entry.pl

1

Pyth, 39 38 바이트

끔찍한 정규식 솔루션 :

P:eJcz\("([+-]?)(\d+)"X"\\1(_*\\2)"3hJ

온라인 통역사 에서 이것을 실행할 수없는 것 같습니다 .
— BrainSteel

@BrainSteel 오프라인 통역사에서 작동하는데, heroku에 문제가있는 것 같습니다.
— orlp

@orlp heroku에는 문제가 없습니다. 해킹 가능성을 줄이기 위해 동적 가져 오기는 안전 모드에서 비활성화되며 re 모듈은 동적 가져 오기를 수행합니다. 온라인을 포함하여 안전 모드에서는 re를 사용할 수 없습니다.
— isaacg

1

루비, 94 바이트

gets.scan(/(\d+)\(([[-+]?\d+]+)/){|a,b|b.scan(/([-+]?)(\d+)/).map{|c,d|$><<"#{c}(#{a}*#{d})"}}

1

CJam, 50 바이트

l__'(#_@<'*+@@)>);'+/'-f/\ff{1$'(@@++')+L?}'-f*'+*

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

CJam은 정규 표현식을 지원하지 않거나 표현식을 구문 분석하는 데 매우 편리한 문자열 검색 및 분할 이외의 것은 없습니다. 여기에는 약간의 노력이 필요합니다.

설명:

l__   Get input and push 2 copies for splitting.
'(#   Find index of '(.
_     Copy index, will be used twice.
@<    Get one copy of input to top, and slice to get first multiplier.
'*+   Append '* to first multiplier.
@@    Get another copy of input and '( index to top.
)>    Increment and slice to get everything after '(.
);    Remove trailing ').
'+/   Split at '+.
'-f/  Split each part at '-.
\     Swap first multiplier to top.
ff{   Apply block to nested list of second multipliers.
  1$    Copy term. Will use this copy as condition to skip empty second multipliers
        that result from unary + or -.
  '(    Opening parentheses.
  @@    Get first and second multiplier to top.
  ++    Concatenate it all.
  ')+   Concatenate closing parentheses.
  L     Push empty string for case where term is skipped.
  ?     Ternary if to pick term or empty string.
}     End of loop over list of second multipliers.
'-f*  Join sub-lists with '-.
'+*   Join list with '+.

1

개크 -60 58

$0=gensub(/(.*\()?(+|-)?([0-9]+))?/,"\\2("$0+0"*\\3)","G")

휴 ... 정말로 정규 표현식으로 작업하지 않았습니다.


1

펄 5, 70 60 55 44 바이트 + 1 페널티

split 및 1 정규식 만 사용하는 펄 솔루션입니다.
또한 더 긴 입력을 계산합니다.

($a,$_)=split/[()]/;s/(\D?)(\d+)/$1($a*$2)/g

테스트

$ echo "8(9-10+11-12+13-14)"|perl -p distnums.pl   
(8*9)-(8*10)+(8*11)-(8*12)+(8*13)-(8*14)

매개 변수를 취하는 버전

($a,$_)=split/[()]/,pop;s/(\D?)(\d+)/$1($a*$2)/g;print

정규식 만 사용하는 버전입니다.

s/(\d+)\((.*)\)/$2:$1/;s/(\D?)(\d+)(?=.*:(\d+)).*?/$1($3*$2)/g;s/:.*//

이것은 긍정적 인 예측과 게으른 일치 내의 캡처 그룹을 통해 작동합니다. 아마도 Perl 5가 지원한다면 긍정적 인 전망을 사용했을 것입니다. 이 종류의 일이 정규식으로 가능하다는 것을 알아 내기 위해 잠시 시간을 보냈습니다.


1
눅 이봐, 당신은 사용하여 일부 문자를 저장할 수 있습니다 -p(나는이 9 대 1 문자 생각 명령 줄 옵션을 ,<>과 ;print같은) split에 의지 작업 $_(에 무엇이든 될 것이다 기본적으로 <>인쇄가 너무 루프에 포함되어 있습니다) ! 희망이 도움이됩니다!
— Dom Hastings

1
감사! 도움이되었습니다. -p 옵션은 단순히 내 마음을 넘어 가지 않았습니다. 아마도 골프 컨텍스트 밖에서는 거의 사용되지 않기 때문일 것입니다. 왜 +1 문자라고 생각합니까? 이 과제는 스위치 사용에 대한 처벌에 대해서는 언급하지 않습니다.
— LukStorms 19

나는 지금 게시물을 찾을 수 없지만 이 메타 게시물 은 Perl의 깃발에 대한 점수를 언급합니다.
— Dom Hastings

1
내 나쁜, 내가 와서 당신에게 매우 비슷한 솔루션을 게시 한 것처럼 보입니다. 기본적으로 당신도 캡처 할 필요가 없습니다 [+ -] 어쨌든 대체에 손상을두고 있기 때문에 : codegolf.stackexchange.com/a/57117/26977
— Jarmex

멋지다. 당신 때문에, Perl은이 도전에서 Pyth / Cjam 솔루션을 능가합니다. 분할이 브래킷을 제거한 후 어쨌든 유효하지 않은 입력에 신경 쓰지 않아야합니다.
— LukStorms

1

망막 , 50 51 43 바이트

나는 이것이 나의 첫번째 Retina 프로그램 일지도 모른다고 생각한다 . 그렇지 않다면,이 복잡한 (실제로 복잡한 것은 아닙니다) 첫 번째 Retina 프로그램입니다. 각 줄은 자체 파일에 들어갑니다.

+`(\d+)\((\D?)(\d+)
$1($'$2($1*$3)
.+?\)
$'

나는 실제로 이것을 Retina로 테스트하지 않았으며 정규식 대체 테스터를 여러 번 사용하여 테스트했지만 작동해야합니다.

첫 번째 예에 대한 설명 :

짝수 개의 파일이 있으므로 Retina는 바꾸기 모드를 사용합니다. 첫 번째 바꾸기 (처음 두 파일)는 배포 할 숫자를 제거하고 해당 배포 쌍 (23*12)을 끝에 추가하여을 제공 23(+42)(23*12)합니다. +`처음에는 패턴이 일치하지 않을 때까지 Retina에 반복적으로 교체하도록 지시하며, 다시 일치하므로 패턴이이를로 바꿉니다 23()(23*12)+(23*42). 더 이상 일치하지 않으므로 다음 두 파일이 다음 교체에 사용됩니다. 이번에는 단지를 제거합니다 23(). 이것은 잘 작동합니다 : 제품이 끝에 추가되기 때문에 숫자가 부호가없는 경우 이상한 일을 할 필요가 없습니다. 부호가없는 유일한 것은 첫 번째 숫자이기 때문입니다.

편집 : $'대체는 일치 후 문자열의 나머지 부분을 나타내므로 후행 (.*)s를 제거 할 수 있습니다 .


0

k, 98 바이트

골프는 아니었다.

{,/(*x){(s#y),("*"/:(x;(s:(*y)in"+-")_y))/:$"()"}/:1_x@:&~~#:'x:((0,&~x in .Q.n)_x){x_'x?'y}/"()"}

숫자가 아닌 숫자로 나누고, 괄호를 제거하고, 빈 문자열을 제거한 다음 x, 첫 번째 문자열로 상수 를 유지 하고, *나머지 각 문자열과 결합하고 y괄호로 묶고 존재하는 경우 기호를 처음으로 이동하십시오. 출력을 단일 문자열로 병합합니다.

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