당신은 사각형의 수를 셀 수 있습니까?


21

내가 가장 좋아하는 수학 오락 중 하나는 사각형 격자를 그린 다음 해당 격자에 표시되는 모든 사각형을 찾는 것입니다. 여기 에이 질문을 가지고 자신을 위해 모험하십시오!

당신은 사각형의 수를 셀 수 있습니까?

+-----+-----+-----+-----+
|     |     |     |     |
|     |     |     |     |
+-----+-----+-----+-----+
|     |     |     |     |
|     |     |     |     |
+-----+-----+-----+-----+
|     |     |     |     |
|     |     |     |     |
+-----+-----+-----+-----+
|     |     |     |     |
|     |     |     |     |
+-----+-----+-----+-----+

4 x 4 minichess 보드 의 총 직사각형 수 는 정확히

100

맞습니까?

관련 수학 : 8 × 8 바둑판에는 몇 개의 사각형이 있습니까?

도전

환상 체가 아닌 격자 / 이미지 에서 보이는 사각형의 총 개수를 세는 가장 짧은 함수 / 프로그램 을 작성하십시오 .

관련 과제 : 고유 사각형을 세어보세요! , 2 차원 어레이의 바이트 직사각형 번호 찾기 .

입력 형식

함수 또는 프로그램은 텍스트 기반 입력 또는 그래픽 입력과 작동하도록 선택할 수 있습니다.

텍스트 기반 입력

격자는 다음 문자로 구성된 m x n ( m 행, n 열) ASCII 격자입니다.

  • 공백,
  • - 수평선 세그먼트의 일부
  • | 수직선 세그먼트의 일부
  • + 코너.

이 ASCII 표를 다음과 같은 형식으로 프로그램 / 기능의 입력 / 인수로 소개 할 수 있습니다.

  • 줄 바꿈으로 구분 된 단일 문자열
  • 줄 바꿈은 없지만 그리드의 크기를 인코딩하는 하나 또는 두 개의 정수가있는 문자열 또는
  • 문자열 배열

주 : 텍스트 기반 입력을 적어도 포함 1 행과 적어도 1 컬럼.

그래픽 입력

대안 적으로, 그리드는 5 * n 픽셀 폭 및 5 * m 픽셀 높이 의 흑백 PNG 이미지 로 인코딩된다 . 각 이미지는 다음과 같은 방법으로 ASCII 입력에 해당하는 5px * 5px 블록으로 구성 됩니다.

  • 공백은 흰색 블록으로 변환됩니다. 이러한 블록을 공백 블록 이라고합니다 .
  • 선분과 모서리는 공백 이 아닌 블록으로 변환됩니다 . 이러한 블록의 중앙 픽셀은 검은 색입니다.
  • 편집 : 두 개의 모서리 (ASCII 입력)가 선 세그먼트로 연결된 경우 해당 블록 중심 (그래픽 입력)도 검은 선으로 연결해야합니다.

즉, 각 블록은 파란 경계를 무시하십시오. (더 큰 이미지를 보려면 여기를 클릭하십시오 . ) 에서만 선택할 수 있습니다 .

참고 : 파란색 경계는 설명 목적으로 만 사용됩니다. 그래픽 입력이 최소 인 5 넓은 PX 및 5 PX 높은. 그래픽 입력을 다른 이미지 파일 형식의 단색 이미지로 변환 할 수 있습니다. 변환하기로 선택한 경우 답변에 지정하십시오. 전환에 대한 처벌은 없습니다.

출력 형식

프로그램을 작성하는 경우 입력의 총 사각형 수를 나타내는 음수가 아닌 숫자를 표시해야합니다.

함수를 작성하는 경우 입력의 총 사각형 수를 나타내는 음수가 아닌 숫자도 반환해야합니다.

사례 사례

사례 1, 그래픽 : 사례 1( 30 PX * 30 픽셀), ASCII ( 66 COLS)

+--+  
|  |  
| ++-+
+-++ |
  |  |
  +--+

예상 출력 : 3

사례 2, 그래픽 :사례 2 ( 20 PX * 20 픽셀), ASCII ( 44 COLS)

++-+
|+++
+++|
+-++

예상 출력 : 6

사례 3, 그래픽 : 사례 3( 55 PX * 40 픽셀), ASCII ( 811 COLS)

  +++--+   
+-+++  |   
|  |  ++--+
+--+--++ ++
      |  ||
      |  ||
++    +--++
++         

