結果を得るために必要な操作を見つける


10

したがって、タスクは単純で、数値の配列と結果が与えられた場合、要求された結果を取得するには、arrayから数値に使用する必要がある操作を見つける必要があります。

簡単に始めましょう。加算、減算、乗算、除算などの基本的な演算のみを許可します。

例:

Input  : [5,5,5,5,5] 100
Output : 5*5*5-5*5

Javaのような言語にいくつかの利点を与えるために、要求はプログラム全体ではなく関数を実装することであり、結果はパラメーター経由で返すか、コンソールに出力できます。

コードはバイト数に基づいてスコアリングされ、ゴルフコードチャレンジなので、最低のスコアが勝ちます。

別の要件は、配列にdigidsのみが含まれている場合、追加の-10ポイントを取得できることです。次の数字から数値を構成できるソリューションをサポートします。すなわち

Input  : [1,2,3,4,5] 0
Output : 12-3-4-5

出力が提案された出力である場合、いくつかのケースでは複数のソリューションがあることに注意してください。特定のタスクに対して1つ以上のソリューションを提供するかどうかは、あなた次第です。

編集: 結果は数学的な観点から有効である必要があります。したがって、除算は整数ではなく有理除算であり、演算の優先順位は従来の数学と同じです(最初の乗算と除算、次に加算と減算)。


4
DOES *とは/よりも優先を持っている+-?あなたの二つの例は互いに矛盾しています。
Leaky Nun

1
、将来的には、ゼリーの中でも良いととしてではありませんあなたは、Javaのような、-10バイト言語のために、パーセントベースの報奨金を作成することを確認してください
バリント


4
番号は順番に使用する必要がありますか?また、今後の課題については、メインに投稿する前にこのような問題を解決できるサンドボックスを使用することを強くお勧めします。
AdmBorkBork 2016年

2
@ mbomb007それはそれらのどちらの複製でもありません。これらは任意の数値入力であり、基本的な数学演算のみが許可され、実際のプログラムを出力することは想定されていません。
Patrick Roberts

回答:



4

OracleのSQL 11.2、322の 304 270バイト

SELECT o FROM(SELECT REPLACE(SUBSTR(:1,1,1)||REPLACE(SYS_CONNECT_BY_PATH(a||SUBSTR(:1,LEVEL*2+1,1),','),','),'_')o,LEVEL l FROM(SELECT SUBSTR('+-*/_',LEVEL,1)a FROM DUAL CONNECT BY LEVEL<6)CONNECT BY LEVEL<LENGTH(:1)/2)WHERE:2=dbms_aw.eval_number(o)AND l>LENGTH(:1)/2-1;

:1は数字のリストです
:2は検索結果です

ゴルフなし:

SELECT o
FROM   (
         SELECT REPLACE(SUBSTR(:1,1,1)||REPLACE(SYS_CONNECT_BY_PATH(a||SUBSTR(:1,LEVEL*2+1,1),','),','),'_')o,LEVEL l 
         FROM ( -- Create one row per operator 
                SELECT SUBSTR('+-*/_',LEVEL,1)a FROM DUAL CONNECT BY LEVEL<6
              ) CONNECT BY LEVEL<LENGTH(:1)/2  -- Create every combination of operators, one per ','
)
WHERE :2=dbms_aw.eval_number(o)  -- filter on result = evaluation
  AND l>LENGTH(:1)/2-1           -- keep only expressions using every digits

4

TSQL(sqlserver 2016)310 294 280バイト

醜いコードを書く素晴らしい機会です:

ゴルフ:

DECLARE @ varchar(max)= '5,5,5'
DECLARE @a varchar(20) = '125'

