ギアトレイン、回転


16

ギアは、噛み合ったギアのサイズに応じて、異なる量の速度を転送します。

ギア駆動

ジャックにはギアトレインを回転させる機械があります。しかし、最後のギアの速度はわかりません。

幸いなことに、あなたは素晴らしいコードゴルファーなので、彼を助けることができます!

だから、私は何をすべきですか?

各ギアは、内側ギアの半径と外側ギアの半径の2つの数字で表されます。

ギアA[a,b]でギアBがの場合[c,d]、の速度Aとの速度の比はにBなりますc:b

ギアのリスト(2タプルのリスト)を指定して、最後のギアの速度を出力します。

最初のギアの速度はであると仮定でき1ます。

完成した例

入力がであるとしましょう[[6,12],[3,10],[5,8]]

最初のギア[6,12]の速度はになり1ます。

次に、2番目のギア[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
浮動小数点出力を許可しているので、おそらく正確な結果が必要であることを明確にする必要があります。
マーティンエンダー

タプルのリストではなく、フラット化されたリストとして入力を取得できますか?
漏れの修道女

はい、好き[6,12,3,10,5,8]です。あなたがそれを使いたいなら、それを言ってください。

11
それはちょっと不公平です。あまり面白くないと思ったので、投稿しなかった別の7バイトバージョンがありました。平坦化せずに6バイトでした。このような状況を避けるために、次回サンドボックスの使用を検討してください。
デニス

回答:


8

Haskell、19バイト

foldr1(/).tail.init

以下のようなフラットなリストを考えると[a,b,c,d,e,f]tail.init最初と最後の要素を削除し、その後、foldr1(/)各部門のカスケード作成b/(c/(d/e))))交互にうまくいく*/b/c*d/e


しかし、プログラムその質問の状態は、2つのタプルではなく、フラットなリストのリストを取得します
表示名

1
コメントにはフラットリストが許可されていました。
-xnor

7

ゼリー、6 バイト

ḊṖU÷@/

テストスイート。

ḊṖ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
ああ、分割を交互に。それは賢いです。
デニス


5

C、115 123 121 83 80 76 71 70バイト

@LeakyNunのおかげで4バイト節約されました!

私の最初のゴルフは、おそらく最高ではありません。

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へようこそ!
リーキー修道女

j;float r=1;float f(int a[]){for(;j<sizeof a;)r=r*a[j++]/a[j++];return r;}(テストなし)
リーキー修道女

j ++、++ j、sizeof-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

Mathematica、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]

編集(2016年7月30日):言語の最近の変更に適応するために、リンクされたコードが置き換え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。結果を印刷する

$r1で初期化し、2番目から最後のタプルまでループして、previousの最初の要素と乗算し、現在のタプルの2番目の要素で除算します。


思い出してくれたJörgに感謝し$_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])

説明

配列を減らし、2番目の値ごとに乗算し、最初の値ごとに除算します。だから[[6,12],[3,10],[5,8]]それは12/6*10/3*8/5。もちろん、私たちが望んだ実際の計算は12/3*10/5そうでしたので、最初に乗算し/6、最後*8に乗算*6して除算することで、最初と最後を無視したいだけです/8。そのキャンセルは6/8、reduceの初期値として設定することによって行われます。


私は同じ解決策を見つけました。*.../...初期値に事後操作を追加することにより、2バイトを節約できます1
タイタス


0

Python 3、59バイト

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

引数を介して平坦化されていないリストの入力を受け取り、出力を返す匿名関数。

使い方

入力内の整数のペアごとに、フォームの文字列'int1*int2'が作成されます。これらすべてのペアを結合する/と、次の形式の文字列が得られます'int1*int2/int3*int4/...'。これは、望ましい計算ですが、望ましくない最初と最後の整数を含みます。これらは、スティングの最初の2文字と最後の2文字をスライスすることで削除され、目的の計算が残ります。これは評価されて返されます。

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

`

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.