Phân phối số


11

Trong thử thách này, bạn sẽ sử dụng để phân phối một sản phẩm qua các khoản tiền và sự khác biệt về số lượng, như được giải thích ở đây .

nhập mô tả hình ảnh ở đây

Ví dụ

  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)

Sự chỉ rõ

Đầu vào sẽ là một chuỗi có dạng n(_), với một số nguyên không dấu dương duy nhất ntheo sau là một biểu thức được ngoặc đơn _. Biểu thức _này sẽ bao gồm các khoản tiền và sự khác biệt của một trong các thuật ngữ số nguyên dương hơn được phân tách bằng +-dấu hiệu. Thuật ngữ đầu tiên có thể được đi trước bởi một +dấu hiệu, một -dấu hiệu hoặc không có dấu hiệu.

Trong đầu ra, số lượng ban đầu nnên được phân phối để nhân từng điều khoản. Mỗi thuật ngữ anên được nhân trái - để nhân nbiểu thức được ngoặc đơn (n*a)và các thuật ngữ mới này phải được kết hợp với +-ký hiệu theo cách chính xác giống như các thuật ngữ ban đầu.

Đầu vào không hợp lệ

Đây là những ví dụ về đầu vào mà bạn không phải xử lý.

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

Chiến thắng

Đây là , vì vậy mã ngắn nhất tính bằng byte thắng.


Nó xảy ra với tôi rằng regex thực sự phù hợp cho vấn đề này. Nếu bạn không ổn với các giải pháp reg-ex, bạn có thể cấm nó, mặc dù mọi người có thể đang làm việc với nó.
xnor

Thư viện có được phép không?
orlp

@orlp Đến một mức độ nhất định đã được thảo luận về meta .
Hạ cấp

Trường hợp thú vị:8(-40+18)
BrainSteel

Câu trả lời:


2

Pip, 28 byte

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

Giải trình:

                              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)

Các đối tượng Mẫu của Pip hầu hết tuân theo cú pháp regex của Python, nhưng &mẫu thay thế được mượn từ sed.

Tìm hiểu thêm về Pip tại kho Github


9

JavaScript 65 byte

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

Điều này sẽ mất đầu vào. Lấy dấu + hoặc -, sau đó là các chữ số, sau đó thay thế nó theo đúng thứ tự.

