Przekładnia, obracanie

16

Koła zębate przenoszą różne prędkości w zależności od wielkości zazębionego przekładni.

przekładnia zębata

Jack ma maszynę, która obraca przekładnię zębatą. ale nie znasz prędkości ostatniego biegu.

Na szczęście jesteś świetnym golfistą, więc możesz mu pomóc!

Więc co powinienem zrobić?

Każdy bieg jest reprezentowany przez 2 liczby, promień wewnętrznego koła zębatego i promień zewnętrznych kół zębatych.

Jeśli bieg Ajest, [a,b]a bieg Bjest [c,d], wówczas stosunek między prędkością Ai prędkością Bbędzie c:b.

Biorąc pod uwagę listę biegów (listę 2-krotek), wypisz prędkość ostatniego biegu.

Możesz założyć, że prędkość pierwszego biegu jest 1.

Opracowany przykład

Powiedzmy, że nasz wkład to [[6,12],[3,10],[5,8]].

Pierwszy bieg [6,12]miałby prędkość 1.

Wtedy drugi bieg [3,10]miałby prędkość 1*12/3 = 4.

Wtedy ostatni bieg [5,8]miałby prędkość 4*10/5 = 8.

Przypadki testowe

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)

Zasady

Obowiązują podstawowe zasady .

Leaky Nun
źródło
6
Ponieważ zezwalasz na dane wyjściowe zmiennoprzecinkowe, prawdopodobnie powinieneś wyjaśnić, jak dokładne muszą być wyniki.
Martin Ender
Czy możemy przyjmować dane wejściowe jako spłaszczoną listę zamiast listy krotek?
Leaky Nun
Tak, jak [6,12,3,10,5,8]. po prostu wspomnij o tym, jeśli chcesz go użyć.
11
To trochę niesprawiedliwe. Miałem inną 7-bajtową wersję, której nie opublikowałem, ponieważ uważałem ją za mniej interesującą. Byłoby to 6 bajtów bez spłaszczenia. Następnym razem rozważ użycie piaskownicy, aby uniknąć tego rodzaju sytuacji.
Dennis

Odpowiedzi:

8

Haskell, 19 bajtów

foldr1(/).tail.init

Biorąc pod uwagę listę płaski jak [a,b,c,d,e,f], tail.initusuwa pierwsze i ostatnie elementy, a następnie foldr1(/)tworzy kaskadę podziałów b/(c/(d/e)))), która działa się na przemian *i /: b/c*d/e.

xnor
źródło
ale pytanie mówi, że programy otrzymują listę 2-krotek, a nie płaską listę
Nazwa wyświetlana
1
W komentarzach dozwolona była płaska lista.
xnor
7

Galaretka , 6 bajtów

ḊṖU÷@/

Zestaw testowy.

ḊṖ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.
Leaky Nun
źródło
1
Ach, naprzemienny podział. To sprytne.
Dennis
5

C, 115 123 121 83 80 76 71 70 bajtów

4 bajty zapisane dzięki @LeakyNun!

Mój pierwszy golf, prawdopodobnie nie najlepszy.

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

Pobiera tablicę i rozmiar.

Nie golfowany:

int counter;
float ret=1;
float gear(int *arr, int size) {
    for(; counter < size-2; )
        ret = ret * arr[++counter] / arr[++counter];
    return ret;
}
betseg
źródło
5
Witamy w PPCG! :)
Martin Ender
Jaka jest maksymalna liczba obsługiwanych numerów? Witamy w PPCG!
Leaky Nun
j;float r=1;float f(int a[]){for(;j<sizeof a;)r=r*a[j++]/a[j++];return r;}(nie testowano)
Leaky Nun
Nie j ++, ++ j i sizeof-2. 4 bajty zapisane. Dzięki!
betseg
Wygląda na to, że nie możemy zmierzyć wielkości przekazywanych tablic. Zredagowałem odpowiedź.
betseg
4

JavaScript (ES6), 44 bajty

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

37 bajtów dla spłaszczonej tablicy:

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

W przeciwieństwie do (np.) Haskell, reduceRightjest tak długą nazwą, że jest tańsza reducew niewłaściwy sposób i bierze odwrotność na końcu.

Neil
źródło
natchniona odpowiedź tam ... Nie mogłem
zejść
3

J, 8 bajtów

%/@}:@}.

Wypróbuj online!

Stosowanie

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

>> f 1 1 2 2
<< 0.5

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

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

gdzie >>jest STDIN i <<STDOUT.

Wyjaśnienie

„Zmniejsz” Jdomyślnie od prawej do lewej, co spowodowało usunięcie kilku bajtów: p

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

f =: (divide reduce) atop (remove_last) atop (remove_first)
Leaky Nun
źródło
3

Mathematica, 26 bajtów

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

