Dişli Dizisi, Döner


16

Dişliler, dişli kutusunun boyutuna bağlı olarak farklı hızlarda transfer eder.

dişli tren

Jack'in bir Dişli Trenini döndüren bir makinesi vardır. ama son vitesin hızını bilmiyorsunuz.

Neyse ki, sen harika bir kod golfçüsün, böylece ona yardım edebilirsin!

Peki ne yapmalıyım?

Her dişli 2 sayı ile temsil edilir, iç dişli yarıçapı ve dış dişli yarıçapı.

Dişli halinde Aolduğu [a,b]ve dişli Bolup [c,d], hızı arasındaki oram, Ave hızı Bolacaktır c:b.

Viteslerin bir listesi verildiğinde (2 tüpün listesi), son vitesin hızını verin.

İlk vitesin hızını varsayabilirsiniz 1.

Çalışılan örnek

Diyelim ki girdimiz [[6,12],[3,10],[5,8]].

İlk vites, [6,12]bir hıza sahip olurdu 1.

Sonra, ikinci vites, [3,10]bir hıza sahip olurdu 1*12/3 = 4.

Sonra, son vites, [5,8]bir hıza sahip olurdu 4*10/5 = 8.

testcases

input                    output
[[1,1],[2,2]]            0.5     (1/2)
[[1,2],[1,2],[1,2]]      4       (2/1*2/1)
[[6,12],[3,10],[5,8]]    8       (12/3*10/5)

kurallar

Temel kuralları geçerlidir.


6
Kayan nokta çıktısına izin verdiğiniz için, muhtemelen sonuçların ne kadar doğru olması gerektiğini netleştirmelisiniz.
Martin Ender

Girişi tuples listesi yerine düzleştirilmiş bir liste olarak alabilir miyiz?
Leaky Nun

Evet, öyle [6,12,3,10,5,8]. sadece kullanmak istiyorsan bahset.

11
Bu biraz haksızlık. Daha az ilginç olduğunu düşündüğüm için 7 baytlık farklı bir sürümüm vardı. Düzleştirilmeden 6 bayt olurdu. Bu tür bir durumdan kaçınmak için lütfen bir dahaki sefere korumalı alanı kullanmayı düşünün.
Dennis

Yanıtlar:


8

Haskell, 19 bayt

foldr1(/).tail.init

Düz liste gibi göz önüne alındığında [a,b,c,d,e,f], tail.initilk ve son elemanları kaldırır ve sonra foldr1(/)bölünmeler bir çağlayan oluşturur b/(c/(d/e))))değişen ortaya eserler *ve /: b/c*d/e.


ancak soru, programların düz bir liste değil, 2 tüpün listesini aldığını gösteriyor
Görünen Ad

1
Yorumlarda düz bir listeye izin verildi.
xnor

7

Jöle , 6 bayt

ḊṖU÷@/

Test odası.

ḊṖU÷@/   Main monadic chain. temp <- third argument (first input)
Ḋ        temp <- temp with first element removed
 Ṗ       temp <- temp with last element removed
  U      temp <- temp reversed
   ÷@/   temp <- temp reduced by reversed floating-point division.
         implicitly output temp.

1
Ah, dönüşümlü bölüm. Zekice.
Dennis


5

Cı, 115 123 121 83 80 76 71 70 bayt

@LeakyNun sayesinde 4 bayt tasarruf edildi!

Benim ilk golf, muhtemelen en iyi.

c;float r=1;float g(a,s)int*a;{for(;c<s-2;)r*=a[++c]/a[++c];return r;}

Dizi ve boyut alır.

Ungolfed:

int counter;
float ret=1;
float gear(int *arr, int size) {
    for(; counter < size-2; )
        ret = ret * arr[++counter] / arr[++counter];
    return ret;
}

5
PPCG'ye Hoşgeldiniz! :)
Martin Ender

Destekleyebileceğiniz maksimum sayı sayısı nedir? PPCG'ye Hoşgeldiniz!
Sızan Rahibe

j;float r=1;float f(int a[]){for(;j<sizeof a;)r=r*a[j++]/a[j++];return r;}(test edilmedi)
Leaky Nun

