Kereta Gigi, Memutar

16

Roda gigi mentransfer jumlah kecepatan yang berbeda, tergantung pada ukuran gigi yang disatukan.

kereta gigi

Jack memiliki mesin, yang memutar Gear Gear. tetapi Anda tidak tahu kecepatan gigi terakhir.

Untungnya, Anda adalah pegolf kode yang hebat, sehingga Anda dapat membantunya!

Jadi apa yang harus aku lakukan?

Setiap roda gigi diwakili oleh 2 angka, jari-jari roda gigi bagian dalam dan jari-jari roda gigi luar.

Jika gigi Aadalah [a,b]dan gigi Badalah [c,d], maka rasio antara kecepatan Adan kecepatan Bakan c:b.

Diberikan daftar roda gigi (daftar 2-tupel), output kecepatan gigi terakhir.

Anda dapat mengasumsikan kecepatan gigi pertama 1.

Contoh berhasil

Katakanlah input kita [[6,12],[3,10],[5,8]].

Gigi pertama [6,12],, akan memiliki kecepatan 1.

Kemudian, gigi kedua [3,10],, akan memiliki kecepatan 1*12/3 = 4.

Kemudian, gigi terakhir [5,8],, akan memiliki kecepatan 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)

Aturan

Aturan main berlaku.

bocor Nun
sumber
6
Karena Anda mengizinkan output floating point, Anda mungkin harus mengklarifikasi seberapa akurat hasil yang harus dicapai.
Martin Ender
Bisakah kita mengambil input sebagai daftar rata bukan daftar tupel?
Leaky Nun
Ya, seperti [6,12,3,10,5,8]. sebutkan saja jika Anda ingin menggunakannya.
11
Sedikit tidak adil. Saya memiliki versi 7-byte yang berbeda yang tidak saya posting karena saya menganggapnya kurang menarik. Itu akan menjadi 6 byte tanpa perataan. Harap pertimbangkan untuk menggunakan kotak pasir di waktu berikutnya untuk menghindari situasi seperti ini.
Dennis

Jawaban:

8

Haskell, 19 byte

foldr1(/).tail.init

Mengingat daftar datar seperti [a,b,c,d,e,f], tail.initmenghilangkan elemen pertama dan terakhir, dan kemudian foldr1(/)menciptakan riam divisi b/(c/(d/e))))yang bekerja untuk bolak-balik *dan /: b/c*d/e.

Tidak
sumber
tetapi pertanyaannya menyatakan bahwa program mendapatkan daftar 2-tupel, bukan daftar datar
Nama Tampilan
1
Daftar datar diizinkan di komentar.
xnor
7

Jelly , 6 byte

ḊṖU÷@/

Suite uji.

ḊṖ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.
bocor Nun
sumber
1
Ah, pembagian bergantian. Itu pintar.
Dennis
5

C, 115 123 121 83 80 76 71 70 byte

4 byte disimpan berkat @LeakyNun!

Golf pertamaku, mungkin bukan yang terbaik.

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

Mengambil array dan ukuran.

Tidak Terkumpul:

int counter;
float ret=1;
float gear(int *arr, int size) {
    for(; counter < size-2; )
        ret = ret * arr[++counter] / arr[++counter];
    return ret;
}
betseg
sumber
5
Selamat datang di PPCG! :)
Martin Ender
Berapa jumlah maksimum angka yang dapat Anda dukung? Selamat datang di PPCG!
Leaky Nun
j;float r=1;float f(int a[]){for(;j<sizeof a;)r=r*a[j++]/a[j++];return r;}(tidak diuji)
Leaky Nun
Bukan j ++, ++ j dan sizeof-2. 4 byte disimpan. Terima kasih!
betseg
Sepertinya kita tidak bisa mengukur ukuran array yang dilewati. Saya mengedit jawabannya.
betseg
4

JavaScript (ES6), 44 byte

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

37 byte untuk array yang diratakan:

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

Tidak seperti (misalnya) Haskell, reduceRightnama yang panjang sehingga lebih murah dengan reducecara yang salah dan mengambil kebalikan pada akhirnya.

Neil
sumber
jawaban yang diilhami di sana ... Saya tidak bisa lebih rendah dari itu ...
WallyWest
3

Pyth, 8 byte

.UcZb_Pt

Suite uji.

bocor Nun
sumber
3

J, 8 byte

%/@}:@}.

Cobalah online!

Pemakaian

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

>> f 1 1 2 2
<< 0.5

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

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

di mana >>STDIN dan <<STDOUT.

Penjelasan

"Reduce" secara Jdefault dari kanan ke kiri, yang melepas beberapa byte: p

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

