Bilgisayar onarımlarımı ertelememe yardım et!


23

Bu zorluk size gerçek (ve trajik) bir ilham kaynağı ile sağlanıyor. Son zamanlarda klavyemdeki sayı satırı biraz dağınıktı. Anahtarlar 1-9bazen çalışır - ancak diğer zamanlarda sonuç yoktur. Hevesli bir programcı olarak, bu korkunç! (Bu ünlem işaretine bakın. Şu anda çalıştıklarını biliyorsunuz.) Sadece sayılara değil, sembollere de ihtiyacım var.!@#$%^&*(tamamen yarı yarıya da etkisiz kalıyorlar! Bir C programcısı olarak, dizüstü bilgisayarımı düzeltmek için kodla dolanmakla meşgul programımdan zaman ayırmak yerine, sorunla uğraşmakla daha çok ilgileniyorum. Geçtiğimiz birkaç hafta boyunca, yavaşça, kodumdaki sayı değişmezlerinin tümü onaltılık bir değerle değiştirildi, böylece sayıları kopyalayıp yapıştırmak için aramaya gitmek zorunda kalmayacağım. Ancak, bazı numaraların tuşları olmadan yazması kolay değildir 1-9. Örneğin, sayı 1bu kadar basit bir şekilde onaltılık bir sayı ile yazılamaz ve kodumdakileri 1s ile değiştirmek için başvurdum 0xF - 0xE. Etkilenen sadece anahtarları 1-9ben gibi sembollerin tam olarak korumak, böylece +, -ve /. Ancak çarpım veya parantez kullanamıyorum.*ve (genellikle kırılır. Bu senin zorluğuna yol açar.

Giriş

Bir tam sayı, nstdin veya dilinizin eşdeğeri. İsterseniz, tamsayı önce veya sonra yeni bir satır veya başka bir boşluk karakteri gelebilir. Alternatif olarak, bir komut satırı argümanı ile giriş alabilirsiniz.

Programınız negatif girişe doğru cevap vermeli ve en az 32 bit işaretli tamsayıları kullanabilmelidir.

Çıktı

Programınız, gözlemlenebilir bir biçimde, sayıyı nbir veya daha fazla onaltılık değerin toplamı, farkı veya bölümü olarak yazmak için mümkün olan en kısa (boşluk olmayan karakterlerde) mümkün olan bir çıktı vermelidir . Bu sorunu çözmenin birden fazla yolu vardır ve herhangi bir eşit uzunlukta çıktıyı başka herhangi bir şeyden yana koymanıza gerek yoktur.

Çıkış şeklinde olmalıdır aşağıdaki onaltılık değer olan tek basamak içeren ve sembolleri biridir . Izin tamsayı bölme değil, kayan nokta tanımlar.A % A % A...A0xA-F a-f%-+//

(Çıktınızın, nilk önce soldan sağa ve sonra toplama ve çıkarma işlemlerinin kongre olduğu gibi soldan sağa değerlendirilmesiyle sonuçlanması gerektiğini unutmayın .)

Test Kılıfları

Giriş çıkış

  1. 1

    0xF - 0xE(ya da 0xF-0xEya da 0xB-0xAya da 0xd - 0xcya da 0xF/0xF)

  2. 15

    0xF

  3. 255

    0xFF

  4. 30

    0xF + 0xF

Puanlama ve Kurallar

Bu kod golfü. Ön puanınız kaynak dosyanızdaki bayt sayısıdır.

1-9Kaynağınızdaki rakamlardan hiçbirini KULLANMAYABİLİRSİNİZ .

!@#$%^&*(Kaynağınızdaki sembolleri kullanabilirsiniz , ancak her biri puanınıza +20 ceza ile geliyor.

Programınız, nbu fonksiyon insan tarafından okunabilir bir çıktı ürettiği sürece argüman alan bir fonksiyonla değiştirilebilir . İşlevinizin dönüş değeri çıkış olarak sayılmaz.

Standart boşluklara izin verilmez.

En düşük puan kazanır! İyi şanslar!

Biçimlendirme / sorgulama / netlik konusunda bir şey mi gördüm? Bilmeme izin ver! Bu, bu siteye ilk gönderimim!


Tamsayının boyutuna bir üst sınır var mı? Ayrıca, negatif sayılar bir rasgele kesinlik ile gösterilecek mi (yani 32 bit)?
FryAmTheEggman

@FryAmTheEggman Açıklamak için orijinal yazıyı düzenledi. Giriş negatif olabilir ve programınız en az 32 bit girişe doğru yanıt vermelidir. Teşekkürler!
BrainSteel


Bu bana oldukça sağlam bir özellik gibi gözüküyor, ancak bazı geri bildirimler almak isterseniz, bunu sanal alana (ileriki zorluklar için) göndermenizi tavsiye ederim, böylece ana göndermeden ve insanlar üzerinde çalışmaya başlamadan önce geri bildirim alabilirsiniz .
Martin Ender

1
Tam sayı mı yoksa kayan nokta bölümü mü?
edc65

Yanıtlar:


5

JavaScript 287 (187 + 20 * 5) 295 (195 + 20 * 5) 338 (198 + 20 * 7)

