Aritmetik… tock… kene… tock


15

Bu soru, uzun telefon toplantılarına takıldığında oynamayı sevdiğim bir oyun tarafından getirildi.

24 saatlik bir saatten (00:00 ile 23:59 arasında) iki kez göz önüne alındığında, sadece temel aritmetik işlemler kullanılarak tüm zamanlar boyunca kaç tane geçerli matematiksel denklem üretilebilir?

Girdi: 24 saatlik bir döngüde geçerli süreleri temsil eden iki dört basamaklı dize (iki nokta üst üste yok).

Örnekler:

Giriş için = 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.

Geçerli işlemler:

  • ilave
  • çıkarma
  • çarpma işlemi
  • bölünme (kayan nokta)
  • üstalma
  • faktöryel

İzin verilen diğer semboller

  • Parantez
  • Eşit işaretler

En kısa kod kazanır.

notlar

  • Amaç, geçerli bir ifadeyi kaç kez içerdiğini değil, iki kez geçerli ifadelerin sayısını bulmaktır .
  • Giriş olarak verilen iki zaman, zaman aralığına dahil edilir.
  • Basamakları mümkün olan her şekilde gruplandırabilirsiniz, böylece "1223", "12 23" veya "1 2 23" veya "1 223" vb. Olabilir.
  • Gerektiği kadar parantez kullanabilirsiniz.
  • Birden fazla =işaret kullanabilirsiniz . Örneğin, zaman 11:11geçerli ifadeye sahiptir 1=1=1=1.
  • İlk kez ikinci kez sonra kronolojik olarak gerçekleşirse, zaman aralığı ertesi güne geçer gibi sarılmalıdır.
  • Sayılar orijinal sıralarında kalmalıdır; rakamları yeniden sıralayamazsınız.
  • Sayıları kümelendirirken, sıfırlar kesinlikle en öndeki basamak olabilir, bu durumda yok sayılırlar ("03 03" olarak kümelenmiş "0303", 3 değerine sahip iki basamaktır.)
  • Eksi işaretini tek taraflı olumsuzlama olarak KULLANAMAZSINIZ. Bu nedenle, "12:01" "1-2 = - (01)" üretmez, ancak "1-2 = 0-1" üretir.
  • Basamaklara ondalık basamak ekleyemezsiniz. Bu nedenle, "12:05", "1/2 = 0,5" üretmez.
  • Faktöriyel zincirleme yok - bir rakam en fazla bir "!" İle takip edilebilir, daha fazla, aksi takdirde, çoğu zaman sonsuz çözümlere sahip olamazdı. Örn: "5!" geçerli ancak "5 !!" geçerli değil.


4
" Geçerli işlemler içerir ", test senaryoları ekleyebilmenizi engelliyor gibi görünüyor. " Geçerli işlemler " olarak değiştirip bazı test senaryoları eklerseniz daha iyi bir soru olurdu . Bitiş noktaları hakkında kesin olmak da yararlı olacaktır: girdi için 0000 1300denklemler sayıdan türetilmeli 0000ve 1300sayıma dahil edilmelidir mi?
Peter Taylor

1
"1423" rakamları verildiğinde "1 + 4 = 2 + 3", "(1 + 4) = (2 + 3)", "(1 + 4) = 2 + 3" ve "1 + 4 = (2 +3) "bir veya dört denklem olarak sayılsın mı? Ve ... "0000" ın bütün denklemleri nelerdir? Yaklaşık 100 olasılık veya daha fazlasını düşünüyorum ... Bu olabilir mi?
bobbel

2
Tekli operatörlerin kullanımıyla ilgili herhangi bir kısıtlama var mı? Kurallarda böyle bir kısıtlama yoksa, faktöriyel tekrar tekrar uygulanabilir ve böylece mükemmel bir çözüm imkansız olabilir.
Michael Stern

1
Michael, bu harika bir gözlem. Yani bulmaca uğruna, eğer mantıklıysa, "basamak" başına bir faktörle sınırlayacağımı düşünüyorum. Bunun için 5! geçerli ama 5 !! geçerli değil.
nobillygreen

Yanıtlar:


1

Python3, 363 karakter

Bugüne kadar cevap verilmediği için elimde olanı teslim ediyorum. Ne yazık ki, deneyin / blok dışında çok şişman, orada char kaydetmek için bir yol bulamadık. Oradaki iç içe döngülerle gerçekten zor, sanırım hepsi liste kavrayışlarıyla yapılamaz, ama belki birisi bana nasıl olduğunu söyleyebilir.

Ancak, meydan okumayı sadece temel matematik '+ - * /' kullanmakla sınırladım ve parantez kullanmadım.

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)

Bu CodeGolf üzerindeki tam kodumu (açıklayıcı bir şey umuyorum) benim pastebin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.