การคูณตามลำดับ


12

วัตถุประสงค์ของคุณคือการเขียนโปรแกรมที่รับอินพุตและเมื่อถูกล่ามโซ่ไว้ด้วยกันNเวลาจะทำการ "การคูณตามลำดับ" การคูณตามลำดับคืออะไรคุณอาจถาม มันเป็นลำดับที่มีเมล็ดaกำหนดดังนี้:

f(0) = a
f(n+1) = f(n)*(f(n)-1)

a = 5ดังนั้นขอ ดังนั้นf(0) = 5, และf(1) = f(0)*(f(0)-1) = 5*4 = 20f(2) = f(1)*(f(1)-1) = 20*19 = 380

ถ้าโปรแกรมของคุณเป็นABCแล้วABCควรจะใช้การป้อนข้อมูลและการส่งออกa f(1)โปรแกรมABCABCควรส่งออกf(2)เป็นต้นชุดโปรแกรมของคุณควรรับข้อมูลหนึ่งครั้งและส่งออกครั้งเดียวเท่านั้น

นี่คือรหัสกอล์ฟดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ ช่องโหว่มาตรฐานถูกแบน

คำตอบ:


13

เยลลี่ 3 ไบต์

×’$

ลองออนไลน์!

มันทำงานอย่างไร

×’$    Main link (or part thereof). Argument (initially input): n

 ’     Compute n - 1.
×      Multiply n by (n - 1).
  $    Combine the previous two atoms into a monadic quicklink.

การทำซ้ำข้อมูลnครั้งจะดำเนินการเป็นnครั้งทำให้ได้ผลลัพธ์ที่ต้องการ


4

อย่างจริงจัง 4 ไบต์

,;D*

คำอธิบาย:

,;D*
,     push input (NOP once input is exhausted)
 ;D   dupe and push n-1
   *  multiply
      (implicit output at EOF)

เช่นเดียวกับคำตอบใน Jellyของเดนนิสการทำซ้ำโปรแกรมนี้nจะส่งผลให้ทำงานnได้ นั่นเป็นหนึ่งในข้อได้เปรียบมากมายของภาษาสแตกฐานที่จำเป็น

ลองออนไลน์!


4

MATL, 3 ไบต์

tq*

คุณสามารถลองออนไลน์ได้! คล้ายกับคำตอบที่จริงจังและเจลลี่ ขั้นแรกให้ทำซ้ำด้านบนของสแต็ก (อินพุตของรับในครั้งแรกเมื่อสแต็กว่างเปล่า) ลดส่วนบนสุดของสแต็กและคูณสององค์ประกอบเพื่อให้อินพุตหรือผลลัพธ์ถัดไป


4

Python 3, 56 ไบต์

+1if 0else 0
try:n
except:n=int(input())
n*=n-1
print(n)

แค่ต้องการโซลูชันที่ไม่มีเล่ห์เหลี่ยมเอาท์พุทเขียนทับ การขาดการขึ้นบรรทัดใหม่เป็นสิ่งสำคัญ


บรรทัดแรกคือ 1 หมายเลขทั้งหมดหรือไม่
Seadrus

@Seadrus ไม่มีไวยากรณ์เน้นไม่ได้ตรงกับตัวแยกวิเคราะห์งูใหญ่ที่จะหยุดการแยกตัวเลขเมื่อมันฮิตและif else
xnor


@ mbomb007 ไม่ได้ผลการพิมพ์ไม่ได้รับการจัดการที่เหมาะสมและคุณจะได้รับผลลัพธ์เพิ่มเติมเมื่อคุณต่อกันอย่างน้อยหนึ่งครั้ง
FryAmTheEggman

อานั่นคือสิ่งที่ผลผลิตพิเศษคือ
mbomb007

3

CJam, 5 ไบต์

