Шестірня, обертовий


16

Шестірні передають різну кількість швидкостей, залежно від розміру сітчастої передачі.

зубчастий потяг

У Джека є машина, яка обертає шестерню. але ти не знаєш швидкості останньої передачі.

На щастя, ви чудовий гольфіст з кодом, тому можете допомогти йому!

Отже, що мені робити?

Кожна передача представлена ​​2 числами, радіусом внутрішньої передачі та радіусом зовнішніх передач.

Якщо передача Aє, [a,b]а передача Bє [c,d], то співвідношення між швидкістю Aта швидкістю Bбуде c:b.

Дано список передач (список 2-кортежів), виведіть швидкість останньої передачі.

Можна припустити, що швидкість першої передачі є 1.

Опрацьований приклад

Скажімо, наш внесок є [[6,12],[3,10],[5,8]].

Перша передача, [6,12]мала б швидкість 1.

Тоді, друга передача [3,10], мала б швидкість 1*12/3 = 4.

Тоді, остання передача [5,8], мала б швидкість 4*10/5 = 8.

Тестові шафи

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)

Правила

Діють основні правила .


6
Оскільки ви дозволяєте виводити плаваючу крапку, вам, мабуть, слід уточнити, наскільки точними повинні бути результати.
Мартін Ендер

Чи можемо ми взяти вклад як сплющений список замість списку кортежів?
Leaky Nun

Так, як [6,12,3,10,5,8]. просто згадайте його, якщо ви хочете ним скористатися.

11
Це несправедливо. У мене була інша 7-байтна версія, яку я не публікував, бо вважав її менш цікавою. Це було б 6 байтів без вирівнювання. Будь-ласка, подумайте про використання пісочниці наступного разу, щоб уникнути подібної ситуації.
Денніс

Відповіді:


8

Хаскелл, 19 байт

foldr1(/).tail.init

З огляду на плоский список , як [a,b,c,d,e,f], tail.initвидаляє перші і останні елементи, а потім foldr1(/)створює каскад розділень , b/(c/(d/e))))який працює, щоб чергуються *і /: b/c*d/e.


але питання вказує, що програми отримують список з 2-х кортежів, а не плоский список
Відображати ім'я

1
У коментарях було дозволено плоский список.
xnor



5

C, 115 123 121 83 80 76 71 70 байт

4 байти збережено завдяки @LeakyNun!

Мій перший гольф, напевно, не найкращий.

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

Займає масив та розмір.

Безголівки:

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! :)
Мартін Ендер

Яку максимальну кількість номерів ви можете підтримувати? Ласкаво просимо до PPCG!
Leaky Nun

j;float r=1;float f(int a[]){for(;j<sizeof a;)r=r*a[j++]/a[j++];return r;}(не перевірено)
Leaky Nun

Не j ++, ++ j і розмір-2. Збережено 4 байти. Спасибі!
betseg

Здається, ми не можемо виміряти розмір переданих масивів. Я відредагував відповідь.
betseg

4

JavaScript (ES6), 44 байти

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

37 байт для сплющеного масиву:

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

На відміну від (наприклад, Haskell), reduceRightце така довга назва, що дешевше reduceнеправильно і прийняти зворотну в кінці.


натхненна відповідь там ... Я не міг би піти нижче від цього ...
WallyWest


3

J, 8 байт

%/@}:@}.

Спробуйте в Інтернеті!

Використання

>> 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 і <<STDOUT.

Пояснення

"Зменшити" за Jзамовчуванням справа наліво, яка зняла кілька байтів: p

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

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

3

Математика, 26 байт

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

Безіменна функція, яка приймає плоский список значень рівної довжини і повертає точний результат (у разі необхідності дробу).

Для цього використовується той самий підхід, що і деякі інші відповіді складання поділу на перевернутий список (після вилучення першого та останнього елемента).


2

MATL , 9 байт

6L)9L&)/p

Формат вводу є будь-яким із цих:

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

EDIT (30 липня 2016 р.): Пов'язаний код замінюється 9Lна, 1Lщоб адаптуватись до останніх змін у мові.

Спробуйте в Інтернеті!

Пояснення

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 байти

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

Використання

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

Безумовно

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

Звичайно, варіант для гольфу трохи інший. З .map(), він замінює перше значення масиву на швидкість після другого колеса, друге значення зі швидкістю третього колеса, а останнє значення і друге останнє значення на швидкість останнього колеса. Отже, ми просто беремо останній елемент .pop().


1

PHP, 80 79 69 байт

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

приймає вхід з параметра GET a; результат друку

ініціалізується $rз 1, а потім петлі від другого до останнього кортежу, щоб помножити з першим елементом попереднього і розділити через другий елемент поточного кортежу.


Дякую Йоргу за те, що він нагадав мені $_GET; що зберегло 7 байт.


більш елегантна версія, 88 байт:

<?=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 байт
Йорг Гюльсерманн

0

JavaScript, 59 58 56 байт

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

Пояснення

Зменшіть масив і помножте на кожне друге значення і розділіть на кожне перше значення. Так [[6,12],[3,10],[5,8]]це і робить 12/6*10/3*8/5. Звичайно, власне обчислення, яких ми хотіли, було, 12/3*10/5тому ми просто хочемо ігнорувати це перше /6і останнє *8шляхом множення *6назад і ділення /8назад. Це скасування відбувається шляхом встановлення 6/8початкового значення для зменшення.


Я прийшов до того ж рішення. Ви можете зберегти два байти, додавши після операцій *.../...до початкового значення 1.
Тит

0

Python 2, 52 байти

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

Анонімна функція, яка приймає введення згладженого списку через аргумент і повертає результат.

Для цього використовується ідея каскаду поділу, як у відповіді xnor .

Спробуйте це на Ideone


0

Python 3, 59 байт

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

Анонімна функція, яка приймає введення неплохого списку через аргумент і повертає результат.

Як це працює

Для кожної пари цілих чисел у введенні створюється рядок форми 'int1*int2'. Приєднання всіх цих пар /надає рядок форми'int1*int2/int3*int4/...' , що є бажаним обчисленням, але включає небажане перше і останнє цілі числа. Вони видаляються шляхом вирізання перших двох та останніх двох символів у жазі, залишаючи потрібний розрахунок. Потім це оцінюється і повертається.

Спробуйте це на Ideone


0

Паскаль, 88 байт

Рекурсивна (повинна була це зробити ..) функція, яка приймає статичний 2D масив та його довжину (без рядків) як вхід. Використання деякої математики вказівника на масиві.

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;

Недоладжений з прикладом використання:

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

Власне, 14 байт

pXdX2@╪k`i/`Mπ

Спробуйте в Інтернеті! (наразі не працює, оскільки TIO відстає на кілька версій)

Ця програма приймає сплощений список як вхід.

Пояснення:

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 байти

Виходить векторизований підхід і forцикл в цьому випадку рівноцінні:

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

або forцикл:

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

`

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.