날짜부터 수학 방정식 만들기


19

저의 경제학 수업에서 친구와 저는 유효한 수학 방정식을 만들기 위해 날짜 (MM / DD / YY) 형식으로 숫자를 재배 열하는 방법을 제안했습니다. 대부분의 경우 연결에 더하기, 빼기, 곱하기, 나누기, 괄호 및 지수를 사용할 수 있습니다.

당신의 프로그램은 비슷한 것을해야합니다. 프로그램은 현재 날짜를 가져오고 연산자를 삽입하여 다음 규칙에 따라 표현식을 인쇄해야합니다.

  • 숫자는 반드시 순서대로 사용해야합니다. 자릿수 재 배열은 허용되지 않습니다.
  • 결과 표현식은 수학적으로 정확해야합니다.
  • 괄호의 덧셈, 뺄셈, 곱셈, 나눗셈, 지수화 및 사용이 허용됩니다. 숫자의 연결도 마찬가지입니다. 그러나 모든 작업이 필요한 것은 아닙니다. 빼기 부호를 사용하여 숫자를 음수로 만들 수 없습니다 (예 -1+1+11=10: 2010 년 11 월 11 일).
  • 프로그램은 표준 시스템에서 60 초 안에 실행되어야합니다.

예를 들어,이 과제는 2015 년 11 월 10 일에 작성되었습니다. 프로그램은이를 15/11/15로 해석합니다. 샘플 출력은입니다 (1+1)/10=1/5.


보너스

프로그램에서 지원하는 다음 중 하나에 대해 코드의 바이트 수에 0.9를 곱할 수 있습니다.

  • 프로그램은 줄 바꿈으로 구분하여 구성 할 수있는 모든 가능한 표현식을 인쇄 합니다 . 표현식이 추가 기호 순서로 나열되는 경우 추가 0.95를 곱하십시오.
  • 이 프로그램은 또한 MM / DD / YYYY 날짜에서도 작동하며 연도의 첫 두 자리 숫자와 함께 가능성을 인쇄합니다. 이 보너스가 첫 번째 보너스와 결합 된 경우 연도의 첫 두 자리 숫자가있는 모든 가능성을 인쇄해야합니다.
  • 이 프로그램은 또한 여러 등식이있는 경우에 대한 방정식을 인쇄합니다 (예 : 2011 년 11 월 11 일 에 , 및 . 와 1=1=1=1=1=1같은 가능성과 함께 인쇄 될 수 있습니다. 첫 번째 보너스를 받으려면 이러한 모든 경우를 인쇄해야합니다.1*1=1=1=1=11*1*1=1=1=11*1*1*1=1=1
  • 이 프로그램은 2와 16 사이의 기수로의 변환을 지원합니다. 기수가 10이 아닌 경우 식의 모든 숫자는 같은 기수 (Base b)로 작성되어야하며 식 뒤에 쓰여 져야합니다 ( b따라서 대체 됨).

이것은 코드 골프이므로 표준 규칙이 적용됩니다. 바이트 단위의 최단 코드가 이깁니다.


1
어떤 작업이 허용됩니까?
anOKsquirrel

1
@FryAmTheEggman 이것을 중복이라고 부르기에 충분한 유사성이 있습니까? 나는이 도전이 한 자리만을 사용하지 않고 특정 RHS를 염두에 두지 않기 때문에 그렇게 생각하지 않았습니다 (평등 만).
Arcturus

17
DD / MM / YYYY> MM / DD / YYYY.
orlp

3
나는 당신이 당신의 질문에 표현 을 쓴 곳에서 방정식 을 사용하고 싶다고 생각합니다 (표현은 방정식의 한 측면 일뿐입니다.
Paŭlo Ebermann

1
주어진 날짜에 이것이 가능합니까?
Zach Gates

답변:


6

파이썬 3 424 420 369 363 바이트

import time as t
r=range
x=len
d=list(t.strftime('%m%d%y'))
o=([[x,x+'(',x+')']for x in ['']+"+ - == * / **".split()])
n=[]
for l in o:
    n=l+n
o=n
for p in r(x(o)**(x(d)-1)):
    e=''
    for i in r(x(d)-1):
        e+=str(d[i])+o[(p//(x(o)**i))%x(o)]
    e+=str(d[-1])
    try:
        if eval(e)and e.find('=')!=-1:
            print(e.replace('==','=').replace('**','^'))
            break
    except:pass

Brute는 숫자에서 가능한 모든 연산 조합을 강제하고 하나를 찾으면 중지합니다.

편집 : @NoOneIsHere 덕분에 4 바이트를 절약했습니다.

편집 2 : @ValueInk 덕분에 51 (!) 바이트 절약


1
안녕하세요, PPCG에 오신 것을 환영합니다! 을 인라인하고 except:pass에서 공백을 제거 할 수 있습니다 [ (p//(len(o)**i))%len(o)].
NoOneIsHere 여기

에서 부서를 가져 오는 경우 __future__상황에 따라 Python 3으로 업그레이드하는 것이 더 효과적입니까? 또한, 나는 o당신이 가진 사람이있는 연산자 목록을 작성할 때 왜 당신이 반대인지 이해하지 못합니다 .
가치 잉크

@ValueInk 그래, 아마도 파이썬 3으로 바꾸고 꽤 많은 바이트를 절약 할 수있다. 도전을 시작했을 때, 나는 골프에 전혀 초점을 맞추지 않았기 때문에 여전히 더 짧아 질 수 있습니다. 또한 프로그램이 모든 조합을 찾을 때까지 강제 실행하기 때문에 속도가 문제이며 o의 역을 사용하면 더 빨리 작동하는 경향이 있음을 알았습니다. 나는 이것을 심각한 경쟁자로 만들기 위해 이것을 조금 더 아래로 내릴 것이다.
Theo

o=([[x,x+'(',x+')']for x in",+,-,==,*,/,**".split(',')])2 바이트에 대한
Jonathan Allan

1
@JonathanAllan Huh. 이것을 지적 해 주셔서 감사합니다. 시간이있을 때 코드를 재 작업하겠습니다 (아마 내일)
Theo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.