Buat persamaan matematika dari tanggal

19

Di kelas Ekonomi saya, teman-teman saya dan saya suka mencari cara untuk mengatur ulang digit dalam format tanggal (dalam MM / DD / YY) untuk membuat persamaan matematika yang valid. Untuk sebagian besar, kita diperbolehkan menggunakan penjumlahan, pengurangan, penggandaan, pembagian, tanda kurung, dan eksponensiasi sebagai tambahan pada penggabungan.

Program Anda harus melakukan hal serupa. Program harus mengimpor tanggal saat ini dan menyisipkan operator untuk mencetak ekspresi sesuai dengan aturan berikut.

  • Digit HARUS digunakan secara berurutan. Pengaturan ulang digit tidak diizinkan.
  • Ekspresi yang dihasilkan harus akurat secara matematis.
  • Penambahan, pengurangan, perkalian, pembagian, eksponensial, dan penggunaan tanda kurung diperbolehkan. Jadi adalah gabungan angka. Namun, tidak semua operasi diperlukan. Anda tidak dapat menggunakan tanda pengurangan untuk membuat angka negatif (seperti -1+1+11=10pada 11 November 2010).
  • Program harus berjalan dalam 60 detik pada mesin standar.

Misalnya, tantangan ini ditulis pada 10 November 2015. Program akan menafsirkan ini sebagai 11/10/15. Output sampel akan menjadi (1+1)/10=1/5.


Bonus

Anda dapat mengalikan jumlah byte dalam kode Anda dengan 0,9 untuk masing-masing dari berikut yang didukung oleh program Anda.

  • Program mencetak semua kemungkinan ekspresi yang dapat dibentuk, dipisahkan oleh baris baru. Kalikan dengan 0,95 tambahan jika ekspresi terdaftar dalam urutan simbol tambahan.
  • Program ini juga berfungsi untuk tanggal MM / DD / YYYY, mencetak kemungkinan dengan dua digit pertama tahun di samping kemungkinan tanpa. Jika bonus ini digabungkan dengan bonus pertama, semua kemungkinan dengan dua digit pertama tahun harus dicetak.
  • Program ini juga mencetak persamaan untuk ketika ada beberapa kesamaan-kesamaan (misalnya, pada 11 November, 2011 1=1=1=1=1=1akan dicetak, selain kemungkinan seperti 1*1=1=1=1=1, 1*1*1=1=1=1, dan 1*1*1*1=1=1. Semua kasus tersebut harus dicetak untuk bonus pertama yang akan dicapai.
  • Program ini mendukung konversi ke basis antara 2 dan 16. Perhatikan bahwa jika basis bukan 10, semua angka dalam ekspresi harus ditulis dalam basis yang sama, dan (Base b)harus ditulis setelah ekspresi (dengan bdiganti sesuai).

Ini kode golf, jadi aturan standar berlaku. Kode terpendek dalam byte menang.

Arcturus
sumber
1
Operasi apa yang diizinkan?
anOKsquirrel
1
@FryAmTheEggman Apakah ada cukup banyak kesamaan untuk menyebut ini duplikat? Saya tidak berpikir demikian karena tantangan ini tidak menggunakan satu digit dan tidak memiliki RHS tertentu dalam pikiran (hanya kesetaraan).
Arcturus
17
DD / MM / YYYY> MM / DD / YYYY.
orlp
3
Saya pikir Anda ingin menggunakan persamaan dalam pertanyaan Anda di mana Anda menulis ekspresi (ekspresi hanya satu sisi dari persamaan, dan kemudian pertanyaan Anda tidak masuk akal).
Paŭlo Ebermann
1
Apakah ini terbukti mungkin untuk tanggal tertentu?
Zach Gates

Jawaban:

6

Python 3, 424 420 369 363 byte

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-memaksa semua kemungkinan kombinasi operasi dalam angka dan berhenti ketika menemukan satu.

EDIT: Disimpan 4 byte berkat @NoOneIsHere

EDIT 2: Disimpan 51 (!) Byte berkat @ ValueInk

Theo
sumber
1
Halo, dan selamat datang di PPCG! Anda dapat menyejajarkan except:pass, dan menghapus spasi di [ (p//(len(o)**i))%len(o)].
NoOneIsHere
Jika Anda mengimpor divisi dari __future__, apakah meningkatkan ke Python 3 berfungsi lebih baik untuk situasi Anda? Juga, saya tidak mengerti mengapa Anda membalikkan oketika Anda sedang membangun daftar operator-dengan-parens yang Anda miliki.
Nilai Tinta
@ ValueInk Ya, saya mungkin bisa mengubahnya ke python 3 dan menyimpan beberapa byte. Ketika saya mulai melakukan tantangan, saya sama sekali tidak fokus bermain golf, jadi itu pasti masih bisa dibuat lebih pendek. Juga, karena program ini memaksa semua kombinasi sampai ditemukan, kecepatan adalah masalah, dan saya menemukan bahwa ia cenderung bekerja lebih cepat jika Anda menggunakan kebalikan dari o. Saya mungkin akan menurunkan ini sedikit lebih untuk membuatnya menjadi pesaing serius.
Theo
o=([[x,x+'(',x+')']for x in",+,-,==,*,/,**".split(',')])untuk 2 byte
Jonathan Allan
1
@Jonathan Allan Huh. Terima kasih telah menunjukkan ini. Saya akan melakukan pengerjaan ulang kode ketika saya punya waktu (mungkin besok)
Theo