挑战:
以向量/整数列表作为输入,并输出与零相邻的最大数字。
规格:
- 与往常一样,可选的输入和输出格式
- 您可以假定将至少有一个零和至少一个非零元素。
测试用例:
1 4 3 6 0 3 7 0
7
9 4 9 0 9 0 9 15 -2
9
-4 -6 -2 0 -9
-2
-11 0 0 0 0 0 -12 10
0
0 20
20
祝你好运,打高尔夫球愉快!
挑战:
以向量/整数列表作为输入,并输出与零相邻的最大数字。
规格:
测试用例:
1 4 3 6 0 3 7 0
7
9 4 9 0 9 0 9 15 -2
9
-4 -6 -2 0 -9
-2
-11 0 0 0 0 0 -12 10
0
0 20
20
祝你好运,打高尔夫球愉快!
Answers:
t~5BZ+g)X>
让我们以输入[-4 -6 -2 0 -9]
为例。
t % Input array. Duplicate
% STACK: [-4 -6 -2 0 -9], [-4 -6 -2 0 -9]
~ % Logical negate. Replaces zeros by logical 1, and nonzeros by logical 0
% STACK: [-4 -6 -2 0 -9], [0 0 0 1 0]
5B % Push logical array [1 0 1] (5 in binary)
% STACK: [-4 -6 -2 0 -9], [0 0 0 1 0], [1 0 1]
Z+ % Convolution, maintaining size. Gives nonzero (1 or 2) for neighbours of
% zeros in the original array, and zero for the rest
% STACK: [-4 -6 -2 0 -9], [0 0 1 0 1]
g % Convert to logical
% STACK: [-4 -6 -2 0 -9], [0 0 1 0 1]
) % Use as index into original array
% STACK: [-2 -9]
X> % Maximum of array.
% STACK: -2
% Implicitly display
x(~~(dec2bin(5)-48))
。实施那个是谁的想法?非常聪明,对逻辑数组很有用!:)好答案!
dec2bin()-'0'
在MATLAB中使用了数百次,所以我知道必须在MATL中进行:-)
ü‚D€P_ÏOZ
说明
ü‚ # pair up elements
D # duplicate
€P # product of each pair (0 if the pair contains a 0)
_ # logical negate, turns 0 into 1 and everything else to 0
Ï # keep only the pairs containing at least 1 zero
O # sum the pairs
Z # take max
在在线解释器中不起作用,但在离线状态下起作用。
ü
是昨天才添加的:)
0
如果实际答案是否定的,这不会回报吗?我认为您必须排除零。
˜
,可以轻松解决此问题O
。
f x=maximum[a+b|(a,b)<-tail>>=zip$x,a*b==0]
感谢@MartinEnder提供4个字节!
a*b==0
代替||
。
eSsM/#0,Vt
形成对,按零成员过滤,按和排序,返回最大。
,Vt
(implicit QQ
)返回与相同的对.:Q2
,但对被翻转。应该可以,但是。
f}0T
是/#0
let f =
l=>l.map((n,i)=>m=l[i-1]==0|l[i+1]==0&&n>m?n:m,m=-1/0)|m
console.log(f([1, 4, 3, 6, 0, 3, 7, 0])); // 7
console.log(f([9, 4, 9, 0, 9, 0, 9, 15, -2])); // 9
console.log(f([-4, -6, -2, 0, -9])); // -2
console.log(f([-11, 0, 0, 0, 0, 0, -12, 10])); // 0
console.log(f([3, 0, 5])); // 5
console.log(f([28, 0, 14, 0])); // 28
编辑:感谢Huntro保存2个字节编辑:感谢ETHproductions
保存1个字节
==
而不是===
l=>l.map((n,i)=>m=l[i-1]*l[i+1]==0&n>m?n:m,m=-1/0)|m
->a{a.each_cons(2).map{|a,b|a*b!=0?-1.0/0:a+b}.max}
f=->a{a.each_cons(2).map{|a,b|a*b!=0?-1.0/0:a+b}.max}
p f[gets.split.map(&:to_i)]
a+b
。
-3 -2 0
回到0
我认为更换。...?0:...
与...?-1.0/0:...
应该修复它,增加5个字节。
来自匿名的-3个字节,来自MartinEnder的-4个和-2个
preg_match_all("#(?<=\b0 )\S+|\S+(?= 0)#",$argv[1],$m);echo max($m[0]);
与 php -r '<code>' '<space separated values>'
\K
到目前为止,使用放弃匹配比使用后向查找要短。
\S+
匹配带符号的整数。您可能需要使用,\b0,
因此不必在之前添加,
。
4 0 0 5
吗?
\K
不能使用替代方法吗?出于未知原因,第二个替代方案返回0 0
,因此0
在之前没有其他匹配项5
。固定,谢谢。
int d(int[]a){int i=0,m=1<<31,c;for(;++i<a.length;m=a[i]*a[i-1]==0&(c=a[i]+a[i-1])>m?c:m);return m;}
@cliffroot通过使用算术方法节省了13个字节。@mrco发现错误后,还要多 1个字节(添加的测试用例2, 1, 0
将2
代替而不返回1
)。
取消测试代码:
class M{
static int c(int[] a){
int i,
m = a[i=0],
c;
for(; ++i < a.length; m = a[i] * a[i-1] == 0 & (c = a[i] + a[i - 1]) > m)
? c
: m);
return m;
}
public static void main(String[] a){
System.out.println(c(new int[]{ 1, 4, 3, 6, 0, 3, 7, 0 }));
System.out.println(c(new int[]{ 9, 4, 9, 0, 9, 0, 9, 15, -2 }));
System.out.println(c(new int[]{ -4, -6, -2, 0, -9 }));
System.out.println(c(new int[]{ -11, 0, 0, 0, 0, 0, -12, 10 }));
System.out.println(c(new int[]{ 0, 20 }));
System.out.println(c(new int[]{ 2, 1, 0 }));
}
}
输出:
7
9
-2
0
20
1
int d(int[]a){int i,m=a[i=0],c;for(;++i<a.length;m=a[i]*a[i-1]==0&(c=a[i]+a[i-1])>m?c:m);return m;}
@(x)max(x(imdilate(~x,[1 0 1])))
这是一个匿名函数。测试用例的示例用法:
>> f = @(x)max(x(imdilate(~x,[1 0 1])))
f =
function_handle with value:
@(x)max(x(imdilate(~x,[1,0,1])))
>> f([1 4 3 6 0 3 7 0])
ans =
7
>> f([9 4 9 0 9 0 9 15 -2])
ans =
9
>> f([-4 -6 -2 0 -9])
ans =
-2
>> f([-11 0 0 0 0 0 -12 10])
ans =
0
>> f([0 20])
ans =
20
⌈/∊2(+↑⍨0∊,)/⎕
⌈/
最大的
∊
扁平化(“ e列出”
2(
... )/
成对
+
总和(零加某物是某物)
↑⍨
如果采取
0
零
∊
是的成员
,
对(点亮。左手数字和右手数字的串联)
编辑:修复了由于@Vlo而导致的错误,并将其更改为从stdins读取输入,通过分配w
和跳过括号节省了一个字节。
function(v)sort(v[c(w<-which(v==0)-1,w+1)],T)[1]
v=scan();w=which(v==0);sort(v[c(w-1,w+1)],T)[1]
v
为0的索引:w <- which(v == 0)
+-1
:w-1
和w+1
w-1
然后w+1
请注意,如果的最后一个或第一个元素v
为零,w+-1
则将有效地获取向量长度之外的索引,这意味着v[length(v)+1]
return NA
。这通常没有问题,但是如果向量中有任何出现,则max()
函数会不方便地返回NA
,除非有人指定了选项na.rm=T
。因此,排序和提取第一个元素比使用要短2个字节max()
,例如:
max(x,na.rm=T)
sort(x,T)[1]
c(1, 4, 3, 6, 0, 10, 7, 0)
c((w<-which(v==0))-1,w+1)
扫描时也稍短一点sort((v<-scan())[c(w<-which(v==0)-1,w+1)],T)[1]
()
;)。现在更新了代码并分配了v
事先的操作。
由于@MartinEnder而节省了3个字节。
Max[Tr/@Partition[#,2,1]~Select~MemberQ@0]&
匿名函数。将整数列表作为输入,并返回整数作为输出。基于Ruby解决方案。
打高尔夫球:
DECLARE @x varchar(max)='1 5 4 3 6 1 3 17 1 -8 0 -7'
DECLARE @a INT, @b INT, @ INT WHILE @x>''SELECT @a=@b,@b=LEFT(@x,z),@x=STUFF(@x,1,z,''),@=IIF(@a=0,IIF(@b<@,@,@b),IIF(@b<>0 or @>@a,@,@a))FROM(SELECT charindex(' ',@x+' ')z)z PRINT @
取消高尔夫:
DECLARE @x varchar(max)='1 5 4 3 6 1 3 17 1 -8 0 -7'
DECLARE @a INT, @b INT, @ INT
WHILE @x>''
SELECT
@a=@b,
@b=LEFT(@x,z),
@x=STUFF(@x,1,z,''),
@=IIF(@a=0,IIF(@b<@,@,@b),IIF(@b<>0 or @>@a,@,@a))
FROM(SELECT charindex(' ',@x+' ')z)z
PRINT @
param($n)($n[(0..$n.count|?{0-in$n[$_-1],$n[$_+1]})]|sort)[-1]
比其他答案要长一点,但是很漂亮。
接受输入$n
。然后遍历索引0..$n.count
,使用Where-Object
(|?{...}
)拉出数组中上一个或下一个项所在的那些索引0
,并将它们反馈到数组slice中$n[...]
。然后|sort
,我们将这些元素取为最大[-1]
。
PS C:\Tools\Scripts\golfing> @(1,4,3,6,0,3,7,0),@(9,4,9,0,9,0,9,15,-2),@(-4,-6,-2,0,-9),@(-11,0,0,0,0,0,-12,10)|%{""+$_+" --> "+(.\largest-number-beside-a-zero.ps1 $_)}
1 4 3 6 0 3 7 0 --> 7
9 4 9 0 9 0 9 15 -2 --> 9
-4 -6 -2 0 -9 --> -2
-11 0 0 0 0 0 -12 10 --> 0
PS C:\Tools\Scripts\golfing> @(0,20),@(20,0),@(0,7,20),@(7,0,20),@(7,0,6,20),@(20,0,6)|%{""+$_+" --> "+(.\largest-number-beside-a-zero.ps1 $_)}
0 20 --> 20
20 0 --> 20
0 7 20 --> 7
7 0 20 --> 20
7 0 6 20 --> 7
20 0 6 --> 20
{max x where 0 in'x,'(next x),'prev x}
{}
才能使其发挥作用。
[:>./2(0&e.\#+/\)]
[:>./2(0&e.\#+/\)] Input: array A
] Identity. Get A
2 The constant 2
( ) Operate on 2 (LHS) and A (RHS)
\ Get each subarray of size 2 from A and
+/ Reduce it using addition
\ Get each subarray of size 2 from A and
0&e. Test if 0 is a member of it
# Filter for the sums where 0 is contained
[:>./ Reduce using max and return
{max map ->$/ {$1 if !$0|!$2},(1,|@_,1).rotor(3=>-2)}
# bare block lambda with implicit signature of (*@_)
{
max
map
-> $/ { # pointy lambda with parameter 「$/」
# ( 「$0」 is the same as 「$/[0]」 )
$1 if !$0 | !$2 # return the middle value if either of the others is false
},
( 1, |@_, 1 ) # list of inputs, with added non-zero terminals
.rotor( 3 => -2 ) # grab 3, back-up 2, repeat until less than 3 remain
}
using System.Linq;i=>i.Zip(i.Skip(1),(a,b)=>a*b==0?1<<31:a+b).Max();
说明:
使用zip将数组与自身连接,但是跳过第二个引用中的第一个值,以便零项连接到第一项。将a乘以b,如果结果为零,则其中之一必须为零,并输出a + b。否则,输出该语言的最小可能整数。假设我们总是有一个零和一个非零,那么这个最小值将永远不会作为最大值输出。
用法:
[TestMethod]
public void LargestFriend()
{
Assert.AreEqual(7, F(new int[] { 1, 4, 3, 6, 0, 3, 7, 0 }));
Assert.AreEqual(9, F(new int[] { 9, 4, 9, 0, 9, 0, 9, 15, -2 }));
Assert.AreEqual(-2, F(new int[] { -4, -6, -2, 0, -9 }));
Assert.AreEqual(0, F(new int[] { -11, 0, 0, 0, 0, 0, -12, 10 }));
Assert.AreEqual(20, F(new int[] { 0, 20 }));
}
int[]i) {
。另外,我在当前代码中计算了75个字节(如果删除空格,则为74个字节)。
a?b?i.Min()).Max():a:b
using System.Linq;
,不是吗?
System.Linq;
是默认新类模板的一部分。
using
在字节数中包含该语句
s=scan()
w=which;max(s[c(w(s==0)+1,w(s==0)-1)],na.rm=T)
从控制台输入读取向量,然后在与0相邻的所有值上取最大值。
编辑:捕获边界产生的NA,谢谢rturnbull!
20 0
,由于s[w(s==0)+1]
回报NA
和max
的默认处理NA
是归还。您可以通过添加参数来修复na.rm=T
,或重新编写要使用的代码sort
(请参见上面发布的其他R答案)。
(λ(k)(let*((lr(λ(l i)(list-ref l i)))(l(append(list 1)k(list 1)))(m(for/list((i(range 1(sub1(length l))))
#:when(or(= 0(lr l(sub1 i)))(= 0(lr l(add1 i)))))(lr l i))))(apply max m)))
详细版本:
(define f
(λ(k)
(let* ((lr (λ(l i)(list-ref l i)))
(l (append (list 1) k (list 1)))
(m (for/list ((i (range 1 (sub1(length l))))
#:when (or (= 0 (lr l (sub1 i)))
(= 0 (lr l (add1 i))) ))
(lr l i) )))
(apply max m) )))
测试:
(f (list 1 4 3 6 0 3 7 0))
(f (list 9 4 9 0 9 0 9 15 -2))
(f (list -4 -6 -2 0 -9))
(f (list -11 0 0 0 0 0 -12 10))
(f (list 0 20 ))
输出:
7
9
-2
0
20
使用main的返回码输出:
int main(int a,char**_){int i,m=0;_[0]=_[a]="1";for(i=1;i<a;++i){m=(*_[i-1]-48||*_[i+1]-48?m>atoi(_[i])?m:atoi(_[i]):m);}return m;}
我觉得我应该能够通过保存一个atoi调用来节省一些字节,但是我找不到有效的方法。(,t
加t=
号加上加,
号t
两次太长)。同样,从技术上讲,它使用未定义的行为(将_ [a]设置为“ 1”),但是我所知道的每个编译器默认都允许它。
策略:用1填充数组的开始和结尾,然后遍历内部部分以检查每个邻居。
JörgHülsermann和Titus的一些字节断断续续。=(-5)
需要启用register_globals。用法:http://localhost/notnull.php?i[]=9&i[]=-5i[]=...
$x=$_GET['i'];
$y=0;
foreach($x as $j){
if($y<abs($j)){
$y=$j;
}
}
echo $y;
打高尔夫球:
$x=$_GET['i'];$y=0;foreach($x as $j)if($y<abs($j))$y=$j;echo $y;
-d register_globals=1
(或指定默认情况下启用register_globals的版本)
json_decode
是一个好主意。
?id[]=1&id[]=2&id[]=3
然后$_GET["id"]
返回一个数组。为此json_decode是没有意义的,我