수직 슬라이스 결정


23

이미지가 주어지면 [전체 세로 섹션의 너비 (픽셀 단위)] 1 (있는 경우)을 출력합니다. 세로 섹션이 없으면을 출력하십시오 0.

입력은 로컬 파일 또는 중첩 배열로 제공 될 수 있습니다. 중첩 배열로 입력을 선택하면 흰색 픽셀은 정확한 값으로 표시되고 흰색이 아닌 픽셀은 잘못된 값으로 표시해야합니다.

1. 연속적인 모든 흰색 열의 수


당신은 가정 할 수 있습니다

  • 1000 제곱 픽셀보다 큰 이미지는 없습니다

  • 이미지 당 하나의 전체 수직 섹션이 없습니다.


입력 :

출력 :

50
57
0
0

다음은 섹션을 표시하기 위해 강조 표시된 (노란색) 처음 두 가지 예입니다.


세로 부분이 여러 개가되도록 가운데에 검은 섬이있을 수 있습니까?
xnor

@xnor : 이미지 당 하나의 전체 수직 섹션 만 존재합니다. 스펙에 추가하겠습니다.
Zach Gates

내 코드는 첫 번째 테스트 사례의 경우 50을 출력하지만 마지막 233의 열은 233에서 282까지의 세로 슬라이스 (= 50 픽셀)로 올바른 숫자를 출력합니다. 48이 정확한 번호인지 확인할 수 있습니까?
David

@David : 232 열에서 282 열까지의 정확한 슬라이스를 봅니다 (제외). 당신 말이 옳아 요
Zach Gates

2
나는 누군가가 문제가 있다고 생각하지 않지만, 당신이 인접한 전체 흰색 열의 수를 찾고 있다고 명시 적으로 언급 할 가치가 있습니다. 예제에서는 분명하지만 일반적으로 예제 나 테스트 사례에 의존하지 않는 것이 좋습니다 .
MichaelS

답변:


36

젤리, 2 바이트

PS

여기 사용해보십시오!

이미지를 다음과 같이 인코딩하면 :

0000111111111100000
0000000111111111000
0000000001111100000
0000000011111000000
0001111111111111100
0000001111110000000
0000000111111110000
0000111111111100000

다음과 같이 중첩 배열로 :

[[0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0],...]

그런 다음 P모든 행 벡터의 요소 별 곱을 가져오고 S결과에있는 모든 것을 합산하여 세로 슬라이스의 길이를 만듭니다. (이는 하나의 연속 슬라이스 만 보장되기 때문에 작동합니다.) 우리의 경우 대답은 3입니다.


21
ಠ_ಠ이 수준의 골프가 놀랍습니다.
애디슨 크럼

연속 슬라이스가 없을 때의 결과는 무엇입니까? (유효한 입력)
Addison Crump

3
psMATL에서도 작동합니다!
David

그리고 모두의 더 열이 없을 것 1의 결과를 의미의 P[0,0,0...0]이있는, S한다 음 0, 같은 예상.
Lynn

@David 그렇다면 게시 하시겠습니까? Xps그러나 이미지가 단일 행일 수있는 경우 (또는 최소 크기가있는 경우 OP에 문의)
Luis Mendo

7

APL, 4 바이트

+/×⌿

Try it here.

이것이 나의 첫 APL 답변입니다!

바이트 저장을위한 @ jimmy23013과 @NBZ에게 감사합니다!


이것은 기능이 아닙니다. (+/×/⍉)작동하지 않습니다.
jimmy23013

1
그러나 당신은 사용할 수 있으며 (+/×⌿)1 바이트 더 짧습니다.
jimmy23013

괄호를 제거하여 다른 2 바이트를 저장하십시오. 다른 많은 APL 답변에는 이름이 있거나 괄호로 묶어야하는 익명의 기능 기차가 있습니다.+/×⌿ f←+/×⌿ f picture
Adám

6

배쉬 + 공통 유틸리티, 17

rs -Tc|grep -vc 0

당신이 사용하지 않는 경우 grep에 대한 , 당신은 ;-) 잘못하고 있습니다.

rs유틸리티를 사용하여 조옮김을 수행합니다. rs되는 OSX에 번들 하지만, 같은 대부분의 리눅스의 설치가 필요합니다 sudo apt-get install rs.