예상 출력 : 9

사례 4, 그래픽 : 사례 4( 120 픽셀 * 65 픽셀), ASCII ( 13 행, 24 COLS)

+--+--+ +--+  +--+  +--+
|  |  | |  |  |  |  |  |
+--+--+ |  |  |  |  |  |
|  |  | +--+--+--+--+--+
+--+--+    |  |  |  |   
           |  |  |  | ++
+-+-+-+-+  +--+  +--+ ++
| | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+

예상 출력 : 243

사례 5, 그래픽 :사례 5 ( 5 PX * 5 . 픽셀 예, 그것은 이다 ASCII!이) : 그냥 하나의 공간.

예상 출력 : 0

사례 6, 그래픽 : 사례 6( 35 px * 20 픽셀), ASCII ( 47 COLS)

+--+--+
|++|++|
|++|++|
+--+--+

예상 출력 : 5

가정

보다 쉽게 ​​생활 할 수 있도록 다음을 보장합니다.

  • 존재함으로써 비 환상 , 격자가 가로 또는 세로 중 포장하지 않는다.
  • 느슨한 끝이 없습니다. 예 : +--- 또는) +- -+. 모든 선분에는 두 개의 끝이 있습니다.
  • +해당 지점에서 만나는 두 선이 서로 교차해야합니다.
  • 유효하지 않은 입력에 대해 걱정할 필요가 없습니다.

표준 허점에 대한 규칙이 적용됩니다. 사각형을 사각형으로 취급하십시오. 선택적으로 그리드의 각 행에서 후행 공백을 제거 할 수 있습니다.

이것은 이므로 가능한 한 짧게 입력하십시오. 텍스트 기반 및 그래픽 솔루션은 서로 경쟁합니다.

리더 보드


흑백 비트 맵이 허용됩니까?
user202729

@ user202729 예. PNG가 아닌 이미지로 작업하도록 선택한 경우 답변에 해당 이미지를 지정하십시오.
Frenzy Li

유효한 입력? (사각형 모서리가 더 큰 사각형의 경계에 닿습니다.) 그렇다면 테스트 케이스로 추가하는 것이 좋습니다.
Zgarb

@Zgarb 유효한 입력입니다. 게시물도 수정하겠습니다.
Frenzy Li

스포일러에 예상 출력을 넣는 이유가 있습니까? 코드를 약간 더 성가 시게 확인하는 것처럼 보입니다.
FryAmTheEggman

답변:


4

Grime , 31 28 바이트

