番号の配布


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後に括弧で囲まれた式が続く形式の文字列になります_。この式_は、+and -記号で区切られた1つ以上の正の整数項の合計と差で構成されます。最初の用語の前には、+記号、-記号、または記号なしを付けることができます。

出力では、n各項を乗算するために初期番号を配布する必要があります。の各項は、括弧で囲まれた式を生成するためにa左乗算さnれる(n*a)必要があり、これらの新しい用語は、元の用語とまったく同じ方法で結合され+-符号が必要です。

無効な入力

これらは、処理する必要のない入力の例です。

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

勝ち

これはなので、バイト単位の最短コードが優先されます。


正規表現はこの問題に本当に適していると思います。正規表現ソリューションに問題がなければ、禁止することもできますが、すでに作業をしている可能性があります。
xnor

ライブラリは許可されていますか?
orlp

@orlp metaで説明したある程度まで。
ダウンゴート

興味深いケース: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のパターンオブジェクトは、主にPythonの正規表現構文に従いますが、&置換パターンはsedから借用されています。

Githubリポジトリで Pipの詳細を読む


9

JavaScript 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 多分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

Python 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フラグを使用してコードを1つのファイルとして実行できます。例えば:

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

最初の2行は、予想される形式のすべての数値の横に乗数をプッシュします。

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

最後の2行は、不要な末尾部分を削除します。

-(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+\(.//

どのように動作し//ますか?文字列が変更されるまでトップにループすると思いますが、なぜエソランのページで見つけることができません。
ランダラ

これは、言語仕様で曖昧の生意気な虐待のビットだが、私はここでそれを説明してきました:codegolf.stackexchange.com/questions/52946/...
Jarmex

1
常に一致するので、なぜ//無限ループが作成されないのかはまだnothingわかりませんので、常に最初の行に戻ります。
ランダラ

わかってる?私は実際に理由がわかりません。あなたは絶対に正しいです、今それについて考えることは論理的に意味がありませんが、間違いなく提供されたインタープリターでコンパイルして実行します。:それは無限ループであることをより明確に見えるので、それは、混乱に私を生成してもコンパイルされたPerlを見てpastebin.com/9q7M0tpZ
Jarmex

2

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

gawk- 60 58

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

うーん...かなり前から正規表現を使っていません。


1

Perl 5の、70 60 55 44バイト+ 1つのペナルティ

分割と1つの正規表現のみを使用するperlソリューション。
長い入力も計算します。

($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上の意志の仕事$_(であるものは何でもされるデフォルトでは<>、プリントがあまりにもループに含まれています) !お役に立てば幸いです!
ドムヘイスティングス

1
ありがとう!助けた。-pオプションは単純に私の頭を悩ませませんでした。おそらく、ゴルフの文脈以外ではめったに使用されないものだからです。なぜあなたはそれが+1文字だと思いますか?この課題では、スイッチの使用に対するペナルティについては何も言及していません。
LukStorms

現在、この投稿は見つかりませんが、このメタ投稿ではPerlのフラグのスコアリングについて言及しています。
ドムヘイスティングス

1
私の悪い、私はあなたに非常に似た解決策を思いついたようです。基本的に、[+-]をキャプチャする必要さえありません。とにかく、置換時にそのままにしておくためです。codegolf.stackexchange.com
57117

カッコいい。このため、PerlはPyth / Cjamソリューションよりも優れています。とにかく、その分割がブラケットを削除した後、無効な入力を気にするべきではありませんでした。
LukStorms

1

網膜50 51 43バイト

これ私の最初のRetinaプログラムかもしれません。そうでない場合は、この複雑な(実際にはそれほど複雑ではない)最初のRetinaプログラムです。各行は独自のファイルに入れられます。

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

私は実際にこれをRetinaでテストしませんでした。正規表現置換テスターを使用して複数回テストしましたが、動作するはずです。

最初の例の説明:

ファイルの数が偶数であるため、Retinaは置換モードを使用します。最初の置換(最初の2つのファイル)は、配布する番号を削除し、その配布ペア(23*12)を最後に追加して、を与え23(+42)(23*12)ます。+`開始時に、パターンが一致しなくなるまで繰り返し置換するようRetinaに指示し23()(23*12)+(23*42)ます。これが再び一致するため、パターンはこれをに置き換えます。これはもう一致しないため、次の2つのファイルが次の置換に使用されます。今回は、単にを削除し23()ます。これはうまく機能します。製品は末尾に追加されるため、数字に記号がない場合は、何も変なことをする必要はありません。記号がないのは最初の数字だけだからです。

編集:$'replacementはマッチ後の残りの文字列を表すので、末尾(.*)の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.