f =: (divide reduce) atop (remove_last) atop (remove_first)
bocor Nun
sumber
3

Mathematica, 26 byte

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

Fungsi tanpa nama yang mengambil daftar nilai rata-rata dan mengembalikan hasil yang tepat (sebagai fraksi jika perlu).

Ini menggunakan pendekatan yang sama seperti beberapa jawaban lain dari divisi lipat di atas daftar terbalik (setelah menghapus elemen pertama dan terakhir).

Martin Ender
sumber
2

MATL , 9 byte

6L)9L&)/p

Format input adalah salah satunya:

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

EDIT (30 Juli 2016): kode tertaut menggantikan 9Ldengan 1Luntuk beradaptasi dengan perubahan terbaru dalam bahasa.

Cobalah online!

Penjelasan

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
sumber
1

JavaScript, 54 byte

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

Pemakaian

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

Tidak disatukan

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

Tentu saja, varian golfnya sedikit berbeda. Dengan .map(), itu menggantikan nilai pertama array dengan kecepatan setelah roda kedua, nilai kedua dengan kecepatan roda ketiga, dan nilai terakhir dan nilai terakhir kedua dengan kecepatan roda terakhir. Jadi, kita ambil saja elemen terakhir .pop().

LarsW
sumber
1

PHP, 80 79 69 byte

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

mengambil input dari parameter GET a; hasil cetak

menginisialisasi $rdengan 1, kemudian loop dari tuple kedua ke terakhir untuk mengalikan dengan elemen pertama sebelumnya dan membagi melalui elemen kedua dari tuple saat ini.


Terima kasih kepada Jörg karena mengingatkan saya pada $_GET; yang menyimpan 7 byte.


versi yang lebih elegan, 88 byte:

<?=array_reduce($a=$_GET[a],function($r,$x){return$r*$x[1]/$x[0];},$a[0][0]/end($a)[1]);
Titus
sumber
1
<?for($r=$i=1;$i<count($a=$_GET[a]);)$r*=$a[$i-1][1]/$a[$i++][0];echo$r;72 Bytes
Jörg Hülsermann
0

JavaScript, 59 58 56 byte

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

Penjelasan

Kurangi array dan kalikan dengan nilai setiap detik dan bagi dengan nilai pertama. Jadi untuk [[6,12],[3,10],[5,8]]itu 12/6*10/3*8/5. Tentu saja, perhitungan aktual yang kami inginkan adalah 12/3*10/5jadi kami hanya ingin mengabaikan itu pertama /6dan terakhir *8dengan mengalikan *6kembali dan membagi /8kembali. Pembatalan itu dilakukan dengan menetapkan 6/8sebagai nilai awal untuk pengurangan.

Davis
sumber
Saya datang ke solusi yang sama. Anda dapat menyimpan dua byte dengan menambahkan pasca operasi *.../...ke nilai awal 1.
Titus
0

Python 2, 52 byte

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

Fungsi anonim yang mengambil input dari daftar yang diratakan melalui argumen dan mengembalikan output.

Ini memanfaatkan gagasan pembagian kaskade, seperti dalam jawaban xnor .

Cobalah di Ideone

TheBikingViking
sumber
0

Python 3, 59 byte

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

Fungsi anonim yang mengambil input dari daftar yang tidak rata melalui argumen dan mengembalikan output.

Bagaimana itu bekerja

Untuk setiap pasangan bilangan bulat di input, string formulir 'int1*int2'dibuat. Bergabung dengan semua pasangan ini pada /memberikan string bentuk 'int1*int2/int3*int4/...', yang merupakan perhitungan yang diinginkan, tetapi termasuk bilangan bulat pertama dan terakhir yang tidak diinginkan. Ini dihapus dengan memotong dua karakter pertama dan terakhir dua dalam sengatan, meninggalkan perhitungan yang diinginkan. Ini kemudian dievaluasi dan dikembalikan.

Cobalah di Ideone

TheBikingViking
sumber
0

Pascal, 88 byte

Fungsi rekursif (harus melakukannya ..) yang mengambil array 2D statis dan panjangnya (no. Of rows) sebagai input. Menggunakan beberapa pointer matematika pada array.

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;

Tidak digabungkan dengan contoh penggunaan:

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
sumber
0

Sebenarnya, 14 byte

pXdX2@╪k`i/`Mπ

Cobalah online! (saat ini tidak berfungsi karena TIO adalah beberapa versi di belakang)

Program ini mengambil daftar yang diratakan sebagai input.

Penjelasan:

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
sumber
0

R, 64 byte

Ternyata pendekatan vektor dan forloop setara dalam hal ini:

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

atau forloop:

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

`

Billywob
sumber