Olanları En Aza İndir [kapalı]


12

Senin görevin en az sayıda ve sadece operatörler +veya kullanarak doğal bir sayı oluşturmaktır -. Örneğin, yedi sayı yazılabilir 1+1+1+1+1+1+1=7, ancak olarak da yazılabilir 11-1-1-1-1=7. İlki kullanan 7ikincisi sadece kullanımlar ise, olanları 6. Senin görevin, bir doğal sayının girdisi göz önüne alındığında, kullanılabilecek minimum sayıda sayısını döndürmek n.

Bu kod golf, bu nedenle bayt cinsinden en kısa geçerli kod kazanır.

Test senaryoları

Giriş => Çıkış

0 => 2 (since 1-1=0)
7 => 6
121 => 6
72 => 15
1000 => 7
2016 => 21

Güzel ilk meydan okuma. Daha fazla test vakası eklemenizi öneririm. "VALID OUTPUTS", tek bir çıktı olduğu düşünüldüğünde bir hata mıdır? Ayrıca, 0 geçerli bir girdi ve eğer öyleyse, çıktı ne olmalıdır?
xnor

Bu ilginç bir zorluk. Çıktılar için bir açıklama eklemek isteyebilirsiniz, değiştirin VALID OUTPUTS. Seçim sizin, ancak genellikle SERMAYE MEKTUPLARI yerine kalın veya italik gibi insanlar (vurgu yerine bağırmaya benziyorlar). Kalın **bold text**ve italik *italics text*. ### TextKalın metinler için de kullanabilirsiniz . Neyse, PPCG'ye hoş geldiniz!
NoOneIsHere

Bilgisayarların okuyabileceği bir tablo veya kişilerin kodlarını çalıştırabileceği test senaryoları listesi hazırlamanız gerekir. Bu ipucuna bakın .
xnor

6
Bu soruyu kapatmak için oy kullanıyorum çünkü bu soru codefights.com/challenges adresindeki mevcut (aktif !!) golf mücadelesinin bir kopyası . OP aynı zamanda kod dövüşlerinde orijinal zorluğun yazarı olsa bile (şüpheliyim), soru kod dövüşlerindeki zorluk artık aktif oluncaya kadar kapatılmalıdır.
Jakube

1
@Jakube doğrudan bağlantı yardımcı olabilirdi, ama katılıyorum. Kapatmak için oy vereceğim.
NoOneIs Here

Yanıtlar:


3

JavaScript (ES6), 127 126 87 bayt

f=(n,z=2,m=n*9+'',r=m.replace(/./g,1))=>n?m.length+(m<'55'?f(n- --r/10,0)-1:f(r-n,0)):z
Input: <input type="number" oninput="result.textContent=f(this.value)"> Result: <span id="result"></span>

Bu noktada JavaScript'in tamsayı sınırlarına girmeye başladığınız yaklaşık 10 14 15 ile çalışmalıdır . Açıklama:

f=(                             Recursive function
 n,                             Parameter
 z=2,                           Zero workaround
 m=n*9+'',                      Magic
 r=m.replace(/./g,1)            Find repunit not less than than n
)=>n?                           Nothing to do if n is zero
 m.length+                      Assume subtracting from repunit
 (m<'55'?                       Should we subtract from repunit?
  f(n- --r/10,0)                No, so subtract previous repuint
   -1:                          Which is one 1 shorter
  f(r-n,0)):                    Subtract from repunit
 z                              Return special case if n is zero

Bu n*9sihri iki kez kullanır ; ilk iki basamak halinde ilk olarak, ikinci olarak, bana bir sonraki repunit uzunluğunu veren n*9olan 55ya da daha yüksek, daha sonra çıkartmayı gereken nbir sonraki repunit gelen aksi takdirde 1 çıkarılmasıyla hesaplanır önceki repunit (çıkarma gerekir ve, bölme 10). Bu 10 15'e kadar çalışmalıdır .


2

Pyth, 19 16 bayt

ffqQvs+R1Y^c3"+-

Test odası

Kaba kuvvet algoritması. Gerekli dizeler, öğeleri ['+', '-', '']test edilen 1'lerin sayısına eşit olan tüm listeler alınarak , her birine 1 ekleyerek ve tek bir dizeyle birleştirilerek oluşturulur. Bu dizeler daha sonra değerlendirilir ve girdi ile karşılaştırılır. Başarılı bir dize bulunana kadar bu tekrarlanır.

Bazı satırlar önde gelen +veya -test edilmiş, ancak bu bir sorun değil. Girdi negatif olsa olurdu.

Çok yavaş hale gelmeden önce 9 boyuna kadar çalışabilir.

Açıklama:

ffqQvs+R1Y^c3"+-
ffqQvs+R1Y^c3"+-"T    Implicit variable introduction
                      Q = eval(input())
f                     Starting with T = 1 and counting upwards, repeat until true.
                      The value of T where the result is first true is output.
           c3"+-"     Chop "+-" into thirds, giving ['+', '-', '']
          ^      T    Form every list with those elements of length T.
 f                    Filter over those lists, lambda var Y.
      +R1Y            Append a 1 to each element of the list.
     s                Concatenate.
    v                 Eval.
  qQ                  Compare for equality with the input.
                      The inner filter will let through the successful cases.
                      The outer filter will stop when there is a successful case.

2

JavaScript (ES6), 92 bayt

f=(n,i=3)=>eval([...s=i.toString(3)].map(d=>"-+"[d]||"").join`1`+".0")-n?f(n,i+1):s.length-1
n = <input type="number" oninput="R.textContent=f(this.value)" /><pre id="R"></pre>

açıklama

Özyinelemeli işlev. Bu olası tüm permütasyonları oluşturur 1s ile ayrılır +, -ya da hiç. Her basamak dönüştürme basamağı bir diziye çevirerek, bir baz-3 sayısını arttırarak yapar 0için -, 1için +ve 2birlikte bunları birleştiren daha sonra, boş bir dizeye 1s. Ortaya çıkan dizeeval denklemin sonucunu döndüren bir JavaScript ifadesi olarak d olur.

Operatörler 1arasında s (s) ile birleştiği için s +1+1+1+vardır length - 1 1. İlk operatörü (çünkü göz ardı edilir +1= 1, <nothing>1= 1lider asla olmayacağı böylece ve bir rakamdır 0için -ve son operatörün de (ekleyerek yok sayılır) .0denkleme).

Daha Yüksek Çıkış Sürümü, 96 bayt

Diğer sürüm, özyineleme çağrısı yığın sınırı nedeniyle ~ 10'dan daha yüksek çıktılar döndüremiyor. Bu sürüm, özyineleme yerine bir for döngüsü kullanır, bu nedenle ~ 33'e kadar çıkış döndürebilir. Gerekli süre katlanarak artar, bu yüzden test etmenizi önermem.

n=>eval('for(a=3;eval([...s=a.toString(3)].map(d=>"-+"[d]||"").join`1`+".0")-n;)a++;s.length-1')

Kulağa çok karmaşık geliyor, hoşuma gidiyor.
Bálint
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.