r~_(*

ลองออนไลน์!

มันทำงานอย่างไร

r     e# Read a whitespace-separated token from STDIN.
      e# This pushes the input (when called for the first time) or an empty string.
 ~    e# Evaluate.
      e# This turns the input into an integer or discards an empty string.
  _   e# Copy the top of the stack.
   (  e# Decrement.
    * e# Multiply.



2

GolfScript 5 ไบต์

~.(*`

ลองออนไลน์

ยกเลิกการตีกอล์ฟและแสดงความคิดเห็น:

~    # Eval the input to turn it from a string into a number.
.    # Duplicate the number.
(    # Decrement one of the copies by one.
*    # Multiply the copies together.
`    # Un-eval the number, turning it back into a string.

ตัวแปล GolfScript จะอ่านอินพุตโดยอัตโนมัติและวางลงบนสแต็ก แต่เป็นสตริงไม่ใช่ตัวเลข ดังนั้นเราจึงจำเป็นต้องเปิดการป้อนข้อมูลลงในจำนวนที่มี~และ stringify `อีกครั้งหลังจากนั้น ในตอนท้ายล่ามจะพิมพ์หมายเลขที่เป็นสตริงในสแต็คโดยอัตโนมัติ

(ตอนนี้ถ้าความท้าทายที่ได้รับการสำทับf(n+1) = f(n)*(-f(n)-1)ฉันจะได้ทำว่าใน 4 ไบต์ด้วย~.~*. หาวิธีการและเหตุผลที่ผลงานเป็นซ้ายเป็นออกกำลังกาย. :)


2

REPL JavaScript, 25 20 ไบต์

a=prompt();
a*=a-1//

จะทำงานในการกำจัด REPL


สิ่งนี้สร้างผลผลิตได้อย่างไร
เดนนิส

ในส่วนของคอนโซล ฉันต้องการแก้ไขมัน
Conor O'Brien

ไม่มีคอนโซลไม่เป็นไรฉันถือว่าเอาต์พุตที่ถูกต้องสำหรับ js
Seadrus

Oh! ที่ยอดเยี่ยม !!
Conor O'Brien

2
@Seadrus เห็นได้ชัดว่าฉันคิดว่ามันเป็นสิ่งที่สอดคล้องกับเมตาดาต้าฉันทามติ (ซึ่งฉันไม่ได้ตระหนักว่าเป็นสิ่งที่) สภาพแวดล้อมที่ใช้ REPL ตราบใดที่มันระบุว่ามันเป็น REPL
Alex A.

2

Lua, 35 18 ไบต์

มันเป็นสิ่งที่ Lua สามารถทำได้ง่ายๆเพียงแค่ครั้งเดียว!

แก้ไข: ฉันค้นพบสิ่งต่างๆมากมายใน Lua ตั้งแต่ฉันทำสิ่งนี้ดังนั้นฉันจึงอัปเดต :)

print(...*(...-1))

...มีอาร์กิวเมนต์บรรทัดคำสั่งแตก, n*(n-1)อินไลน์จะใช้มันเป็นค่าแรกในกรณีนี้มันจะไม่ได้รับอนุญาตให้ใช้จ่ายส่งผลให้ในเวลาเพียงพิมพ์


1

Y , 7 ไบต์

jzC:t*!

ลองที่นี่!

นี่คือวิธีการทำงาน: jรับอินพุตเป็นตัวเลข zเปิดใช้งานการพิมพ์โดยนัย Cเริ่มลิงค์ใหม่ :ทำซ้ำค่าในสแต็กและtลดค่ามันทิ้งเรา[a a-1]ไว้ จากนั้นเราจะได้รับจาก[a*a-a] ข้ามคำสั่งถัดไป บน EOF มันไม่ทำอะไรเลย เมื่อถูกโยงเข้าด้วยกันมันข้ามคำสั่งอินพุตและกระบวนการเริ่มต้นอีกครั้ง*!



1

𝔼𝕊𝕄𝕚𝕟, 5 ตัวอักษร / 7 ไบต์

ïׇï;

Try it here (Firefox only).

ฉันต้องอธิบายเรื่องนี้จริงๆเหรอ? โอ้ดีไปเลย ...

คำอธิบาย

โดยทั่วไปจะประเมินเป็นinput*=--input;ใน JS


1

Perl, 23 ไบต์

l;$_|=<>;$_*=~-$_;print

รุ่นสำรอง 10 ไบต์

$_*=~-$_;

สิ่งนี้ต้องใช้-pสวิตช์ ฉันไม่แน่ใจว่ามันเป็นเกมที่ยุติธรรมในคำถามหรือไม่


1

Haskell, 14 11 ไบต์

(*)=<<pred$

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

Prelude> (*)=<<pred$5
20
Prelude> (*)=<<pred$(*)=<<pred$5
380
Prelude> (*)=<<pred$(*)=<<pred$(*)=<<pred$5
144020

บางทีนี่อาจไม่ใช่ฟังก์ชั่นที่เหมาะสม หากคุณ nitpicking คุณสามารถไปด้วย(*)=<<pred$id(<- มีช่องว่างในตอนท้าย) สำหรับ 14 ไบต์

แก้ไข: @Zgarb เขียนฟังก์ชันใหม่โดยใช้ฟังก์ชัน monad และบันทึกไว้ 3 ไบต์ ขอบคุณ!


(*)=<<pred$บันทึก 3 ไบต์ นอกจากนี้ควรสังเกตว่านี่ไม่ได้กำหนดฟังก์ชั่นจริง ๆ และค่าอินพุตจะต้องอยู่ตรงหลัง
Zgarb

@Zgarb: ขอบคุณ! การเพิ่มidทำให้มันเป็นฟังก์ชั่นที่เหมาะสม ฉันใส่บันทึกในคำตอบของฉัน
nimi


1

TI-Basic, 6 5 ไบต์

ทำงานกับเครื่องคิดเลข TI-83/84

:Ans²-Ans

โปรแกรมนี้ทำงานเนื่องจากความจริงที่ว่าการแสดงออกในบรรทัดสุดท้ายของโปรแกรมจะถูกพิมพ์แทนDoneข้อความปกติ


1
5 ไบต์::Ans²-Ans
lirtosiast

1

Mathcad, 39 "ไบต์"

ป้อนคำอธิบายรูปภาพที่นี่

จากมุมมองของผู้ใช้ Mathcad เป็นไวท์บอร์ด 2D ที่มีประสิทธิภาพโดยมีนิพจน์ที่ประเมินจากซ้ายไปขวาบนลงล่าง Mathcad ไม่รองรับอินพุต "text" ทั่วไป แต่ใช้การผสมผสานระหว่างข้อความและคีย์ / แถบเครื่องมือ / รายการเมนูพิเศษเพื่อแทรกนิพจน์ข้อความพล็อตหรือส่วนประกอบ ตัวอย่างเช่นพิมพ์ ":" เพื่อป้อนตัวดำเนินการคำจำกัดความ (แสดงบนหน้าจอเป็น ": ="), "[" เพื่อป้อนดัชนีอาร์เรย์หรือ "ctl-]" เพื่อป้อนตัวดำเนินการลูป (รวมตัวยึดสำหรับ เงื่อนไขการควบคุมและการแสดงออกของร่างกายหนึ่ง) สิ่งที่คุณเห็นในภาพด้านบนคือสิ่งที่ปรากฏบนส่วนติดต่อผู้ใช้และเป็น "พิมพ์" ใน

เพื่อวัตถุประสงค์ในการเล่นกอล์ฟการนับ "ไบต์" คือจำนวนการใช้แป้นพิมพ์ที่เทียบเท่ากับการป้อนนิพจน์

สิ่งหนึ่งที่ฉันไม่ค่อยแน่ใจเกี่ยวกับ (จากมุมมองที่เทียบเท่า "ไบต์") คือวิธีนับการสร้างพื้นที่ใหม่ (เช่น a: = 5 หรือ k: = 0..n-1) ฉันได้กำหนดให้แต่ละการย้ายไปยังพื้นที่ใหม่ว่าเท่ากับ newline และด้วยเหตุนี้ 1 ไบต์ (ในทางปฏิบัติฉันใช้เมาส์เพื่อคลิกที่ที่ฉันต้องการภูมิภาค)

ฉันได้รวมเฉพาะข้อความสั่งที่ใช้งานอยู่ไม่ใช่ความคิดเห็นและฉันได้รวม 2 ไบต์แต่ละรายการสำหรับอินพุต a และ n แต่ไม่ใช่ค่าตัวเอง (ตัวอย่าง 5 และ 7)


0

Haskell, 72 ไบต์

ความท้าทายนี้ไม่เป็นมิตรกับ Haskell .. อย่างไรก็ตามงานต่อไปนี้หากอินพุตไม่เป็นเอกภาพและมีการใช้งานรหัสใน GHCI:

(\x->if odd x then let y=until((>x).(10^))(+1)0 in y*(y-1)else x*(x-1))$

คำอธิบาย:

เอกทะเบียนเป็นเลขคี่เสมอดังนั้นแอปพลิเคชั่นแรกจะแปลงเป็นทศนิยม x*(x-1)แม้จะเป็นเช่นนั้นเสมอมิฉะนั้นจะส่งคืนx*(x-1)โดยที่xอินพุตอยู่ที่ไหน เนื่องจาก Haskell ถูกพิมพ์อย่างรุนแรงและสัญลักษณ์ 'พิเศษ' ไม่สามารถเรียกได้ว่าเป็นเช่น&1นั้นฉันเชื่อว่านี่เป็นวิธีเดียวที่จะทำสิ่งนี้ให้สมบูรณ์ใน Haskell เว้นแต่ว่าจะมีตัวแปรที่ใช้ทั่วโลกหรือรูปแบบอินพุตอื่น ๆ


0

C ++ (gcc) , 173/176 ไบต์

ทั้งสองรุ่นมีการขึ้นบรรทัดใหม่ที่สำคัญในตอนท้าย

รุ่นมาโคร 173 ไบต์

#ifndef M
#define M(a,b)a##b
#define W(z,x)M(z,x)
#define B int W(m,__LINE__)=x++
#include<iostream>
int x,n;int main(){for(std::cin>>n;x--;)n*=n-1;std::cout<<n;}
#endif
B;

ลองออนไลน์!

เทมเพลตเวอร์ชัน 176 ไบต์

ค่อนข้างมาก C ++ ish:

#ifndef B
#define B template
#include<iostream>
int x,n;B<int N>struct A{static int i;};int main(){for(std::cin>>n;x--;)n*=n-1;std::cout<<n;}
#endif
B<>int A<__LINE__>::i=x++;

ลองออนไลน์!


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.