顺序乘法


12

您的目标是编写一个接受输入的程序,并在将其链接在一起时N执行“顺序乘法”。您可能会问,什么是顺序乘法?这是一个序列,其种子a定义如下:

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

因此,让a = 5。因此,f(0) = 5f(1) = f(0)*(f(0)-1) = 5*4 = 20,和f(2) = f(1)*(f(1)-1) = 20*19 = 380

如果您的程序是ABC,则ABC应该接受输入a和输出f(1)。程序ABCABC应该输出f(2),等等。您的程序系列应该只输入一次,只输出一次。

这是一个代码高尔夫球,因此以字节为单位的最短程序获胜。禁止出现标准漏洞。

Answers:


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)

就像Dennis的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)

只是想要一个没有输出覆盖技巧的解决方案。缺少结尾的换行符很重要。


那第一行全是一个数字吗?
Seadrus '16

@Seadrus不,语法荧光笔与Python解析器不匹配,Python解析器在碰到if和时停止解析数字else
xnor


@ mbomb007不能完全正常工作,无法正确处理打印内容,并且至少连接一次时会得到额外的输出。
FryAmTheEggman '16

嗯,这就是多余的输出。
mbomb007 '16

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.

3

pl,5个字节

_▼•=_

在线尝试。

如果我没有偷懒并且没有实现“分配给_”,它将是4个字节...

说明

_▼•=_

_       push _ (input var)
 ▼      decrement last used var (_)
  •     multiply, since it is off by one it auto-adds _ to the arg list
   =_   assign result to _


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解释器会自动读取输入并将其放置在堆栈中,但以字符串形式而不是数字形式。因此,我们需要使用将输入转换为数字~,然后使用再次对其进行字符串化`。最后,解释器将自动在堆栈上打印出字符串化的数字。

(现在,如果挑战是要迭代f(n+1) = f(n)*(-f(n)-1),我可以用4个字节来完成~.~*。弄清楚该方法的工作方式和原因作为练习。)



2

Lua,35 18字节

Lua可以轻松完成一次该操作!

编辑:自从我这样做以来,我已经在Lua中发现了很多东西,所以我正在更新它:)

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

...包含已解压缩的命令行参数,内联它将在此情况下使用其第一个值,因为它将不被允许消耗,从而导致print n*(n-1)


1

Y,7个字节

jzC:t*!

在这里尝试!

这是这样的:j输入数字。z激活隐式打印。C开始一个新的链接。:复制堆栈上的值,然后t递减,剩下[a a-1]。然后,我们[a*a-a]从得到*!跳过下一个命令;在EOF上,它什么也没做。链接在一起时,它会跳过输入命令,然后该过程再次开始。




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

也许这不是适当的功能。如果您正在挑剔,则可以使用(*)=<<pred$id(<-末尾有一个空格)14个字节。

编辑:@Zgarb使用函数monad重写了该函数,并保存了3个字节。谢谢!


(*)=<<pred$节省3个字节。另外,应该注意,这实际上并没有定义一个函数,并且输入值必须直接放在它之后。
Zgarb '16

@Zgarb:谢谢!添加id使其具有适当的功能。我已经在回答中写了笔记。
nimi

1

纯bash(无实用程序),40

((a=a?a:$1,a*=a-1))
trap 'echo $a' exit

1

TI基本(6 5个字节)

在TI-83 / 84计算器上运行

:Ans²-Ans

该程序之所以有效,是因为它打印了程序最后一行的表达式而不是常规Done文本。


1
5字节::Ans²-Ans
lirtosiast,2016年

1

Mathcad,39个“字节”

在此处输入图片说明

从用户的角度来看,Mathcad实际上是2D白板,其表达式是从左到右,从上到下进行评估的。Mathcad不支持常规的“文本”输入,而是使用文本和特殊键/工具栏/菜单项的组合来插入表达式,文本,图或组件。例如,键入“:”以输入定义运算符(在屏幕上显示为“:=“),“ [”以输入数组索引,或键入“ ctl-]”以输入while循环运算符(包括占位符)。控制条件和一个身体表情)。在上图中,您所看到的正是在用户界面上出现并被“键入”的内容。

为了打高尔夫球,“字节”计数是输入表达式所需的等效键盘操作数。

我什至不太确定的一件事(从“字节”等效性的角度来看)是如何计算创建一个新区域(例如a:= 5或k:= 0..n-1)。我已将每次移动到新区域等同于换行,因此等于1个字节(实际上,我使用鼠标单击想要该区域的位置)。

我只包括了活动语句,而没有包括注释,并且为a和n输入分别包括了2个字节,但没有包括值本身(在示例中为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是强类型的,并且不能将“特殊”符号称为like &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 ++语言:

#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++;

在线尝试!


0

滑稽-5字节

J?d?*

blsq ) 5 J?d?*
20
blsq ) 5 J?d?* J?d?*
380
blsq ) 5 J?d?* J?d?* J?d?*
144020
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.