6 izin verilen altıgen basamak (0xA - 0xF) ve izin verilen 3 operatörün olası tüm kombinasyonlarını kontrol eden bir işlev. Açılır pencereyle çıktı alın ve istendiği gibi bir değer döndürmeyin.

I Grubu virgülle ifade ayrılmış, ancak 5 önleyemediği için [] kullanılan 7 döngüler ve işlev çağrısı için açık parantez.
Rakamlardan kaçınmak için 1,2,3 için A, B, C değişkenleri vardır (bu, kodu daha da belirsiz hale getirir)

Düzen kodu '(' kaçınarak odaklanarak revize etmiştir. Kaldırılan ifs ve açık RegExp oluşturma

Dikkat: Bu fonksiyon inanılmaz derecede yavaş, 90 gibi küçük girişlerde bile FireFox'ta bir betiğin zaman sınırını aşacak.

Tüm olası ifadeleri sıralamak için, 3'ten başlayıp sonsuza kadar yukarı çıkan sayıları kullanıyorum. Kodlama rakamları:
0,1,2 +, -, /
4 - 9 operatörleri onaltılık rakamlar A.F3'e
izin verilmez.
Her sayı, /3|[0-2]{2}/3 rakamını önlemek ve ardışık 2 operatöre sahip olmak için bir regexp ile kontrol edilir . ayrıca denetlemekten ve lider operatörlerden kaçınmak için kontrol edin - kodu inceleyin)

Sonuçta ortaya çıkan dize 0xA + 0xA - 0xDgeçerli bir javascript gibi bir şeydir , bu yüzden değerlendirmek için eval kullanıyorum. Unfortunatley '/' operatörü kayan nokta ve JavaScript'te tamsayı değil, bu yüzden sonucun tam sonucunu tam olarak elde etmek için sonucun doğru olacağından emin değilim (ancak küçük bir yuvarlama hatasının yapamayacağından emin değilim '*' ile büyütülmek)

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,j=0;j?x-~~eval(L):A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',L='',w='0x')?j='':j)
      c>C?w+=' ABCDEF'[c-C]:[L+=w,w=' '+'+-/'[c]+' 0x']
  }
  alert(L)
}

Başka bir şey

Şimdi, daha komik bir şey. Ben değerlendirme çağrısından kaçınmak için çok basitleştirilmiş bir ifade ayrıştırıcı kullandım ve eğlenceli bir şekilde daha hızlı olduğu ortaya çıktı.

Ayrıştırıcı gerçekten basitleştirilmiştir, gerçek bir ayrıştırıcıda V ve O, bekleyen değerler yığınını ve bekleyen operatörler yığınını içeren diziler olmalıdır. Burada V, beklemedeki tek değerdir (ve aynı zamanda dönüş değeridir) ve O en fazla 2 karakterden oluşan bir dizedir. P '- + /' => '112' için işleç öncelik tablosu

Bu puan 275 + 4 * 20 => 355

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,D=A+C,j=0,P=''+A+A+B;j?x-V:A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',v=V=O=L='',w='0x')?j='':j)
      c>C?
        w+='ABCDEF'[v<<=D,v+=D+A-~c,c-D]
      :[
          P[O[0]]>=P[c]?[v=O>A?V/v|0:O>0?V+v:V-v,O=c]:O=c+O,
          L+=w,w=' '+'-+/'[c]+' 0x',V=v,v=0
      ]
  }
  alert(L)
}

Test Firefox / FireBug konsolunda, geri dönüş uyarısını değiştirin (çok daha kullanışlı)

;[0, 1, 15, 255, 30].forEach(x=>console.log(x,F(x)))

0 0xA - 0xA
1 0xA / 0xA
15 0xF
255 0xFF
30 0xF + ​​0xF

Sadece biraz daha az belirgin (ama sabırlı olun)

;[16,40, 51, 62, 73, 84, 95].forEach(x=>console.log(x,F(x)))

16 0xBA / 0xB
40 0xA + 0xF +
0xF 51 0xDD - 0xAA
62 0xEA - 0xAC
73 0xA + 0xEA - 0xAB
84 0xFE - 0xAA
95 0xA + 0xFF - 0xAA


3

Python 2: 185 bayt + 2 * 20 = 225

Ciddi bir cevap için çok uzun. Ancak henüz bir cevap olmadığı için, yine de göndereceğim.

from itertools import product as p
n=input()
l=t=0
while~l:
 l=-~l
 for i in p("0xABCDEF+-/",repeat=l):
  j=""
  for k in i:j+=k
  try:exec"t="+j
  except:0
  if t==n:print j;l=~0;break

productizin verilen karakterlerin tüm farklı düzenlemelerini yaratır. execonu çözmeye çalışır. Bu ne yazık ki bir istisna, dolayısıyla uzun try - catchblok döndürür . Sonuç iyi, yazdırır ve var olur.

İşlev çağrıları sırasındaki bu parantez nedeniyle 2 kat ceza verilir.


2
Bu cevabın birkaç sorunu olabilir: (1) 0onaltılık bir değişmez değil; Python negatif bir sayı içeren (2) takım C daha farklı bir sonuç verir
feersum
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.