N birim işini tamamlamak için en az kaç gün sürecek?


10

Bir kişi Niş birimlerini tamamlamak zorundadır ; işin doğası aynıdır.

İşin asılmasını sağlamak için ilk gün sadece bir birim işi tamamlar .

İşin tamamlanmasını kutlamak istiyor, bu yüzden son gün bir birim işi tamamlamaya karar veriyor .

O sadece tamamlamak için izin verilir x, x+1ya da x-1bir gün içinde çalışma birimleri , xönceki gün tamamlanan işin birimdir.

Göreviniz , iş birimlerini tamamlamak için alacağı minimum gün sayısını hesaplayacak bir program veya işlev oluşturmaktır N.

Örnek Giriş ve Çıkış:

input -> output (corresponding work_per_day table)
-1    -> 0      []
0     -> 0      []
2     -> 2      [1,1]
3     -> 3      [1,1,1]
5     -> 4      [1,1,2,1] or [1,2,1,1]
9     -> 5      [1,2,3,2,1]
13    -> 7      [1,2,2,2,3,2,1]

Girdi, STDINişlev argümanı aracılığıyla veya işlev argümanı olarak veya herhangi bir uygun şekilde alınabilir .

Çıktı yazdırılabilir veya bir fonksiyonun sonucu olarak veya herhangi bir uygun şekilde olabilir.

Bu . En kısa çözüm kazanır.



1
Öyleyse, girdiler pozitif tamsayılarla sınırlıdır, çünkü Kenny olumsuz bir iş sayısı elde etmenin mümkün olduğunu gösterdi mi? Veya günlük çalışma minimum sıfır ile mi sınırlı?
mbomb007

1
Pyth cevabını neden kabul ettin? Jelly cevabım 3 byte daha kısa ...
Dennis

Hey, @ Dennis Yaklaşımı anlamam gerekiyor ve @Kenny Lau anlamamı sağlıyor.
HarshGiri

CodeGolf için yeniyim, bu yüzden buradaki tüm şeyleri tam olarak anlamak biraz zaman alacak.
HarshGiri

Yanıtlar:


3

Jöle , 5 bayt

×4’½Ḟ

Bu, @ LeakyNun'un yaklaşımının kapalı bir formunu kullanır .

Çevrimiçi deneyin!

Şanslı bir tesadüf nedeniyle, gerçek / karmaşık sayılar olarak floor/ realiçin aşırı yüklenir. Bu, Jelly'deki aşırı yüklü üç atomdan biridir.

Nasıl çalışır

×4’½Ḟ  Main link. Argument: n (integer)

×4     Compute 4n.
  ’    Decrement; yield 4n - 1.
   ½   Square root; yield sqrt(4n - 1).
       If n < 2, this produces an imaginary number.
    Ḟ  If sqrt(4n - 1) is real, round it down to the nearest integer.
       If sqrt(4n - 1) is complex, compute its real part (0).

1
Biri basitçe değil ...
Leaky Nun

1
"Şanslı tesadüf"
Arcturus

4

Pyth , 8 bayt