입력 열은 TAB구분되고 행은 줄 바꿈으로 구분됩니다.

0   0   0   0   1   1   1   1   1   1   1   1   1   1   0   0   0   0   0   
0   0   0   0   0   0   0   1   1   1   1   1   1   1   1   1   0   0   0   
0   0   0   0   0   0   0   0   0   1   1   1   1   1   0   0   0   0   0   
0   0   0   0   0   0   0   0   1   1   1   1   1   0   0   0   0   0   0   
0   0   0   1   1   1   1   1   1   1   1   1   1   1   1   1   1   0   0   
0   0   0   0   0   0   1   1   1   1   1   1   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   1   1   1   1   1   1   1   1   0   0   0   0   
0   0   0   0   1   1   1   1   1   1   1   1   1   1   0   0   0   0   0

원하는 경우 imagemagick 및 (GNU) sed를 사용하여 예제 입력 이미지를이 형식으로 사전 처리 할 수 ​​있습니다. 예 :

$ for img in "AmXiR.jpg" "vb2Yt.jpg" "1V7QD.jpg" "MqcDJ.jpg" ; do
>     convert -depth 1 "$img" xpm:- | \
>     sed -nr '/pixels/{:l;n;/}/q;s/^"(.*)",?$/\1/;y/ ./01/;s/./&\t/g;p;bl}' | \
>     rs -Tc|grep -vc 0
> done
50
57
0
0
$

6

펄, 21 22 바이트

고정 버전

에 +2 포함 -lp( -l생략 가능하고 여전히 유효한 솔루션이지만 최종 개행 문자가 없으면 추악합니다)

STDIN의 0 개 이상의 행에 1과 0의 시퀀스를 제공하십시오. 사용량이 모든 행에서 일관된 한 원하는 경우 숫자 사이에 공백이나 쉼표 또는 기타 숫자를 추가 할 수 있습니다.