,@ varchar(max)='';WITH D as(SELECT @a a UNION ALL SELECT STUFF(a,charindex(',',a),1,value)FROM STRING_SPLIT('*,+,./,-,',',')x,d WHERE a like'%,%')SELECT @+=a+','''+REPLACE(a,'.','')+'''),('FROM D WHERE a not like'%,%'EXEC('SELECT y FROM(values('+@+'null,null))g(x,y)WHERE x='+@b)

オンラインでお試しください

読み取り可能:(SQLが4/5が0ではないことを受け入れるためには、小数点(。)の挿入とその削除が必要です-削除は、テストする人のためのものです)

DECLARE @a varchar(max)= '5,5,5'
DECLARE @b varchar(20) = '5'

,@ varchar(max)=''
;WITH D as
(
  SELECT @a a
  UNION ALL
  SELECT STUFF(a,charindex(',',a),1,value)
  FROM STRING_SPLIT('*,+,./,-,',',')x,d
  WHERE a like'%,%'
)
SELECT @+=a+','''+REPLACE(a,',','')+'''),('
FROM D
WHERE a not like'%,%'

EXEC('SELECT y FROM(values('+@+'null,null))g(x,y)WHERE x='+@b)

このソリューションは、次のタイプの入力も処理できます。

入力:[1,2,3,4,5] 0出力:12-3-4-5


3

JavaScript(ES6)、165 147バイト

a=>o=>(c=[],i=c=>{for(j=0;!((c[j]?++c[j]:c[j]=1)%5);)c[j++]=0},eval(`while(eval(e=(a+'').replace(/,/g,(_,j)=>'+-*/'.charAt(c[~-j/2])))!=o)i(c);e`))

入れ子eval...素敵。

f=a=>o=>(c=[],i=c=>{for(j=0;!((c[j]?++c[j]:c[j]=1)%5);)c[j++]=0},eval(`while(eval(e=(a+'').replace(/,/g,(_,j)=>'+-*/'.charAt(c[~-j/2])))!=o)i(c);e`))
console.log(f([5,5,5,5,5])(100))
console.log(f([1,2,3,4,5])(0))
console.log(f([3,4])(0.75))
console.log(f([3,4,5,6])(339))


3

Python 3、170 155バイト

from itertools import*
def f(n,o):print({k for k in[''.join(map(str,sum(j,())))[1:]for j in[zip(x,n)for x in product('+-*/',repeat=len(n))]]if eval(k)==o})

演算子の可能なすべての順序でジェネレータを作成し、それを数値と組み合わせて、答えが得られるまで評価します。

https://repl.it/C2F5


2
あなたは置き換えることによって、いくつかの文字を救うことができる['+','-','*','/']'+-*/'。以来string、sは反復可能です、それは同じようにそれを扱いますarray各要素は、各文字のことでstring、それはあなたが現在持っている配列とそれを提供するだけのように動作しますので- 。
nasonfish 2016年

2

Python、195 186バイト

これを行うのはひどい方法です。

def x(i,r):
 t=""
 from random import choice as c
 while True:
  for j in i:
   t+=str(j)
   if c([0,1]):t+="."+c("+-/*")
  t=t.strip("+-*/.")+"."
  v=eval(t)
  if v == r:print t
  t=""

関数は、x引数受け入れlistresult- x([1,2,3,4,5], 15)例えば。

プログラムはループを開始し"+", "-", "*", or "/"、各数値の間に追加するか、それらを連結するかをランダムに選択し始めます。これは実際の順列を通過すると、すべての結果を見つけるために、すべての組み合わせを試すよりも簡潔なオプションのように思えたし、それが実行に時間がかかり、ですがずっと効率が低いです。(幸い、これはこのコンテキストでは問題になりません!)

「。」も付加されます。以下のような整数丸い操作を行うことを避けるために、各番号に6/4 = 1。次にeval、式を使用して、結果が期待したものと等しいかどうかを判断し、等しい場合は式を出力します。

このプログラムは終了しません-強制終了されるまで結果を出力し続けます。

編集1:1行のifステートメントを使用できる不要な改行を削除します。


本当に面白い実装。しかし、さらに多くのバイトを保存するのは簡単ですオンラインで試してください!(176バイト)
bobrobbob

2

Matlab、234 238 258 バイト

他の回答の制限に基づいて、入力配列の番号順はfiatによって維持されると想定しています。

n=length(x)-1
k=n*2+2
p=unique(nchoosek(repmat('*-+/',1,n),n),'rows')
p=[p char(' '*~~p(:,1))]'
c=char(x'*~~p(1,:))
o=p(:,r==cellfun(@eval,mat2cell(reshape([c(:) p(:)]',k,[]),k,0|p(1,:))))
reshape([repmat(x',size(o,2),1) o(:)]',k,[])'

このコードは、数字の文字列を受け取りx言って、x = '12345'その結果r、たとえばr = 15、すべてのあなたが得るために評価できる表現の文字列の戻りrからx4つの演算子を使用して。

ones(length())-typeまたはrepmat(length())-type式の使用を回避する2つの異なる長さの同等の方法を使用しました:~~p(1,:)でnot-not値p(つまり、1の最初の次元と同じ長さのリストp0|p(:,1)を返し、0またはis-thereを返します-a-value-in- p(つまり、1の2番目の次元と同じ長さのsのリストp)。

Matlabにはnchoosek with置換メソッドがないため、演算子を正しい回数複製し、nchoosekそのより大きな演算子の選択に対しての全体の空間を計算し、unique呼び出しを使用して結果を必要なものにまで絞り込みました( '*** +'や '*** +'のような同等の組み合わせを削除します)。連結の目的で入力ベクトルの長さに一致するように末尾のスペースを追加し、入力文字列を含む演算子文字列を行列の列に構成します。次に、式を列ごとに評価して結果を取得し、入力に一致する結果を持つ列に対応する演算子の順序を見つけますr

テスト:x = '12345'r = 15

1*2*3+4+5 
1+2+3+4+5 
1-2*3+4*5 

倍精度値の配列を取得する必要がある場合x = num2str(x,'%d');は、数字を文字列に変換;し、スコアに21(なしの20 )を追加する必要があります。*余分なバイトは、このコードを実行している誰もが長い配列でコマンドプロンプトが爆発するのを見ることがないように、私が純粋に残したセミコロンでした。私の編集により、論理とコロンオペランドに関する大量の警告が発生するため、新しいバージョンではセミコロンを削除しました。

編集2:をに置き換えるの2*n+2を忘れましたk

古い答え:

n=length(x)-1;
p=unique(nchoosek(repmat(['*','-','+','/'],1,n),n),'rows');
l=length(p);
p=[p repmat(' ',l,1)]';
c=reshape([repmat(x',l,1) p(:)]',n*2+2,[]);
o = p(:,r == cellfun(@eval, mat2cell(c,n*2+2,ones(l,1))));
reshape([repmat(x',size(o,2),1) o(:)]',n*2+2,[])'

2

JavaScript(ES6)、88バイト

a=>o=>eval(`while(eval(e=(a+'').replace(/,/g,_=>'+-*/'.charAt(Math.random()*5)))!=o);e`)

少しランダムにミックスに投入しました。組み合わせを体系的に繰り返すよりもはるかに簡単です。

テストスイート

f=a=>o=>eval(`while(eval(e=(a+'').replace(/,/g,_=>'+-*/'.charAt(Math.random()*5)))!=o);e`)
console.log(f([5,5,5,5,5])(100))
console.log(f([1,2,3,4,5])(0))
console.log(f([3,4])(0.75))
console.log(f([3,4,5,6])(339))


1

PHP、108バイト

for(;$i=$argc;eval("$s-$argv[1]?:die(\$s);"))for($s="",$x=$p++;--$i>1;$x/=4)$s.="+-*/"[$s?$x&3:4].$argv[$i];

コマンドライン引数から逆の順序で入力を受け取ります。で実行し-rます。

壊す

for(;                   # infinite loop:
    $i=$argc;               # 1. init $i to argument count
    eval("$s-$argv[1]?:"    # 3. if first argument equals expression value,
        ."die(\$s);")       #    print expression and exit
    )
    for($s="",              # 2. create expression:
        $x=$p++;            #    init map
        --$i>1;                 # loop from last to second argument
        $x/=4)                  # C: shift map by two bits
        $s.="+-*/"[$s?$x&3:4]   # A: append operator (none for first operand)
            .$argv[$i];         # B: append operand

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.