결과를 얻는 데 필요한 작업 찾기


10

따라서 숫자와 결과 배열이 주어지면 작업이 간단합니다. 요청 된 결과를 얻으려면 array의 숫자에 사용해야 할 작업을 찾아야합니다.

시작을 간단하게 만들고 더하기, 빼기, 곱하기 및 나누기와 같은 기본 연산 만 허용합시다.

예:

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

Java와 같은 언어에 이점을 제공하려면 전체 프로그램이 아닌 기능을 구현해야하며 매개 변수를 통해 결과를 반환하거나 콘솔로 인쇄 할 수 있습니다.

코드는 양 바이트를 기준으로 점수가 매겨지며 골프 코드 챌린지로 최저 점수가 이깁니다.

또 다른 요구 사항은 배열에 digid 만 포함하면 추가 -10 점을 얻을 수 있으며 다음 자릿수에서 숫자를 구성 할 수있는 솔루션을 지원한다는 것입니다. 즉

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

제공된 출력이 제안 된 출력 인 경우 일부 솔루션이 둘 이상있을 수 있습니다. 주어진 작업에 대해 하나 이상의 솔루션을 제공하는 것은 귀하의 몫입니다.

편집 : 결과는 수학적 관점에서 유효해야하므로 나눗셈은 정수가 아닌 합리적인 나눗셈이며 연산 우선 순위는 고전 수학에서와 같습니다 (첫 번째 곱셈과 나눗셈, 덧셈과 뺄셈).


4
합니까 */보다 우선이 +-? 두 가지 예가 서로 모순됩니다.
Leaky Nun

1
앞으로 자바와 같은 언어에 대해 백분율 기반 바운티를 만들어야합니다. -10 바이트는 젤리만큼 좋지 않습니다
Bálint


4
숫자를 순서대로 사용해야합니까? 또한 앞으로 의 문제에 대해서는 Main에 게시하기 전에 이러한 종류의 문제를 해결할 수있는 Sandbox를 사용하는 것이 좋습니다 .
AdmBorkBork

2
@ mbomb007 둘 중 하나의 사본이 아닙니다. 이들은 임의의 숫자 입력이며 기본 수학 연산 만 허용되며 실제 프로그램을 출력하지는 않습니다.
Patrick Roberts

답변:



4

오라클 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 294280 바이트

못생긴 코드를 작성하는 훌륭한 기회 :

골프 :

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

자바 스크립트 (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

파이썬 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의이 반복 가능한, 그것은 단지처럼 취급합니다 array각 요소의 각 문자 인에 string당신이 현재 가지고있는 배열을 제공하는 것처럼 역할을 할 수 있도록 -.
nasonfish

2

파이썬, 195186 바이트

여기에 끔찍한 방법이 있습니다.

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(A)의 인수 수용 list과를 result- x([1,2,3,4,5], 15)예를 들면.

프로그램은 루프를 시작하여 "+", "-", "*", or "/"각 숫자 사이에 추가 하거나 함께 연결 해야하는지 무작위로 선택하기 시작 합니다. 실제로 순열을 수행하고 모든 조합을 시도하여 모든 결과를 찾는 것보다 더 간결한 옵션처럼 보였지만 실행하는 데 시간이 오래 걸리고 효율성 이 훨씬 떨어졌습니다. (다행히도이 상황에서는 문제가되지 않습니다!)

또한 "."를 추가합니다. 와 같은 정수 반올림 연산을 피하기 위해 각 숫자에 6/4 = 1. 그런 다음 eval표현식을 통해 결과가 예상 한 것과 같은지 여부를 판별하고 해당되는 경우 표현식을 출력합니다.

이 프로그램은 종료되지 않습니다. 종료 될 때까지 계속 결과를 출력합니다.

편집 1 : 한 줄 if문장을 사용할 수있는 불필요한 줄 바꿈을 제거하십시오 .


정말 재미있는 구현입니다. 더 많은 바이트를 쉽게 저장할 수 있습니다. 온라인으로 사용해보십시오! (176 바이트)
bobrobbob

2

마트 랩, 234 238 258 바이트

다른 답변의 한계에 따라 입력 배열의 번호 순서가 피아트로 유지된다고 가정합니다.

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, say x = '12345'및 결과 r, say 를 사용하여 네 개의 연산자 를 사용하여 r = 15평가할 수있는 모든 표현식 문자열을 반환합니다 .rx

ones(length())-type 또는 repmat(length())-type 표현식을 사용 ~~p(1,:)하지 않는 두 가지 길이의 동등한 방법을 사용했습니다 . 이는 not not not values p(즉, 1첫 번째 차원과 길이가 같은 목록 p) 0|p(:,1)를 반환하고 0을 반환하거나 -a-value-in- p(즉, 1의 두 번째 차원과 길이가 같은 목록 p).

Matlab에는 nchoosek 대체 방법이 없으므로 연산자를 올바른 횟수만큼 복제하고 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없이 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

자바 스크립트 (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.