$a|=~$_}{$_=$a=~y;\xce;

이것은 표시된대로 작동하지만 \xce청구 된 점수를 얻기 위해 리터럴 바이트 값으로 대체

세로 섹션이 여러 개인 경우 모든 섹션 너비의 합을 반환합니다. 당신의 폭하려면 수직 단면의 사용을

$a|=~$_}{$a=~/\xce+/;$_="@+"-"@-"

구 버전

나는 원래 도전을 오해하고 수직선이 존재하는지에 따라 참 또는 거짓을주는 프로그램을 구현했습니다. 여기에 코드와 설명이 이전 버전에 대한 것입니다

$a|=~$_}{$_|=~$a=~1

거의 완벽한 대칭을 위해 왼쪽에 1 = ~를 더할 수 있다면 ... 가장 가까운 것으로 가정합니다.

1=>$a|=~$_}{$_|=~$a=~1

설명

$a|=~$_     The bitwise operators in perl (&, |, ^, ~) also work on strings by 
            working on the sequence of byte values. The digits "0" and "1" happen
            to have the same ASCII value differing only in the last bit which is
            0 for "0" and 1 for "1". So I would really like to do an "&" here.
            Unfortunately "&" of two different length strings shortens the result
            to the shortest of the strings and my accumulator starts as an empty 
            string. The "|" of two strings however extends to the longest string.
            So instead I will apply De Morgan's law and use "|" on the
            complemented byte string 
}{          Standard perl golf trick. "-p code" transforms to (simplified)
            "while (<>) { code; print }". So if code is "code1 } { code2" this
            becomes "while (<>) { code1 } {code2; print }". So you can use code1
            for the loop operation, use code2 for the final calculation and get a
            free print by assigning to $_
$_|=~$a=~1  I would like to match the accumulator with the bit complement of "1",
            but $a=~~1 doesn't work because the 1 is not a string but a number.
            $a=~~"1" would work but is too long. Next up is complementing $a back
            and matching with 1, so $_=~$a=~1. That also doesn't work since the
            first =~ will be interpreted as a string match insteads of equals
            followed by complement. Easily solved by writing it as $_= ~a=~1. But
            if I am going to give up a byte I can at least have some fun with it.
            Using $_|= also makes the parse work and has the advantage that the
            failure case will give 0 instead of an empty string, which looks
            nicer. It also makes the code look very symmetric. I can also bring
            out the symmetry more by putting 1=> in front (which evaluates 1
            before the assignment and then immediately discards it)

4

파이썬 2, 30 바이트

내가 좋아하는 내장 기능을 함께 사용하는 놀랍도록 우아한 솔루션이 있습니다.

lambda c:sum(map(all,zip(*c)))

@Lynn의 테스트 이미지 사용 :

>>> image = [[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]]
>>> func = lambda c:sum(map(all,zip(*c)))
>>> func(image)
3

4

피스, 5

s*VFQ

여기 사용해보십시오

이것은 Lynn의 알고리즘을 사용하지만 Pyth에서 벡터 연산을 골프하는 방법을 보여주기 위해 게시하기로 결정했습니다. 여기에 트릭은 "설탕"구문 헬퍼 체인 인 VF겹는 벡터 연산으로 적용됩니다 그래서. 접힌 연산자는 물론 곱셈이며 결과는 합산되어 최종 답변을 얻습니다.


4

자바 스크립트 (ES6), 54 45 43 바이트

a=>a[s=0].map((_,i)=>s+=a.every(b=>b[i]))|s
a=>a[s=0].map((_,i)=>s+=!a.some(b=>b[i]))|s

사용하여 golfed 이후하지만, 린의 젤리 대답 @ 기반으로 every또는 some대신 reduce. 첫 번째 버전은 black = 0을 인코딩하고 두 번째 버전은 black = 1을 인코딩합니다.

편집 : @ edc65 덕분에 2 바이트를 더 절약했습니다.


3
다음을 사용해보십시오map
CalculatorFeline

내 카운트에 45입니다. 그리고 당신은 43이 될 수 있기 때문에 충분히 노력하지 않았습니다.
edc65

a => a [s = 0] .map ((_, i) => s + =! a.some (b => b [i])) | s
edc65

1
@ edc65 글쎄, 당신은 컴퓨팅의 두 가지 어려운 문제가 캐시 무효화, 명명 및 한 번에 하나의 오류라는 것을 알고 있습니다 ...
Neil

4

J , 5 6 바이트

부울 행렬을 인수로 사용합니다.

[:+/*/

이것이 나의 첫 J 답변입니다! (1 년 반 동안 잘못되었다…)

*/ 열별 제품

+/ 합집합

[: 한도 ( +/좌측 인수를 취하지 않아야하기 때문에 자리 표시 자로 사용 )

온라인으로 사용해보십시오!



2

매스 매 티카 24

Length@Cases[Total@#,0]&

다음과 같은 형식으로 배열을 가져옵니다.

{{1, 0, 0, 0, 1, 0},
{1, 0, 0, 1, 1, 1},
{1, 1, 0, 0, 0, 0},
{1, 1, 0, 0, 1, 1},
{1, 0, 0, 1, 1, 1}}

그리고이 경우 출력 :

1

또는 Length[Total@#~Cases~0]&같은 바이트 수
CalculatorFeline

Mathematica에서 1과 0은 진실이 아니거나 거짓이 아닙니다 (그리고 그들이 과제라면 다른 방식 일 것입니다).
Martin Ender

1

𝔼𝕊𝕄𝕚𝕟, 7 자 / 9 바이트

⨭МƟïⓜ⨴$

Try it here (Firefox only).

이것은 @Lynn의 훌륭한 알고리즘이지만 독립적으로 찾았습니다. (나는 여전히 찾고있는 곳이 내장되어 있다고 생각했다. : P)

설명

МƟï입력 배열을 전치하고 ⓜ⨴$각 내부 벡터를 곱으로 바꾸고 결과 배열을 합합니다.


1

Japt , 6 4 바이트

1흰색과 0검은 색으로 입력을 행의 배열로 가져옵니다 .

y xe
  • ETH 덕분에 2 바이트가 절약되었습니다 .

그것을 테스트


설명

y xe
          :Implicit input of array U.
y         :Transpose.
   e      :Map over each sub-array, checking if every element is truthy.
  x       :Reduce by summing, converting booleans to 1 or 0.
          :Implicit output of resulting integer.

난 당신이 할 수 있다고 생각 y x_×사실 5에 대한이 e아니라으로 작동 ×하므로, y xe4 :-) 위해
ETHproductions

주말에 그 댓글을 잃어 버렸다. @ETHproductions-thanks :)
Shaggy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.