Nienazwana funkcja, która pobiera płaską listę wartości parzystych i zwraca dokładny wynik (w razie potrzeby jako ułamek).

Wykorzystuje to to samo podejście, co niektóre inne odpowiedzi składania podziału na odwróconej liście (po usunięciu pierwszego i ostatniego elementu).

Martin Ender
źródło
2

MATL , 9 bajtów

6L)9L&)/p

Format wejściowy jest dowolny z następujących:

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

EDYCJA (30 lipca 2016 r.): Połączony kod zastępuje 9Lsię, 1Laby dostosować się do ostatnich zmian w języku.

Wypróbuj online!

Wyjaśnienie

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
Luis Mendo
źródło
1

JavaScript, 54 bajty

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

Stosowanie

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>'))

Nie golfił

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
    }
  }
}

Oczywiście wariant z golfem jest nieco inny. Dzięki .map(), zastępuje pierwszą wartość tablicy z prędkością po drugim kole, druga wartość z prędkością trzecim kole, a ostatnią wartością a drugi ostatniej wartości z prędkością ostatnim kole. Więc bierzemy ostatni element z .pop().

LarsW
źródło
1

PHP, 80 79 69 bajtów

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

pobiera dane wejściowe z parametru GET a; drukuje wynik

inicjuje się $rz 1, następnie pętle od drugiej do ostatniej krotki, aby pomnożyć przez pierwszy element poprzedniego i podzielić przez drugi element bieżącej krotki.


Dzięki Jörgowi za przypomnienie $_GET; co pozwoliło zaoszczędzić 7 bajtów.


bardziej elegancka wersja, 88 bajtów:

<?=array_reduce($a=$_GET[a],function($r,$x){return$r*$x[1]/$x[0];},$a[0][0]/end($a)[1]);
Tytus
źródło
1
<?for($r=$i=1;$i<count($a=$_GET[a]);)$r*=$a[$i-1][1]/$a[$i++][0];echo$r;72 bajtów
Jörg Hülsermann
0

JavaScript, 59 58 56 bajtów

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

Wyjaśnienie

Zmniejsz tablicę i pomnóż ją przez każdą drugą wartość i podziel przez każdą pierwszą wartość. Tak [[6,12],[3,10],[5,8]]się dzieje 12/6*10/3*8/5. Oczywiście, faktyczne obliczenia, których chcieliśmy, były 12/3*10/5takie, że chcemy po prostu zignorować to pierwsze /6i ostatnie *8, mnożąc z *6powrotem i dzieląc z /8powrotem. Anulowanie odbywa się poprzez ustawienie 6/8jako wartości początkowej redukcji.

Davis
źródło
Doszedłem do tego samego rozwiązania. Możesz zapisać dwa bajty, dodając operacje po operacji *.../...do wartości początkowej 1.
Tytus
0

Python 2, 52 bajty

lambda x:reduce(lambda x,y:y/float(x),x[1:-1][::-1])

Anonimowa funkcja, która pobiera dane spłaszczonej listy za pomocą argumentu i zwraca dane wyjściowe.

Wykorzystuje to pomysł kaskady podziału, jak w odpowiedzi Xnora .

Wypróbuj na Ideone

TheBikingViking
źródło
0

Python 3, 59 bajtów

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

Anonimowa funkcja, która pobiera dane z nie spłaszczonej listy za pomocą argumentu i zwraca dane wyjściowe.

Jak to działa

Dla każdej pary liczb całkowitych na wejściu 'int1*int2'tworzony jest ciąg formularza . Połączenie wszystkich tych par /daje ciąg formy'int1*int2/int3*int4/...' , który jest pożądanym obliczeniem, ale obejmuje niepożądane pierwsze i ostatnie liczby całkowite. Są one usuwane przez wycięcie pierwszych dwóch i ostatnich dwóch znaków w żądle, pozostawiając pożądane obliczenia. Jest to następnie oceniane i zwracane.

Wypróbuj na Ideone

TheBikingViking
źródło
0

Pascal, 88 bajtów

Funkcja rekurencyjna (musiała to zrobić ...), która przyjmuje statyczną tablicę 2D i jej długość (liczbę wierszy) jako dane wejściowe. Korzystanie z matematyki wskaźnika na tablicy.

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;

Przykład użycia bez golfa:

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.
hdrz
źródło
0

Właściwie 14 bajtów

pXdX2@╪k`i/`Mπ

Wypróbuj online! (obecnie nie działa, ponieważ TIO ma kilka wersji za sobą)

Ten program pobiera spłaszczoną listę jako dane wejściowe.

Wyjaśnienie:

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
Mego
źródło
0

R, 64 bajty

Okazuje się, że podejście wektoryzowane i forpętla są równoważne w tym przypadku:

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

lub forpętla:

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

`

Billywob
źródło