รถไฟเกียร์หมุน


16

Gears ถ่ายโอนความเร็วที่แตกต่างกันขึ้นอยู่กับขนาดของเฟืองตาข่าย

รถไฟเกียร์

แจ็คมีเครื่องจักรที่หมุน Gear Train แต่คุณไม่รู้ความเร็วของเกียร์สุดท้าย

โชคดีที่คุณเป็นนักกอล์ฟที่ยอดเยี่ยมดังนั้นคุณสามารถช่วยเขาได้!

ดังนั้นฉันควรทำอย่างไร

แต่ละเกียร์จะมีตัวเลข 2 ตัวรัศมีของเกียร์ภายในและรัศมีของเกียร์ด้านนอก

ถ้าเกียร์Aเป็น[a,b]เกียร์Bเป็น[c,d]แล้วอัตราส่วนระหว่างความเร็วของAและความเร็วของการจะเป็นBc:b

รับรายการของเกียร์ (รายการของ 2-tuples), ส่งออกความเร็วของเกียร์สุดท้าย

คุณสามารถสมมติความเร็วของเกียร์แรก1ได้

ทำงานออกมาเป็นตัวอย่าง

[[6,12],[3,10],[5,8]]สมมติว่าการป้อนข้อมูลของเราคือ

เกียร์แรกจะมีความเร็วของ[6,12]1

จากนั้นเกียร์ที่สองจะมีความเร็วของ[3,10]1*12/3 = 4

จากนั้นเกียร์ที่ผ่านมาจะมีความเร็วของ[5,8]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)

กฎระเบียบ

ใช้กฎพื้นฐานของ


6
เนื่องจากคุณยอมให้มีการส่งออกจุดลอยตัวคุณอาจจะต้องชี้แจงว่าผลลัพธ์ที่แม่นยำนั้นเป็นอย่างไร
Martin Ender

เราสามารถรับอินพุตเป็นรายการที่แบนแทนที่จะเป็นรายการของ tuples ได้หรือไม่?
Leun Nun

ใช่[6,12,3,10,5,8]แล้ว เพียงแค่พูดถึงถ้าคุณต้องการใช้

11
นั่นไม่ยุติธรรมเลย ฉันมีเวอร์ชัน 7 ไบต์อื่นที่ฉันไม่ได้โพสต์เพราะฉันคิดว่ามันน่าสนใจน้อยกว่า มันจะมีขนาด 6 ไบต์โดยไม่ทำให้แบนราบ โปรดพิจารณาใช้แซนด์บ็อกซ์ในครั้งต่อไปเพื่อหลีกเลี่ยงสถานการณ์เช่นนี้
Dennis

คำตอบ:


8

Haskell, 19 ไบต์

foldr1(/).tail.init

กำหนดรายชื่อแบนเช่น[a,b,c,d,e,f], tail.initเอาองค์ประกอบแรกและครั้งสุดท้ายแล้วfoldr1(/)สร้างน้ำตกของหน่วยงานb/(c/(d/e))))ที่ทำงานออกไปสลับ*และ:/b/c*d/e


แต่คำถามระบุว่าโปรแกรมได้รับรายการ 2 tuples ไม่ใช่รายการเรียบ
Display Name

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
อาสลับแผนก นั่นฉลาด
Dennis


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

ใช้อาร์เรย์และขนาด

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! :)
Martin Ender

จำนวนสูงสุดที่คุณสามารถรองรับคือเท่าใด ยินดีต้อนรับสู่ PPCG!
Leun Nun

j;float r=1;float f(int a[]){for(;j<sizeof a;)r=r*a[j++]/a[j++];return r;}(ไม่ผ่านการทดสอบ)
Leun Nun

ไม่ใช่ 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]

แก้ไข (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>'))

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

แน่นอนตัวแปรของสนามกอล์ฟนั้นแตกต่างกันเล็กน้อย ด้วย.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 จากนั้นวนลูปจากวินาทีเป็นทูเปิลสุดท้ายเพื่อคูณกับองค์ประกอบแรกของก่อนหน้านี้และหารผ่านองค์ประกอบที่สองของทูเปิลปัจจุบัน


ขอขอบคุณที่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 Bytes
JörgHülsermann

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

Pascal, 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;

Ungolfed ด้วยตัวอย่างการใช้งาน:

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 ไบต์

กลับกลายเป็นวิธีการ vectorized และ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.