T=\+[+\-]*\+/[+|]/+$
n`T&To2

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

ASCII 형식으로 입력을받습니다.

설명

Grime의 구문은 정규식과 매우 유사합니다. 각 줄은 사각형 문자와 일치하거나 일치하지 않는 패턴을 정의합니다. T상단 행과 왼쪽 열이 유효 해 보이는 사각형과 일치합니다.

T=\+[+\-]*\+/[+|]/+$
T=                    Define T as
  \+[+\-]*\+          a row that matches this regex
            /         and below that
             [+|]/+   a column of + or |
                   $  with anything to its right.

두 번째 행은 "메인 프로그램"입니다.

n`T&To2
n`       Print number of rectangles that match
  T      the pattern T
   &     and
    To2  T rotated 180 degrees.

6

자바 스크립트 (ES6), (176) 171 바이트

g=a=>Math.max(...b=a.map(a=>a.length))-Math.min(...b)?``:f(a);f=
a=>a.map((b,i)=>[...b].map((_,j)=>n+=a.join`
`.split(eval(`/\\+(?=[-+]{${j}}\\+[^]{${l=b.length+~j}}([|+].{${j}}[|+][^]{${l}}){${i}}\\+[-+]{${j}}\\+)/`)).length>>1),n=0)|n
<textarea rows=8 cols=8 oninput=o.textContent=g(this.value.split`\n`)></textarea><pre id=o>

동일한 길이의 문자열 배열로 입력을받습니다. 설명 : 가능한 모든 너비와 높이의 사각형 (일부 불가능한 너비와 높이이지만 코드 코드 골프)과 일치하는 일련의 정규식을 작성하고 모두 일치하는 수를 계산합니다. 정규 표현식에 캡처 그룹이 있기 때문에 일치 항목을 split반환 2n+1하므로 n일치하지 않는 숫자를 얻기 위해 1만큼 오른쪽으로 이동하여 그룹을 캡처하지 않는 바이트를 절약합니다.


흠, 코드 스 니펫이 작동하지 않습니다 [Windows (64bit)에서 Firefox 54.0.1 (32bit) 또는 Chrome 60.0.3112.90 (64bit)].
Jonathan Allan

스 니펫 [Mac (64bit)]도 Safari에서 작동하지 않습니다.
Mr. Xcoder

2
텍스트 영역에 내용을 붙여 넣어야 할 것 같습니다. 한 줄에 같은 수의 문자가 필요합니다.
Frenzy Li

아 알 겠어, @FrenzyLi 좋은 자리!
Jonathan Allan

4

J , 103 95 86 80 76 70 바이트

[:+/@,]*/@('-|++'*/@(e.,&'+')~&>]({.,{:)&.>@;|:;{.;{:);._3"$~2+$#:i.@$

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

후행 공백이있는 문자열 배열로 입력을받습니다 (각 문자열의 크기가 동일 함). 용도 전체 부분 배열 연산자 ;._32 × 2보다 큰 모든 가능한 부분 배열의 크기를 반복하는, 그리고 카운트 유효한 사각형있는 하위 어레이를. 모든 테스트 사례를 거의 즉시 완료합니다.


1
@FrenzyLi 감사합니다. 이 함수는 입력을 문자열 배열로 수신하지만 각 배열에 각 문자열을 저장하여 함수의 인수로 사용하기 위해 각 변수에 저장하기 전에 배열로 재구성 된 플랫 문자열로 인코딩했습니다.
마일

아 ... 설명해 주셔서 감사합니다.
Frenzy Li

@ 마일 좋은. 입력을 문자열 배열로 말할 때 입력의 각 줄이 찌르는 것입니까?
요나

J의 @Jonah 문자열은 문자 배열 일 뿐이므로 입력은 실제로 2 차원 문자 배열입니다.
마일

3

매쓰, 136 (134) 132 바이트

S=Tr@*Flatten;S@Table[1-Sign@S@{d[[{i,j},k;;l]],d[[i;;j,{k,l}]]},{i,($=Length)[d=ImageData@#]},{j,i+1,$@d},{k,w=$@#&@@d},{l,k+1,w}]&

사용법 : (이전 136 ​​바이트 버전이지만 새 버전은 기본적으로 동일 함)

_

노트 :

  • 이것은 시간 O (m 2 n 2에서 실행 max (m, n))로 실행되므로 작은 입력 만 사용하십시오.
  • 이것은 이진 이미지로 작동해야하지만 비 이진 이미지에서도 작동 할 수 있습니다. (그러나 검은 색은 반드시 0이어야합니다)
  • 그래픽이 반드시 5x5 블록으로 구성되는 것은 아니며 블록이 더 작을 수 있습니다.
  • @*버전 10의 새로운 기능입니다. 이전 버전에서는 Tr~Composition~Flatten대신을 사용하십시오 Tr@*Flatten.

어떤 버전의 MMA 가 있습니까? 9.0에서 응답은"Tr@" cannot be followed by "*Flatten".
Frenzy Li

1
@FrenzyLi 10.0. 예, @*(속기는 Composition) 버전 10의 새로운
user202729

1
왜 그냥 사용하지 RectangleCount[]않습니까?
MCMastery

2
@MCMastery Mathematica는 많은 내장 기능을 가지고 있지만 유명하지는 않습니다.
user202729

@ user202729 lol yep, im jk
MCMastery

2

젤리 ,  60 53 52 51  50 바이트

ÑFQe⁹ṚẆ;W¤
Ḣ,Ṫ
=”+ÇÇ€Ạȧ1ŀ
Zç⁾+-ȧç⁾+|$
Ẇ;"/€Ẇ€Ç€€FS

문자열 목록 (길이가 같은 행)을 수락하고 개수를 인쇄하는 전체 프로그램.

온라인으로 사용해보십시오!
... 또는 복사 및 붙여 넣기가 용이하도록 전체 프로그램을사용 하십시오 (줄을 나누기위한 여분의 바이트 사용)
. 그러나 프로그램이 올바르게 작동하려면 줄에 후행 공백이 있어야합니다.

방법?

ÑFQe⁹ṚẆ;W¤   - Link 1, sidesAreValid?: list of lists, area; list allowedSideCharacters
Ñ            - call the next link (2) as a monad (get the sides in question
             -   note: these sides do not include the corners since the area was modified
             -   to not include the other sides by the first call to link 2 inside link 3.
 F           - flatten into a single list
  Q          - de-duplicate (unique characters)
         ¤   - nilad followed by link(s) as a nilad:
    ⁹        -   right argument (either "+-"                or "+|"               )
     Ṛ       -   reverse        (either "-+"                or "|+"               )
      Ẇ      -   all sublists   (either ["-","+","-+"]      or ["|","+","|+"]     )
        W    -   wrap           (either ["+-"]              or ["+|"]             )
       ;     -   concatenate    (either ["-","+","-+","+-"] or ["|","+","|+","+|"])
   e         - exists in?

Ḣ,Ṫ          - Link 2, topAndTail helper: list
Ḣ            - head (get the first element and modify the list)
  Ṫ          - tail (get the last element and modify the list)
 ,           - pair (the elements together)

=”+ÇÇ€Ạȧ1ŀ   - Link 3, isPartlyValid?: list of lists, area; list allowedSideCharacters
=”+          - equal to '+'? (vectorises across the whole area, 1 if so, 0 otherwise)
   Ç         - call the last link (2) as a monad (gets the values for two edges)
    Ç€       - call the last link (2) as a monad for €ach (...values for the four corners)
      Ạ      - all? (all corners are '+' 1 if so, 0 if not)
        1ŀ   - call link number 1 as a dyad with sideCharacters as the right argument
             -    ...and the modified area on the left
       ȧ     - logical and (both all corners are '+' and the sides in question look right)

Zç⁾+-ȧç⁾+|$  - Link 4, isValidSquare?: list of lists, area
Z            - transpose
 ç⁾+-        - call the last link (3) as a dyad with right argument "+-"
          $  - last two links as a monad:
      ç⁾+|   -   call the last link (3) as a dyad with right argument "+|"
     ȧ       - logical and (1 if so 0 otherwise)

Ẇ;"/€Ẇ€Ç€€FS - Main Link: list of lists of characters, rows
Ẇ            - all sublists (= all non-zero length runs of rows)
   /€        - reduce €ach by:
  "          -   zip with:
 ;           -     concatenation (= all non-zero length vertical edges)
     Ẇ€      - all sublists for €ach (= all possible areas)
       Ç€€   - call the last link (4) as a monad for €ach for €ach (for each area)
          F  - flatten
           S - sum


2

하스켈, 180 (167) 166 바이트

l=length
a%b=[a..b-1]
h c a g b=all(`elem`c)$g<$>[a..b]
f s|(#)<-(!!).(s!!)=sum[1|y<-1%l s,x<-1%l(s!!0),i<-0%y,j<-0%x,h"+|"i(#x)y,h"+-"j(y#)x,h"+|"i(#j)y,h"+-"j(i#)x]

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

네 개의 중첩 루프로 가능한 모든 모서리 위치를 살펴보고 그 사이의 줄에있는 모든 문자가 +-(수평) 또는 +|(수직) 으로 구성되어 있는지 확인하십시오 .


1

젤리 , 41 39 34 33 바이트

,Z;.ị$⁺€ḟ€"⁾-|Fḟ”+
ẆḊÐfZ€µ⁺€ẎÇÐḟL

온라인으로 사용해보십시오! 또는 모든 사례를 봅니다.

J의 대답 을 기반으로합니다.

설명

,Z;.ị$⁺€ḟ€"⁾-|Fḟ”+  Helper. Input: 2d array of characters
 Z                  Transpose
,                   Pair
  ;                   Concatenate with
     $                The tail and head
   .ị                   Select at index 0.5 -> Select at index 0 and 1
                        Jelly uses 1-based modular indexing, so
                        0 means to select the tail
      ⁺€              Repeat on each - This selects the last and first rows,
                      last and first columns, and the 4 corners
           ⁾-|       The string array ['-', '|']
          "          Vectorize
        ḟ€             Filter each
              F      Flatten
                ”+   The character '+'
               ḟ

ẆḊÐfZ€µ⁺€ẎÇÐḟL  Main. Input: 2d array of characters
      µ         Combine into a monad
Ẇ                 Generate all sublists
  Ðf              Filter for the values that are truthy (non-empty)
 Ḋ                  Dequeue
    Z€            Transpose each
       ⁺€       Repeat on each
         Ẏ      Tighten, join all lists on the next depth
          ÇÐḟ   Discard the values where executing the helper returns truthy
             L  Length

이제 34 바이트로 경쟁이 치열 해지기 시작했습니다.
마일
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.