您的任务是编写一个计算机程序或函数,该程序或函数采用长度至少为2的正整数列表,并确定它们是否为“ zigzag”。当且仅当数字交替地大于和小于其前面的数字时,序列才为之字形。例如和是曲折形,但和不是。
根据您的决定,应为每种可能性输出两个不同的一致值之一(之字形而不是之字形)。
程序或函数的代码点本身也必须是Z字形。这意味着当您采用代码点序列时,它应该是锯齿形的。
这是代码高尔夫球,因此答案将以字节计分,而字节越少越好。
您的任务是编写一个计算机程序或函数,该程序或函数采用长度至少为2的正整数列表,并确定它们是否为“ zigzag”。当且仅当数字交替地大于和小于其前面的数字时,序列才为之字形。例如和是曲折形,但和不是。
根据您的决定,应为每种可能性输出两个不同的一致值之一(之字形而不是之字形)。
程序或函数的代码点本身也必须是Z字形。这意味着当您采用代码点序列时,它应该是锯齿形的。
这是代码高尔夫球,因此答案将以字节计分,而字节越少越好。
Answers:
IṠIỊẸ
返回(之字形)或1(非之字形)。
所述代码点在果冻代码页。
IṠIỊẸ Main link. Argument: A (array)
I Increments; compute the forward differences of A.
Ṡ Take their signs.
A is zigzag iff the signs are alternating.
I Take the increments again.
Alternating signs result in an increment of -2 or 2.
Non-alternating signs result in an increment of -1, 0, or 1.
Ị Insignificant; map each increment j to (|j| ≤ 1).
Ẹ Any; return 0 if all results are 0, 1 in any other case.
dt?ZSd]pA
我的第一个MATL程序!倒数第二个p
添加为之字形要求。
说明:
d %take the difference between successive elements of input
t %duplicate that
? %if that is all non-zero
ZS %take the sign of those differences (so input is all `-1`s and `1`s now)
d %take the difference of that (so if there are successive `1`s or `-1`s, this will have a 0)
] %end-if
p %take the product of topmost stack vector (will be 0 if either the original difference or
% the difference-of-signs contained a 0)
A %convert positive products to 1 (since OP specifies "you should output one of two different consistent values for each possibility ")
]
显然生活在大写字母和小写字母之间,因此d
to ]
和]
to A
都将是递减的,这是不允许的。因此,p
主要是两者之间有一个代码点增量。
-2字节归功于Jakob
-62字节归功于Dennis
e={eval }.pop()
p ="i"+"n"+"p"+"u"+"t ( "
s=e(p +")")
e(p +"` a"+"l"+"l([(x<y>z)+(x>y<z)f"+"o"+"r x,y,z i"+"n zip(s,s [1: ],s [2: ])])` )")
颠簸算法的功劳归功于此答案
input
,print
,exec
,def
和lambda
不颠簸,所以我只得到了eval
离开,这是存储在e
有2种主要途径绕过限制,放置"+"
或无颠簸对之间,我选择了前者(
对于每个使用更短,但它会
replace(' ','')
导致产生更多的字节)。
由于print
它不是凹凸不平的,所以我不能直接使用它,而且由于它不是函数eval()
,所以我不能在内部使用它,所以我不得不使用它input(result)
来输出结果
' ' * 0
的' ' [1: ]
。
input(text)
用来写入STDOUT。
-!
,好吧,这不是很漂亮,但是我很高兴它能起作用!
输出true
为之字形或false
否。
ä'- m'g ä'a èÍ
代码点[228,39,45,32,109,39,103,32,228,39,97,32,232,205]
作为测试并包含在上面的链接中。
:Implicit input of array
ä'- :Consecutive differences
m'g :Map signs
ä'a :Consecutive absolute differences
Í :Subtract each from 2
è :Count the truthy (non-zero) elements
:Implicitly negate and output resulting boolean.
{ [*] ($_[{1…*} ] Z<@$_)Z+^ ($_[{1…*} ] Z>@$_[{2…*} ])}
代码点是:
(123 32 91 42 93 32 40 36 95 91 123 49 8230 42 125 32 93 32 90 60 64 36 95 41 90 43 94 32 40 36 95 91 123 49 8230 42 125 32 93 32 90 62 64 36 95 91 123 50 8230 42 125 32 93 41 125)
是的,这些是那里的unicode字符。这或多或少是我最初的解决方案,其中混入了一些空格和花括号。
a=> a.map(n=> e&=!~(p | q)| q <(q=p)^ p <(p=n), e=p=q=~ 0)|e
代码点:
61 3d 3e 20 61 2e 6d 61 70 28 6e 3d 3e 20 65 26
3d 21 7e 28 70 20 7c 20 71 29 7c 20 71 20 3c 28
71 3d 70 29 5e 20 70 20 3c 28 70 3d 6e 29 2c 20
65 3d 70 3d 71 3d 7e 20 30 29 7c
map
是曲折!
¥.±¥Ä2/P
返回1.0
锯齿形和0.0
非锯齿形序列。
代码点[164,108,176,164,195,2,109,25]
在05AB1E代码页中。
说明:
¥ # Take the deltas of the (implicit) input-list
# i.e. [1,2,0,3,2,3] → [1,-2,3,-1,1]
.± # Calculate the sign for each of them (-1 if a<0; 0 if 0; 1 if a>0)
# i.e. [1,-2,3,-1,1] → [1,-1,1,-1,1]
¥ # Calculate the deltas of those
# i.e. [1,-1,1,-1,1] → [-2,2,-2,2]
Ä # Take the absolute value of each
# i.e. [-2,2,-2,2] → [2,2,2,2]
2/ # Divide them by 2
# i.e. [2,2,2,2] → [1.0,1.0,1.0,1.0]
# (`;` {halve} would have been shorter, but doesn't comply to the challenge)
P # Take the product of the list resulting in either 1.0 or 0.0
# i.e. [1.0,1.0,1.0,1.0] → 1.0