Tarihten bir matematik denklemi yapın


19

Ekonomi sınıfımda, arkadaşlarım ve ben, geçerli bir matematiksel denklem oluşturmak için basamakları (AA / GG / YY biçiminde) yeniden düzenlemenin yollarını bulmayı seviyoruz. Çoğunlukla, birleştirmeye ek olarak toplama, çıkarma, çarpma, bölme, parantez ve üs alma özelliğini kullanmamıza izin verilir.

Programınız benzer bir şey yapmalıdır. Program geçerli tarihi içe aktarmalı ve aşağıdaki kurallara göre bir ifade yazdırmak için operatörleri eklemelidir.

  • Rakamlar sırayla kullanılmalıdır. Basamakların yeniden düzenlenmesine izin verilmez.
  • Ortaya çıkan ifade matematiksel olarak doğru olmalıdır.
  • Toplama, çıkarma, çarpma, bölme, üs alma ve parantez kullanımına izin verilir. Basamakları birleştirmek de öyle. Ancak, tüm işlemler gerekli değildir. Bir rakamı negatif yapmak için çıkarma işareti kullanamazsınız ( -1+1+11=1011 Kasım 2010'daki gibi).
  • Program standart bir makinede 60 saniye içinde çalışmalıdır.

Örneğin, bu meydan okuma 10 Kasım 2015'te yazılmıştır. Program bunu 11/10/15 olarak yorumlayacaktır. Örnek bir çıktı olacaktır (1+1)/10=1/5.


Bonuslar

Kodunuzdaki bayt sayısını, programınızın desteklediği aşağıdakilerin her biri için 0,9 ile çarpabilirsiniz.

  • Program , satır satırları ile ayırarak oluşturulabilecek tüm olası ifadeleri yazdırır . İfadeler artan ek simgeler sırasına göre listelenmişse, ek bir 0,95 ile çarpın.
  • Program aynı zamanda AA / GG / YYYY tarihleri ​​için de çalışıyor ve yılın ilk iki basamağı ile bir olasılığa ek olarak baskı yapmıyor. Bu bonus ilk bonus ile birleştirilirse, yılın ilk iki basamağıyla ilgili tüm olasılıklar yazdırılmalıdır.
  • Program ayrıca çoklu eşitlikler varken için bir denklem yazdırır (örneğin, 11 Kasım 2011 tarihinde, 1=1=1=1=1=1gibi olasılıklara ek olarak, basılacak olur 1*1=1=1=1=1, 1*1*1=1=1=1ve 1*1*1*1=1=1. İlk prim elde edilecek tüm bu tür vakalar yazdırılması gerekir.
  • Program 2 ve 16 arasındaki tabanlara dönüştürmeyi destekler. Taban 10 değilse, ifadedeki tüm sayıların aynı tabana (Base b)yazılması ve ifadeden sonra yazılması gerekir ( bbuna göre değiştirilir).

Bu kod golf, bu yüzden standart kurallar geçerlidir. Bayt cinsinden en kısa kod kazanır.


1
Hangi işlemlere izin verilir?
anOKsquirrel

1
@FryAmTheEggman Bunu kopya olarak adlandırmak için yeterli benzerlik var mı? Ben öyle düşünmedim çünkü bu zorluk sadece bir basamak kullanmıyor ve aklında belirli bir RHS yok (sadece eşitlik).
Arcturus

17
GG / AA / YYYY> AA / GG / YYYY.
orlp

3
Sanırım ifadeyi yazdığınız soruda denklem kullanmak istiyorsunuz (bir ifade denklemin sadece bir yüzüdür ve sonra sorunuz gerçekten mantıklı değildir).
Paŭlo Ebermann

1
Bu herhangi bir tarih için kanıtlanmış mı?
Zach Gates

Yanıtlar:


6

Piton 3, 424 420 369 363 bayt

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, sayılardaki tüm olası işlem kombinasyonlarını zorlar ve birini bulduğunda durur.

EDIT: @NoOneIsHere sayesinde 4 bayt kaydedildi

EDIT 2: @ValueInk sayesinde kaydedilen 51 (!) Bayt


1
Merhaba, PPCG'ye hoş geldiniz! Satırını satır içine alabilir except:passve içindeki alanı kaldırabilirsiniz [ (p//(len(o)**i))%len(o)].
NoOneIsHere

Bölümünden içe aktarıyorsanız __future__, Python 3'e yükseltmek durumunuz için daha iyi olur mu? Ayrıca, sahip oolduğunuz operatörlerle birlikte operatörler listesini oluştururken neden geri döndüğünüzü anlamıyorum .
Değer Mürekkebi

@ValueInk Evet, muhtemelen python 3 olarak değiştirebilir ve birkaç bayt kaydedebilirim. Meydan okumaya başladığımda, golf oynamaya hiç odaklanmadım, bu yüzden kesinlikle daha kısa yapılabilir. Ayrıca, program tüm kombinasyonları bulana kadar zorlayan kaba bir hız olduğundan, hız bir sorundur ve o tersini kullanırsanız daha hızlı çalışma eğiliminde olduğunu gördüm. Muhtemelen bunu ciddi bir yarışmacı yapmak için biraz daha aşağı golf.
Theo

o=([[x,x+'(',x+')']for x in",+,-,==,*,/,**".split(',')])2 bayt için
Jonathan Allan

1
@JonathanAllan Huh. Bunları belirttiğiniz için teşekkürler. Zamanım olduğunda (muhtemelen yarın) kodun yeniden çalışmasını yapacağım
Theo
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.