산술… tock… 진드기… tock


15

이 질문은 긴 전화 회의에 갇혔을 때 내가 좋아하는 게임에 의해 당신에게 가져 왔습니다.

24 시간제 (00 : 00 ~ 23 : 59)에서 두 번 주어진 경우 기본 산술 연산 만 사용하는 사이에 몇 개의 유효한 수학 방정식을 생성 할 수 있습니까?

입력 : 24 시간주기에서 유효한 시간을 나타내는 두 자리 숫자 문자열 (콜론 없음).

예 :

입력 = 0000, 1300

03:26 produces: "0+3*2=6" and "03*2=6" etc.
11:10 produces quite a few, including: "1*1=1+0" and "1=1=1^0" and  "1=11^0" etc.
12:24 produces: "1/2=2/4" and "1=(2*2)/4" etc.

유효한 작업은 다음과 같습니다.

  • 부가
  • 빼기
  • 곱셈
  • 구분 (부동 소수점)
  • 지수화
  • 계승

다른 허용 가능한 기호

  • 괄호
  • 등호

가장 짧은 코드가 승리합니다.

노트

  • 목표는 유효한 표현식을 포함 하는 횟수가 아니라 두 번 유효한 표현식 를 찾는 것입니다 .
  • 입력으로 주어진 두 번 시간 범위에 포함됩니다.
  • 가능한 방식으로 숫자를 그룹화 할 수 있으므로 "1223"은 "12 23"또는 "1 2 23"또는 "1 223"등이 될 수 있습니다.
  • 필요한만큼 괄호를 사용할 수 있습니다.
  • 둘 이상의 =부호를 사용할 수 있습니다 . 예를 들어, 시간 11:11에는 유효한 표현식이 1=1=1=1있습니다.
  • 두 번째 시간 이후 처음으로 시간순으로 발생하는 경우 시간 범위는 다음 날로 넘어가는 것처럼 랩핑되어야합니다.
  • 숫자는 원래 순서대로 유지해야합니다. 숫자를 다시 정렬 할 수 없습니다.
  • 숫자를 군집화 할 때, 0은 절대 가장 앞자리 일 수 있으며,이 경우에는 무시됩니다 ( "03 03"으로 묶인 "0303"은 값이 3 인 두 자리 일뿐입니다.)
  • 빼기 부호를 단항 부정으로 사용할 수 없습니다. 따라서 "12:01"은 "1-2 =-(01)"을 생성하지 않지만 "1-2 = 0-1"을 생성합니다.
  • 소수점 이하 자릿수를 추가 할 수 없습니다. 따라서 "12:05"는 "1 / 2 = 0.5"를 생성하지 않습니다.
  • 계승의 연쇄가 없습니다. 숫자 다음에 최대 하나의 "!"가 올 수 있습니다. 더 이상 그렇지 않으면 여러 번 무한한 해가 생길 것입니다. 예 : "5!" 유효하지만 "5 !!" 유효하지 않습니다.


4
" 유효한 작업 포함 "은 ( 는) 테스트 사례를 추가 할 수없는 것으로 보입니다. " 유효한 작업 "으로 변경하고 일부 테스트 사례를 추가 한 경우 더 좋은 질문 입니다. 또한 엔드 포인트에 대해 정확하게하는 것이 유용 할 것이다 : 입력 0000 1300방정식으로부터 유도되어야 0000하고 1300카운트에 포함?
피터 테일러

1
"1423"숫자가 주어지면 "1 + 4 = 2 + 3", "(1 + 4) = (2 + 3)", "(1 + 4) = 2 + 3"및 "1 + 4 = (2 +3) "는 하나 또는 네 개의 방정식으로 계산됩니까? 그리고 ... "0000"의 모든 방정식은 무엇 입니까? 나는 약 100 가지 가능성, 또는 더 많은 것을 생각합니다.
bobbel

2
단항 연산자 사용에 제한이 있습니까? 규칙에 이러한 제한이 없으면 계승을 반복적으로 적용 할 수 있으므로 완벽한 솔루션이 불가능할 수 있습니다.
Michael Stern

1
마이클, 그거 좋은 관찰입니다. 그래서 퍼즐을 위해서, 나는 그것이 "숫자"당 하나의 계승으로 제한한다고 생각합니다. 따라서 5! 유효하지만 5입니다! 유효하지 않습니다.
nobillygreen

답변:


1

Python3, 363 자

오늘까지는 아무런 대답도 나오지 않았으므로 나는 내가받은 것을 나눠줍니다. 슬프게도 try / except 블록이 너무 뚱뚱해서 거기에 문자를 저장하는 방법을 찾지 못했습니다. 거기에 중첩 루프가 있으면 까다로울 수 있습니다. 모든 사람들이 내가 생각하는 목록 이해를 사용하여 수행 할 수는 없지만 누군가가 어떻게 말해 줄 수 있습니다.

그러나 기본 수학 '+-* /'만 사용하고 괄호는 사용하지 않는 것이 문제였습니다.

a,b = input().split()
r=0
for time in [c for c in range(int(a),int(b)) if c/10%10<6]:
 t,*ts='%04d'%time
 e=[t]
 for d in ts:
  e=[(n+o+d,n+d)[o==' '] for o in ' -+*/=' for n in e]
 for h in [g for g in [e.split('=') for e in e if '='in e] if len(g)>1]:
  for k in h:
   try:
    if eval(h[0]) != eval(k):
     break
   except:
    break
  else:
   r+=1
print(r)

이 CodeGolf의 내 전체 코드 (설명 설명)는 pastebin 에서 찾을 수 있습니다 .

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