Friedman 수 생성


9

프리드만 번호는 모든 그것의 자리 - (/ * + ^) 기본적인 수학 연산을 적용하여 표시 할 수있는 수이다. 각 개별 숫자에 작업을 적용 할 필요는 없지만 모든 숫자를 포함해야합니다. 즉, 121 = 11 ^ 2-> 모든 숫자가 관련되어 있지만 1과 1은 함께 클럽되어 11을 만듭니다.

괄호 사용은 허용되지만 사소한 솔루션 x= (x)은 유효한 솔루션이 아닙니다. 또한 유효하지 않습니다 () x= +x.

  • 25 = 5 ^ 2
  • 121 = 11 ^ 2
  • 343 = (3 + 4) ^ 3
  • 2048 = (8 ^ 4) / 2 + 0

양의 정수를 취하고 해당 범위의 Friedman 수 (포함) 및 후속 행에 표현식이있는 숫자를 인쇄하는 프로그램을 작성하십시오.

입력-

n m    | n, m integers, n>=0, m>n

출력-

count    | number of Friedman numbers in the given range
fn1 exp1 | Friedman number, expression
fn2 exp2
fn3 exp3
.
.
.

7 월 29 일 일요일 00:00까지 게시 된 가장 짧은 코드 GMT가 승자가됩니다.


2
Friedman 수의 예를 추가하고 /작동 방식을 설명 할 수 있습니까 ? 예를 들어 무엇 1/3입니까?
JPvdMerwe

숫자는 모든 숫자에 연산을 적용하여 표현됩니다. 25 = 5 ^ 2, 126 = 6 * 21, 343 = (3 + 4) ^ 3 등
elssar

단항 빼기를 허용합니까? 예를 들어 -5?
JPvdMerwe

@JPvdMerwe는 입력 사양을 확인하므로 그렇게 할 필요는 없지만 원할 경우 스스로 제압하십시오. 단항 더하기는 허용되지 않지만. 즉, +5는 유효한 솔루션이 아닙니다
elssar

1
귀하는 부서에 대한 JPvdMerwe의 질문에 답변하지 않았습니다. 정확해야합니까? 중간 결과가 비 적분 일 수 있습니까?
피터 테일러

답변:


3

루비, 45643840839037037049344334 [고정]

g={}
f=->a,b{a.permutation(b).to_a.uniq.flatten.each_slice b}
F,T=$*
([F.to_i,10].max..T.to_i).map{|c|f[a="#{c}".split(''),v=a.size].map{|m|f[[?+,?-,?*,?/,'','**'],v-1].map{|w|(d=(s=m.zip(w)*'').size)==v&&next
0.upto(d){|y|y.upto(d+1){|u|begin(r=eval t="#{s}".insert(y,?().insert(u,?)))==c&&g[r]=t
rescue Exception
end}}}}}
p g.size,g

산출:

% ruby ./friedman-numbers.rb 1 300
9
{25=>"(5)**2", 121=>"(11)**2", 125=>"5**(2+1)", 126=>"(6)*21", 127=>"(2)**7-1", 128=>"2**(8-1)", 153=>"(3)*51", 216=>"6**(1+2)", 289=>"(9+8)**2"}

또한 숫자가 클수록 비교적 빠르게 작동합니다.

% time ruby friedman-numbers.rb 3863 3864   
1
{3864=>"(6**4-8)*3"}
ruby friedman-numbers.rb 3863 3864  14.05s user 0.17s system 99% cpu 14.224 total

1
입력으로 실행 5 40하고 결과를 얻었습니다 [11, "11**1", 21, "21**1", 31, "31**1", 41, "41**1"]. 의 흔적은 25내가 (예에 적합한 솔루션이 생각에이 21) 없다 2*1,하지21**1
크리스티안 루파 스쿠

@ w0lf 감사합니다! 나는 그것을 고쳤다 고 생각한다.
defhlt

예, 그것은 지금 잘 작동합니다.
Cristian Lupascu

@ w0lf는 필요에 따라 출력을 포맷하기 위해 많은 문자를 추가했습니다
defhlt

다음으로 대체 '+-*/'.chars.to_a+['','**']하면 2 개의 문자를 얻을 수 있습니다["+","-","*","/","","**"]
Cristian Lupascu

4

파이썬 2.7 - 380 378 372 371 367 363 357 354 352 348 336 문자

단순한 무차별 대입 검색.

