Yapboz Sadece dört ayak değil


11

Dört ayak bulmacasının bu varyantında, x x's0'dan 100'e kadar her sayıya ulaşmak için en fazla (ve başka bir sayı yok) ve tanımlanmış bir dizi işlem x = 4kullanmalısınız. Eğer o zaman dörde kadar kullanabilirsiniz 4sve bu soru klasik dört ayak olur (tam olarak dördü kullanmak yerine dört adete kadar 4s kullanabilirsiniz). Varsayıyoruz 1 < x <= 9.

Bu sürümde, yalnızca aşağıdaki işleçlere izin verilir:

  • Toplama ( +), Çıkarma ( -), Çarpma ( *), Bölme ( /). Bu gerçek bir bölünme olduğuna dikkat edin 5/2 = 2.5.
  • Üstel (örn. 4 ^ 4), çünkü normal olarak elle yazılırsa ekstra sembol içermez.
  • Birleştirerek yeni tamsayılar oluşturabilirsiniz xs. Örneğin tamsayıları yapabilirsiniz 4, 44, 444, 4444.

Ayrıca, işleçlerin değerlendirme sırasını denetlemek için sayıları gruplandırmak için parantez kullanabilirsiniz. Örneğin parantezleri olduğu gibi birleştirme ile birleştiremezsiniz (4/4)(4/4) = (1)(1) = 11.

Başka hiçbir sembol kullanılamaz ve standart işlem sırası uygulanır.

Programınız x, tanımlanmış aralıkta ve naralarında 0ve 100kapsayıcıda, bu girdi için varsa doğru bir çözüm üretmelidir . Aksi takdirde, kodunuzun böyle bir çözüm olmadığını belirten bir şey çıkarması gerekir.

İzin verilen aralıktaki xve girilen değerler için makinenizde tamamlama gönderiminizi çalıştırabilmeniz gerekir n. Bu kod golf, bu yüzden en kısa çözüm kazanır.

Bu eski ilgili soru daha fazla operatör (ve sadece 4 s) kullanıyor ve bu nedenle 0 ile 100 arasındaki tüm sayılar çözülebilir, bu da bu meydan okuma için doğru olmayacak.

Giriş ve çıkış

Kodunuz iki tamsayı alır xve ngirdi olarak ve uygun bulduğunuz herhangi bir insan tarafından okunabilir biçimde bir çözüm (veya çözüm olmadığını gösteren bir gösterge) çıktısı almalıdır. Girdi 4 6, örneğin "Dört adede kadar 4s kullanmak, 6 sayısını yapmak" anlamına gelir. Yani giriş ise 4 6çıkış olabilir (4+4)/4+4.



2
Parens birleştirme ile birleştirilebilir mi? örneğin `` (4/4) (4/4) = (1) (1) = 11?
Dijital Travma

1
Parantez eklemek (ve parantezlere + birleştirmeye izin vermemek) bunu önemli ölçüde zorlaştırır
Draconis

2
Üs alma operatörü ve basamaklı IMO şey önemsiz olmayan aşırı katmayan kullanılır kaç kez üzerinde bir dış döngü ekleme codegolf.stackexchange.com/q/82884/194
Peter Taylor

2
@PeterTaylor Parantezler oldukça fazla fark yaratıyor gibi görünüyor. Mümkünse yeniden açmak için oy kullanırdım.
felipa

Yanıtlar:


4

Python 3 , 265 bayt

def f(x,n):
 for e in g(x,x-(x>7)):
  try:
   if eval(e)==n:return e
  except:1
g=lambda x,d:{str(x)*-~i for i in range(d)}|{s%(a,b)for a in g(x,d-1)for b in g(x,d-a.count(str(x)))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}if d else{}

Çevrimiçi deneyin!

Mühendis Tost ile bağlantılı referanstaki tüm numaralar için çalışır .

Kadar çalıştırır x=8TiO üzerine, x=9benim makinede birkaç dakika sürer.


İşlev g, en fazla xsayıda x' içeren tüm kombinasyonlardan oluşan bir grup döndürür . fdaha sonra bunların içinden geçer ve sayıya ilk değerlendirileni döndürür n.

Her biri xiçin bulduğum olası değerlerin sayısı :

x  possible numbers
------
2  5
3  17
4  35
5  56
6  83
7  101
8  101
9  101

Tüm sayılar yukarıdan oluşturulabilir (a+b), (a-b), (a+b), a*b, a/b, (a/b), ve a^b. a+bve a-bdaha fazla numara vermeyin.

a^b yalnızca bir kez kullanılır, aksi takdirde büyük sayılar oluşturulur (bu aynı zamanda yukarıdaki referans belgesinde de doğrulanır)


Bir çözüm bulur bulmaz kısa devre yapan alternatif bir versiyon (golf kadar değil):

Bu, x=7..9tüm sayılar için oluşturulabileceği için çok daha hızlıdır .

Python 3 , 338289 bayt

def f(x,n,d=-1):
 d=[d,x][d<0];X=str(x);r=set()
 for E in{X*-~i for i in range(d)}|{s%(a,b)for a in[0]*d and f(x,n,d-1)for b in f(x,n,d-a.count(X))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}:
  try:e=eval(E)
  except:e=-1
  if e==n:exit(E)
  r|={E}
 return r

Çevrimiçi deneyin!


Bu çok güzel bir cevap! Her zaman tam olarak (aksine) x xs (örneğin (4/4**(4-4))için 4) kullandığınızı sanıyordum ama öyle değil.
Anush

exit(e)daha kısadırreturn e
mbomb007
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.