tfg/*TT4

Nasıl çalışır:

tfg/*TT4   Q is implicitly assigned to the input.
 f         test for T=1,2,3,... returning the first successful case
   /*TT4   whether T * T / 4
  g     Q  is greater than or equal to the input (second argument implied)
t          and subtract 1 from the first successful case

Çevrimiçi deneyin!

Sözde kodda:

for(int T=1;;T++)
    if(T*T/4 >= Q)
        return T-1;

bonus, 22 bayt

"-1 için 7 döndürmelidir"

+tfg/*TT4?>Q0Q-2Q1*4g1

Çevrimiçi deneyin!


3

JavaScript (ES2016), 24 bayt

@Florent ve Exponentiation Operator sayesinde ES6 varyantının kısaltılmış hali (şu anda yalnızca Firefox gece yapılarında veya transpillerinde).

n=>(n-1)**.5+(n+1)**.5|0

JavaScript (ES6), 30 bayt

n=>(s=Math.sqrt)(n-1)+s(n+1)|0

Bu diziye dayanarak .

f=n=>(s=Math.sqrt)(n-1)+s(n+1)|0

units.oninput = () => output.value = f(+units.value||0);
<label>Units: <input id="units" type="number" value="0" /></label>
<label>Days: <input id="output" type="number" value="0" disabled /></label>


ES2016'da (26 karakter) daha da kısa:f=n=>(n-1)**.5+(n+1)**.5|0
Florent

@Florent Wow teşekkürler, yaklaşan üs operatörünün farkında değildi.
George Reith

2

JavaScript, 32 31 bayt

f=(q,t=1)=>q>t*t/4?f(q,t+1):t-1

Kod çözülmemiş kod:

function f(q, t = 1) {
  return q > t * t / 4
    ? f(q, t + 1)
    : t - 1
}

Kenny Lau'nın anwser'ı ile aynı algoritmayı kullanır, ancak bazı baytları kurtarmak için yinelemeli kapatma olarak uygulanır.

Kullanımı:

f(-1)  // 0
f(0)   // 0
f(2)   // 2
f(3)   // 3
f(5)   // 4
f(9)   // 5
f(13)  // 7

REPL çözümü, 23 bayt

for(t=1;t*t++/4<q;);t-2

Parçacığı q=çalıştırmayı başa ekle :

q=-1;for(t=1;t*t++/4<q;);t-2 // 0
q=9;for(t=1;t*t++/4<q;);t-2  // 5
q=13;for(t=1;t*t++/4<q;);t-2 // 7

Hatta benimkiyle aynı değişken isimlerini kullanıyor :)
Leaky Nun

Çevirerek bir bayt kurtarabilir >=için <D:
Çatlak Nun

@KennyLau Teşekkürler! Ben golf değil beri uzun zaman oldu. Biraz paslıyım x)
Florent

for(t=1;;)if(t*t++/4>=q)return t-1;sadece 36 bayttır :)
Leaky Nun

1
@KennyLau 23 bayt çözüm ekledim :)
Florent

2

Python, 28 bayt

lambda n:max(4*n-1,0)**.5//1

Bir şamandıra çıktılar. maxVermek için vardır 0için n<=0negatif karekökü için bir hata kaçınırken.


2

UGL , 30 25 bayt

i$+$+dc^l_u^^$*%/%_c=:_do

Çevrimiçi deneyin!

Negatif girişler için çalışmaz.

Nasıl çalışır:

i$+$+dc^l_u^^$*%/%_c=:_do
i$+$+d                     #n = 4*input-1
      c                    #i=0
       ^l_     %/%_c=:_    #while      > n:
           ^^$*            #      i**2
          u                #                i = i+1
                       do  #print(i)

Önceki 30 baytlık çözüm:

iuc^l_u^^$*cuuuu/%_u%/%_c=:_do

Online tercüman burada .

Negatif girişler için çalışmaz.

Nasıl çalışır:

iuc^l_u^^$*cuuuu/%_u%/%_c=:_do
iuc                             #push input; inc; i=0;
   ^l_u             %/%_c=:_    #while        > input:
       ^^$*cuuuu/%_             #      i**2/4
                   u            #                      i = i+1
                            do  #print(i)

1

MATL, 11 bayt

E:t*4/G<f0)

@KennyLau'ya benzer algoritma, süresiz döngüden ziyade, bazı baytları kurtarmak için 1 ... 2n'den döngü yapmam dışında.

Çevrimiçi deneyin!

açıklama

    % Implicitly grab the input
E   % Double the input
:   % Create an array from 1...2n
t*  % Square each element
4/  % Divide each element by 4
G<  % Test if each element is less than G
f   % Get the indices of the TRUE elements in the array from the previous operation
0)  % Get the last index (the first index where T*T/4 >= n)
    % Implicitly display the result.

@LuisMendo Bunu işaret ettiğiniz için teşekkürler. Güncellenmiş!
Suever


0

Python, 43 bayt

f=lambda n,i=1:i-1if i*i>=n*4 else f(n,i+1)

1
= yerine <= kullanarak bir bayt kaydedebilir
Leaky Nun

0

Java 8, 30 24 bayt

n->(int)Math.sqrt(n*4-1)

Çevrimiçi deneyin.

nJava'nın 0'dan büyük olup olmadığını kontrol etmeye gerek yoktur , çünkü Java'nın pozitif girişler için kullandığımız dökümle birlikte gelen negatif girişler için Math.sqrtgeri döner .NaN0int


0

Yakut , 30 bayt

->n{n<1?0:((4*n-1)**0.5).to_i}

Çevrimiçi deneyin!

Burada bir byte kaydetme .to_iyerine .floor.

Olumlu olmayan miktarlardaki işlere yönelik destek 6 baytlık bir maliyetle gelir ( n<1?0:).

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.