from itertools import*
s=lambda x:[x]['1'>x>'0':]+['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
def E(e):
 try:return eval(e.replace("^","**"))
 except:0
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
print len(A)
for v in A:print v,A[v]

예제 실행 :

1
300
9
128 (2^(8-1))
289 ((9+8)^2)
216 (6^(1+2))
121 (11^2)
153 (3*51)
25 (5^2)
125 (5^(2+1))
126 (6*21)
127 ((2^7)-1)

설명:

s(x) 일련의 숫자가 포함 된 문자열을 가져 와서 해당 숫자를 사용하는 모든 표현식을 순서대로 반환하는 함수입니다.

[x]['1'>x>'0':] x가 '0'이거나 '0'으로 시작하지 않는 일련의 숫자 인 경우 x를 포함하는 목록으로 평가합니다. 그렇지 않으면 빈 목록으로 평가됩니다. 기본적으로 이것은 모든 숫자를 함께 결합하는 경우를 처리합니다.

['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))] 기본적으로 x를 두 부분으로 나누고 (길이가 0이 아닌) 각 부분에서 s ()를 호출하고 product ()를 사용하여 모든 결과를 그들 사이의 일부 연산자와 결합합니다.

E(e) 기본적으로 안전한 평가입니다. e가 유효하면 e의 값을 리턴하고 그렇지 않으면 None을 리턴합니다.

A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}

기본적 으로이 코드는 범위의 모든 숫자를 시도하고 숫자를 치환하고 x가 '0'으로 시작하지 않으면 첫 번째 표현식을 무시하고 s ()가 해당 순열에 대해 생성하는 각 표현식을 테스트합니다. 0 '이면 첫 번째 표현식은 x입니다.

대체 버전-397 자

분수를 사용해야하는 경우 내 코드는 다음과 같습니다.

from fractions import*
from itertools import*
s=lambda x:["Fraction(%s)"%x]['1'>x>'0':]+['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
def E(e):
 try:return eval(e.replace("^","**"))
 except:0
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
print len(A)
for v in A:print v,A[v].replace("Fraction","")

나는 if len(x)<2기능에서 결코 진실 하지 않다고 생각한다 s. 또한, 당신은 당신을 대체 할 수 format"a[Fraction(%s)%s%s]='(%s%s%s)'"%(x[:i],o,v,x[:i],o,A)4 저장 문자.
beary605

@ beary605 : 때로는 i = len (x) -1 일 때 다음 호출에 단일 문자가 표시됩니다. 두 번째 요점은 감사합니다! :)
JPvdMerwe 1

허 .. except:0똑똑 .. 아주 똑똑하다. 나는 기억할 것이다
Ev_genus

예시적인 결과물을 포함하십시오.
DavidC

1
아니, 아직 뛰고있어 지금 PC를 옮겨야하지만 며칠 동안 작동 시켜서 완료되는지 확인합니다.
JPvdMerwe

3

파이썬 3 (436) (434) (443)

그거 어려웠 어. 출력을 더 네이티브로 만들면 일부 문자를 절약 할 수 있습니다.

from itertools import*
r={};k=product;m=map
q=lambda n,h=1:["("+i+c+j+")"for(i,j),c in k(chain(*[k(*m(q,f))for f in sum(([(x[:q],x[q:])for q in range(1,len(x))]for x in m("".join,permutations(n))),[])]),list("+-*/^")+[""]*h)]if 1<len(n)else[n]*h
a,b=m(int,m(input,"nm"))
for i,j in chain(*[k(q(str(n),0),[n])for n in range(a,b+1)]):
    try:exec("if eval(%r)==j:r[j]=i"%i.replace("^","**"))
    except:0
print(len(r))
for j,i in r.items():print(i,j)

산출

n100
m200
6
(2^(8-1)) 128
(3*(51)) 153
((11)^2) 121
(5^(1+2)) 125
(6*(21)) 126
((2^7)-1) 127

1
그래서 당신은 많은 영리한 비법을 가지고 있습니다. 그러나 1 ~ 9를 올바르게 처리하지 않고 입력 내용을 포함하지 않는다는 것을 언급해야합니다. 당신은 후 공간을 제거하여이 개 문자를 불구하고 제거 할 수 있습니다 "("+i+c+j+")"및 교체 len(n)>1에 의해 1<len(n), 그 후에 당신은 그 표현 후 공간을 제거 할 수 있습니다.
JPvdMerwe

공정한. +7 자 모두 수정
Ev_genus

마지막 줄을 바꾸어 for j in r:print(r[j],j)7자를 저장할 수 있습니다 .
JPvdMerwe

1

매쓰 456 416 402 404 400 396 문자

<< Combinatorica`; l = Length; p = Permutations; f = Flatten; c = Cases;
u[d_, o_, s_] := 
 Fold[#2[[1]] @@ If[s == 1, {#1, #2[[-1]]}, {#2[[-1]], #1}] &, 
 d[[1]], Thread@{o, Rest@d}];
q[t_, r_] := {u[t, #, r], u[HoldForm /@ t, #, r]} & /@ 
p[{Plus, Subtract, Times, Divide, Power}, {l@t - 1}];
v[m_, n_] := (t = Table[Union@
  c[f[{#~q~1, #~q~0} & /@ 
     f[p /@ c[
        FromDigits /@ # & /@ 
         f[SetPartitions /@ p@IntegerDigits@j, 1], x_ /; l@x > 1],
       1], 2], {j, _}], {j, m, n}]~f~1; {l@t}~Join~t)

:

v[1,300]//TableForm

출력 :

프리드먼 출력

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