도전:
벡터 / 정수 목록을 입력으로 취하고 0에 인접한 가장 큰 숫자를 출력하십시오.
사양:
- 항상 그렇듯이 선택적 입력 및 출력 형식
- 하나 이상의 0과 하나 이상의 0이 아닌 요소가 있다고 가정 할 수 있습니다.
테스트 사례 :
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
행운과 행복한 골프!
도전:
벡터 / 정수 목록을 입력으로 취하고 0에 인접한 가장 큰 숫자를 출력하십시오.
사양:
테스트 사례 :
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
행운과 행복한 골프!
답변:
ṡ2ẠÐḟS€Ṁ
ṡ2 Overlapping pairs
ẠÐḟ Remove pairs without zeroes
S€ Sum of each pair
Ṁ Maximum
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(합).
eSsM/#0,Vt
폼 쌍, 멤버가 0 인 필터, 합계를 기준으로 정렬하여 가장 큰 값을 반환합니다.
,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 바이트 절약
편집 : ETH 프로덕션 덕분에 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 바이트가 절약 되었습니다. 1 바이트 추가 @mrco 가 버그를 발견 한 후 감사합니다 (추가 된 테스트 케이스 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;}
q~2ew{0&},::+:e>
온라인으로 사용해보십시오! (테스트 스위트로)
q~ e# Read and eval input.
2ew e# Get all (overlapping) pairs of adjacent values.
{0&}, e# Keep only those that contain a 0.
::+ e# Sum each pair to get the other (usually non-zero) value.
:e> e# Find the maximum.
@(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 nlisted"
2(... )/쌍으로
+ 합 (제로 더하기 무언가)
↑⍨ 만약에
0 제로
∊ 의 회원이다
, 쌍 (왼쪽 숫자와 오른쪽 숫자의 연결)
편집 : @Vlo 덕분에 오류를 수정하고 stdins의 입력을 읽도록 변경하고 paranthese를 할당 w하고 건너 뛰어 1 바이트를 절약했습니다 .
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+1w-1와 일치하는 요소를 추출 하고w+1의 마지막 또는 첫 번째 요소 v가 0이면 w+-1벡터의 길이를 벗어난 인덱스를 효과적으로 가져 v[length(v)+1]옵니다 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배열 슬라이스로 다시 공급합니다 $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
[:>./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
}
foreach($a=$argv as$k=>$v)$v||$m=max($m,$a[$k-1],$a[$k+1]);echo$m;
꽤 직설적 인. 입력을 반복하고 숫자가 0이면 $m인접한 두 숫자 중 가장 높은 숫자 와 이전 값인으로 설정 $m됩니다.
다음과 같이 실행하십시오 ( -d미학에만 추가됨).
php -d error_reporting=30709 -r 'foreach($a=$argv as$k=>$v)$v||$m=max($m,$a[$k-1],$a[$k+1]);echo$m;' -- -4 -6 -2 0 -9;echo
using System.Linq;i=>i.Zip(i.Skip(1),(a,b)=>a*b==0?1<<31:a+b).Max();
설명:
zip을 사용하여 배열 자체를 조인하지만 항목 0이 항목 1에 조인되도록 두 번째 참조의 첫 번째 값을 건너 뜁니다. b에 곱하기 b를 곱한 결과가 0이면 그 중 하나가 0이고 a + b를 출력해야합니다. 그렇지 않으면 언어에서 가능한 최소 정수를 출력하십시오. 항상 0과 0이 아닌 것으로 가정하면이 최소값은 최대 값으로 출력되지 않습니다.
용법:
[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에 인접한 모든 값에서 최대 값을 가져옵니다.
편집 : rturnbull 덕분에 경계에서 생산 된 NA를 잡습니다!
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örg Hü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를 들어 나를 위해 이해되지 않는다