J ++, ++ j ve sizeof-2 değil. 4 bayt kaydedildi. Teşekkürler!
betseg

Geçilen dizilerin boyutunu ölçemeyiz gibi görünüyor. Cevabı düzenledim.
betseg

4

JavaScript (ES6), 44 bayt

a=>(t=1,a.reduce((x,y)=>(t*=x[1]/y[0],y)),t)

Düzleştirilmiş bir dizi için 37 bayt:

a=>1/a.slice(1,-1).reduce((x,y)=>y/x)

Haskell'den farklı reduceRightolarak reduce, yanlış yoldan daha ucuz ve sonunda karşılıklı olan o kadar uzun bir isim .


orada cevap ilham verdi ... Bundan daha
aşağıya gidemezdim


3

J, 8 bayt

%/@}:@}.

Çevrimiçi deneyin!

kullanım

>> f =: %/@}:@}.

>> f 1 1 2 2
<< 0.5

>> f 1 2 1 2 1 2
<< 4

>> f 6 12 3 10 5 8
<< 8

>>STDIN ve <<STDOUT nerede .

açıklama

JSağdan sola varsayılan olarak "Azalt", birkaç bayt sürdü: p

divide       =: %
reduce       =: /
atop         =: @
remove_first =: }.
remove_last  =: }:

f =: (divide reduce) atop (remove_last) atop (remove_first)

3

Mathematica, 26 bayt

#2/#&~Fold~#[[-2;;2;;-1]]&

Düz çift uzunluklu değerler listesi alan ve kesin sonucu döndüren adsız bir işlev (gerekirse kesir olarak).

Bu, tersine çevrilmiş listeye katlama bölümünün diğer bazı cevaplarıyla aynı yaklaşımı kullanır (ilk ve son öğeyi kaldırdıktan sonra).


2

MATL , 9 bayt

6L)9L&)/p

Giriş biçimi şunlardan biridir:

[[6,12],[3,10],[5,8]]
[6,12,3,10,5,8]
[6 12 3 10 5 8]

DÜZENLEME (2016 30 Temmuz): bağlantılı kod cümledeki 9Ltarafından 1Ldilinde son değişikliklere uyum sağlamak.

Çevrimiçi deneyin!

açıklama

6L    % Predefined literal: index from second to second-last element
)     % Apply index to implicit input. Removes first and last elements
9L    % Predefined literal: index for elements at odd positions
&)    % Two-output indexing. Gives an array with the odd-position elements
      % and the complementary array, with the even-position elements of the
      % original array
/     % Divide those two arrays element-wise
p     % Product of all entries. Implicitly display

1

JavaScript, 54 bayt

(a,s=1)=>a.map((v,i)=>s*=(x=a[i+1])?v[1]/x[0]:1).pop()

kullanım

f=(a,s=1)=>a.map((v,i)=>s*=(x=a[i+1])?v[1]/x[0]:1).pop()

document.write([
  f([[1,1],[2,2]]),
  f([[1,2],[1,2],[1,2]]),
  f([[6,12],[3,10],[5,8]])
].join('<br>'))

Ungolfed

function ( array ) {
  var s = 1;                                  // Set initial speed

  for ( var i = 0; i < array.length ; i++ ) { // Loop through array
    if ( array[i + 1] === undefined ) {       // If last element
      return s;                               // Return speed
    } else {                                  // Else
      s = s * ( array[i][0] / array[i+1][0])  // Calculate speed
    }
  }
}

Tabii ki, golf varyantı biraz farklı. İle .map(), dizinin ilk değerini ikinci tekerlekten sonraki hızla, ikinci değeri üçüncü tekerleğin hızıyla ve son değeri ve ikinci son değeri son tekerleğin hızıyla değiştirir. Yani, sadece son elemanı birlikte alıyoruz .pop().


1

PHP, 80 79 69 bayt

<?for($r=1;++$i<count($a=$_GET[a]);)$r*=$a[$i-1][1]/$a[$i][0];echo$r;

GET parametresinden girdi alır a; sonucu yazdırır

başlatılırken $r1 ile, o anda geçerli olan başlığın ikinci eleman yoluyla, önceki ve bölünmenin birinci elemanla çarpma son başlığın saniyede döngüler.