Giải trình

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)`
  ) 

Sử dụng

Điều này chỉ hoạt động trong Firefox và Safari Nightly có thể Edge? bởi vì nó sử dụng các tính năng ES6. Bạn có thể chạy nó bằng cách:

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+)bị phá vỡ. Điều này thất bại trên 23(12+42), sản xuất 1(23*2)+(23*42).
orlp

@orlp Tôi đã sửa nó

Mã này sẽ chỉ hoạt động trong Firefox b / c của chức năng mũi tên, nhưng không sao
MayorMonty

@SpeedyNinja Nó cũng hoạt động trong Edge. Đối với Chrome / Opera, bạn cần bật "tính năng JavaScript thử nghiệm".
rink.attguard.6

\D?có thể được sử dụng thay vì[+-]?
edc65

6

Python 2.7, 110 108 byte

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:])

Chương trình lấy đầu vào từ stdin, tìm kiếm các kết quả khớp với - ([+-]?)(\d+)regex và tạo chuỗi đầu ra.
Kiểm tra nó -

<< 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

Võng mạc , 40 byte

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

Mỗi dòng nên đi đến tệp riêng của nó nhưng bạn có thể chạy mã dưới dạng một tệp có -scờ. Ví dụ:

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

Hai dòng đầu tiên đẩy số nhân bên cạnh mỗi số ở dạng dự kiến:

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

Hai dòng cuối cùng loại bỏ phần đuôi không cần thiết:

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

3

sed, 105 byte

Chỉ muốn xem nếu điều này có thể được thực hiện với sed.
Có thể một chút trường học cũ, nhưng nó hoạt động.

$ 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

ĐĂNG KÝ , 45 byte

Sử dụng REGXY, một ngôn ngữ dựa trên thay thế regex.

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

Làm thế nào để //làm việc? Tôi cho rằng nó lặp ở đầu cho đến khi chuỗi thay đổi nhưng tôi không thể tìm thấy trong trang esolang tại sao.
Randomra

Đó là một chút lạm dụng táo bạo của sự mơ hồ trong thông số ngôn ngữ, nhưng tôi đã giải thích nó ở đây: codegolf.stackexchange.com/questions/52946/ Lỗi
Jarmex

1
Tôi vẫn không hiểu tại sao không //tạo ra một vòng lặp vô hạn vì nothingsẽ luôn khớp với nhau để chúng tôi luôn quay trở lại dòng đầu tiên.
Randomra

Bạn biết gì? Tôi thực sự không biết tại sao. Bạn hoàn toàn đúng, nghĩ về nó bây giờ nó không có ý nghĩa logic, nhưng nó chắc chắn biên dịch và chạy trong trình thông dịch được cung cấp. Ngay cả khi nhìn vào Perl đã biên dịch, nó vẫn tạo ra sự nhầm lẫn cho tôi, bởi vì nó thậm chí còn rõ ràng hơn rằng nó phải là một vòng lặp vô hạn: pastebin.com/9q7M0tpZ
Jarmex

2

Perl, 36 byte

Mã 35 byte + dòng lệnh 1 byte

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

Sử dụng:

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

1

Bình thường, 39 38 byte

Một giải pháp regex khủng khiếp:

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

Tôi dường như không thể có được điều này để chạy trong trình thông dịch trực tuyến .
BrainSteel

@BrainSteel Nó hoạt động trong trình thông dịch ngoại tuyến, có vẻ như đó là một vấn đề với heroku.
orlp

@orlp Đó không phải là vấn đề với heroku. Nhập động được tắt trong chế độ an toàn, để giảm khả năng bị hack và mô-đun re thực hiện nhập động. Vì vậy, không thể được sử dụng trong chế độ an toàn, bao gồm cả trực tuyến.
isaacg

1

Ruby, 94 byte

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

1

CJam, 50 byte

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

Dùng thử trực tuyến

CJam không có hỗ trợ regex, hoặc bất cứ điều gì ngoài việc tìm kiếm và phân tách chuỗi rất thuận tiện cho việc phân tích cú pháp biểu thức. Vì vậy, có một số lao động liên quan ở đây.

Giải trình:

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

chim ưng - 60 58

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

Phew ... đã không làm việc với regrec trong một thời gian dài.


1

Perl 5, 70 60 55 44 Byte + 1 hình phạt

Một giải pháp perl chỉ sử dụng chia và 1 biểu thức chính quy.
Cũng tính toán các đầu vào dài hơn.

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

Kiểm tra

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

Một phiên bản có tham số

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

Một phiên bản chỉ sử dụng các biểu thức thông thường.

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

Cái này hoạt động thông qua một nhóm chụp trong một cái nhìn tích cực và kết hợp lười biếng. Có lẽ đã sử dụng một cái nhìn tích cực nếu Perl 5 hỗ trợ nó, nhưng than ôi. Mất một lúc tôi mới nhận ra rằng điều này là có thể với regex.


1
Xin chào Luk, Bạn có thể lưu một số ký tự bằng cách sử dụng -ptùy chọn dòng lệnh (Tôi nghĩ rằng đây là +1 char so với 9 cho ,<>;print) như splitsẽ hoạt động $_theo mặc định (sẽ là bất cứ điều gì trong <>) và in cũng được bao gồm trong vòng lặp ! Mong rằng sẽ giúp!
Dom Hastings

1
Cảm ơn! Nó đã giúp đỡ. Tùy chọn -p đơn giản là không vượt qua tâm trí của tôi. Có lẽ vì đó là thứ hiếm khi được sử dụng ngoài bối cảnh chơi gôn. Tại sao bạn nghĩ đó là +1 char? Thách thức này không đề cập bất cứ điều gì về một hình phạt cho việc sử dụng các thiết bị chuyển mạch.
LukStorms

Tôi không thể tìm thấy bài viết bây giờ, nhưng bài đăng meta này đề cập đến việc ghi điểm cho cờ của Perl.
Dom Hastings

1
Thật tệ, có vẻ như tôi đã đến và đăng một giải pháp rất giống với bạn, đó thực sự chỉ là một phiên bản chơi gôn hơn một chút của bạn! Về cơ bản, bạn thậm chí không cần phải chụp [+ -] vì dù sao bạn vẫn giữ nguyên chúng trong phần thay thế: codegolf.stackexchange.com/a/57117/26977
Jarmex

Thật tuyệt. Vì bạn, Perl đánh bại cả giải pháp Pyth / Cjam trong thử thách này. Dù sao thì tôi cũng không nên quan tâm đến những đầu vào không hợp lệ sau khi phân tách đó đã loại bỏ dấu ngoặc.
LukStorms

1

Võng mạc , 50 51 43 byte

Tôi nghĩ rằng đây có thể là chương trình Retina đầu tiên của tôi. Nếu không, đó là chương trình Retina đầu tiên của tôi phức tạp (thực sự không phức tạp.) Mỗi ​​dòng đi trong tệp riêng của nó.

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

Tôi đã không thực sự kiểm tra điều này với Retina, tôi đã thử nghiệm nó bằng cách sử dụng trình kiểm tra thay thế regex nhiều lần, nhưng nó sẽ hoạt động.

Mô tả cho ví dụ đầu tiên:

Vì có số lượng tệp chẵn, Retina sử dụng chế độ thay thế. Thay thế đầu tiên (hai tệp đầu tiên) sẽ xóa một số được phân phối và thêm cặp phân phối đó (23*12)vào cuối, cho 23(+42)(23*12). +`khi bắt đầu yêu cầu Retina liên tục thay thế cho đến khi mẫu không khớp và vì mẫu này được khớp lại, mẫu sẽ thay thế mẫu này bằng 23()(23*12)+(23*42). Điều này không còn phù hợp nữa, vì vậy 2 tệp tiếp theo được sử dụng cho lần thay thế tiếp theo. Lần này, nó chỉ đơn giản là loại bỏ 23(). Điều này hoạt động độc đáo: vì các sản phẩm được gắn vào cuối, tôi không phải làm bất cứ điều gì kỳ lạ nếu một số không có dấu, vì số duy nhất không có dấu là số đầu tiên.

EDIT: $'thay thế đại diện cho phần còn lại của chuỗi sau trận đấu, vì vậy tôi có thể loại bỏ các dấu (.*).


0

k, 98 byte

Không chơi gôn lắm.

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

Tách trên không chữ số, loại bỏ parens, loại bỏ các chuỗi trống, sau đó giữ xhằng số là chuỗi đầu tiên, kết hợp *với từng chuỗi còn lại y, dấu ngoặc đơn và di chuyển dấu hiệu về đầu nếu có; san phẳng đầu ra thành một chuỗi duy nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.