Bana hatırlattığı için Jörg'e teşekkürler $_GET; 7 bayt tasarruf.


daha zarif versiyonu, 88 bayt:

<?=array_reduce($a=$_GET[a],function($r,$x){return$r*$x[1]/$x[0];},$a[0][0]/end($a)[1]);

1
<?for($r=$i=1;$i<count($a=$_GET[a]);)$r*=$a[$i-1][1]/$a[$i++][0];echo$r;72 Bayt
Jörg Hülsermann

0

JavaScript, 59 58 56 bayt

a=>a.reduce((p,c)=>p*c[1]/c[0],a[0][0]/a[a.length-1][1])

açıklama

Diziyi azaltın ve her ikinci değerle çarpın ve her ilk değere bölün. Öyleyse [[6,12],[3,10],[5,8]]öyle 12/6*10/3*8/5. Tabii ki, istediğimiz asıl hesaplama şuydu, 12/3*10/5bu yüzden ilk önce /6ve son *8olarak *6tekrar çarparak ve /8geri bölerek bunu görmezden gelmek istiyoruz . Bu iptal işlemi 6/8, indirgeme işleminin başlangıç ​​değeri olarak ayarlanarak yapılır .


Aynı çözüme geldim. İşlem sonrası işlemleri *.../...ilk değere ekleyerek iki bayt kaydedebilirsiniz 1.
Titus


0

Python 3, 59 bayt

lambda x:eval('/'.join('{}*{}'.format(*i)for i in x)[2:-2])

Düzleştirilmemiş bir listenin argüman yoluyla girişini alan ve çıktıyı döndüren anonim bir işlev.

Nasıl çalışır

Girişteki her tamsayı çifti için formun bir dizesi 'int1*int2'oluşturulur. Tüm bu çiftlerin birleştirilmesi , istenen hesaplama olan ancak istenmeyen ilk ve son tam sayıları içeren bir /form dizesi verir 'int1*int2/int3*int4/...'. Bunlar, istenen hesaplamayı bırakarak sokmada ilk iki ve son iki karakteri dilimleyerek çıkarılır. Bu daha sonra değerlendirilir ve iade edilir.

Ideone üzerinde deneyin


0

Pascal, 88 bayt

Statik bir 2D dizi ve uzunluğunu (satır sayısı) girdi olarak alan özyinelemeli (yapmak zorundaydı ..) işlevi. Dizide bazı işaretçi matematik kullanma.

function r(a:p;n:integer):double;begin r:=a[1]/a[2];if n=2then exit;r:=r*r(a+2,n-1);end;

Kullanım örneği ile yönlendirilmemiş:

type
  p = ^double;
var
  n: integer = 3;
  garray: array [0..2, 0..1] of double;

function ratio(a: p; n: integer): double;
begin
  ratio := a[1] / a[2];
  if n=2 then
    Exit;
  ratio := ratio * ratio(a+2, n-1);
end;

begin
  garray[0,0] := 6; garray[0,1] := 12;
  garray[1,0] := 3; garray[1,1] := 10;
  garray[2,0] := 5; garray[2,1] := 8;
  writeln(ratio(@garray, n));
end.

0

Aslında 14 bayt

pXdX2@╪k`i/`Mπ

Çevrimiçi deneyin! (şu anda çalışmıyor çünkü TIO birkaç sürüm var)

Bu program girdi olarak düzleştirilmiş bir liste alır.

Açıklama:

pXdX2@╪k`i/`Mπ
pXdX            remove the first and last elements
    2@╪k        push a list where each element is a list containing every two elements of the original list (chunk into length-2 lists)
        `i/`M   map division over each sublist
             π  product

0

R, 64 bayt

forBu durumda vektörleştirilmiş yaklaşım ve döngü eşdeğerdir:

x=scan();prod(sapply(1:(sum(1|x)/2-1)*2,function(i)x[i]/x[i+1]))

veya fordöngü:

x=scan();for(i in 1:(sum(1|x)/2-1)*2)T=c(T,x[i]/x[i+1]);prod(T)}

'

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.