Jedną z moich ulubionych matematycznych rozrywek jest narysowanie prostokątnej siatki, a następnie znalezienie wszystkich prostokątów widocznych na tej siatce. Proszę, odpowiedz na to pytanie i zaryzykuj dla siebie!
Czy potrafisz policzyć liczbę prostokątów?
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
Całkowita liczba prostokątów dla tej planszy do gry w mini-gry 4 x 4 jest dokładnie
100
Czy miałeś rację?
Powiązana matematyka: ile prostokątów jest na szachownicy 8 × 8?
Wyzwanie
Napisz najkrótszą funkcję / program, który zlicza całkowitą liczbę widocznych prostokątów na nie-toroidalnej siatce / obrazie .
Powiązane wyzwania: Policz unikalne prostokąty! , Znajdź liczbę prostokątów w tablicy bajtów 2D .
Format wejściowy
Twoja funkcja lub program może współpracować z wprowadzaniem tekstowym lub graficznym.
Wprowadzanie tekstu
Kratownica będzie M -by- N ( m rzędów n kolumn ASCII) siatkę składającą się z następujących postaci:
- spacje,
-
dla części poziomego odcinka linii,|
dla części pionowego odcinka linii oraz+
na zakręty.
Możesz wprowadzić tę siatkę ASCII jako dane wejściowe / argument do swojego programu / funkcji w postaci
- pojedynczy ciąg rozdzielany podziałami linii,
- ciąg bez znaków nowej linii, ale z jedną lub dwiema liczbami całkowitymi kodującymi wymiary siatki, lub
- tablica ciągów.
Uwaga: Dane tekstowe zawierają co najmniej 1 wiersz i co najmniej 1 kolumnę.
Dane graficzne
Alternatywnie, siatki są kodowane jako czarno-białe obrazy PNG o szerokości 5 * n pikseli i wysokości 5 * m pikseli. Każdy obraz składa się z bloków 5 pikseli * 5 pikseli, które odpowiadają wprowadzeniu ASCII przez:
- Spacje są konwertowane na białe bloki. Te bloki nazywane są blokami białych znaków .
- Segmenty linii i narożniki są przekształcane w niewyspecjalizowanych bloków -whitespace. Środkowy piksel takich bloków jest czarny.
- Edycja: Jeśli dwa rogi (na wejściu ASCII) są połączone segmentem linii, odpowiednie środki bloków (na wejściu graficznym) również powinny być połączone czarną linią.
Oznacza to, że każdy blok można wybrać tylko z (Kliknij tutaj, aby powiększyć obraz) .
Uwaga: Niebieskie granice służą wyłącznie celom ilustracyjnym. Dane graficzne mają co najmniej 5 pikseli szerokości i 5 pikseli wysokości. Możesz przekonwertować dane graficzne na dowolny obraz monochromatyczny, potencjalnie inny format pliku obrazu. Jeśli zdecydujesz się na konwersję, podaj w odpowiedzi. Nie ma kary za nawrócenie.
Format wyjściowy
Jeśli piszesz program, musi on wyświetlać nieujemną liczbę wskazującą całkowitą liczbę prostokątów na wejściu.
Jeśli piszesz funkcję, powinna również zwrócić nieujemną liczbę wskazującą całkowitą liczbę prostokątów na wejściu.
Przykłady przypadków
Przypadek 1, grafika: ( 30 px * 30 px), ASCII: ( 6 rzędów, 6 kol.)
+--+
| |
| ++-+
+-++ |
| |
+--+
Oczekiwany wynik: 3
Przypadek 2, grafika: ( 20 pikseli * 20 pikseli), ASCII: ( 4 rzędy, 4 kolumny)
++-+
|+++
+++|
+-++
Oczekiwany wynik: 6
Przypadek 3, grafika: ( 55 pikseli * 40 pikseli), ASCII: ( 8 rzędów, 11 kol.)
+++--+
+-+++ |
| | ++--+
+--+--++ ++
| ||
| ||
++ +--++
++
Oczekiwany wynik: 9
Przypadek 4, grafika: ( 120 pikseli * 65 pikseli), ASCII: ( 13 wierszy, 24 kolumny)
+--+--+ +--+ +--+ +--+
| | | | | | | | |
+--+--+ | | | | | |
| | | +--+--+--+--+--+
+--+--+ | | | |
| | | | ++
+-+-+-+-+ +--+ +--+ ++
| | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
Oczekiwany wynik: 243
Przypadek 5, grafika: ( 5 pikseli * 5 pikseli. Tak, jest tam!), ASCII: Tylko jedna spacja.
Oczekiwany wynik: 0
Przypadek 6, grafika: ( 35 pikseli * 20 pikseli), ASCII: ( 4 rzędy, 7 kolumn)
+--+--+
|++|++|
|++|++|
+--+--+
Oczekiwany wynik: 5
Założenia
Aby ułatwić Ci życie, masz gwarancję, że:
- Ponieważ nie jest toroidalna , siatka nie zawija się ani w poziomie, ani w pionie.
- Nie ma luźnych końcówek, np .
+---
Lub+- -+
. Wszystkie segmenty linii mają dwa końce. - Dwie linie, które się spotykają,
+
muszą się przecinać w tym punkcie. - Nie musisz się martwić o nieprawidłowe dane wejściowe.
Obowiązują zasady dotyczące standardowych luk. Traktuj kwadraty jak prostokąty. Opcjonalnie możesz usunąć końcowe spacje w każdym rzędzie siatki.
To jest golf golfowy , więc postaraj się , aby Twój wpis był jak najkrótszy. Rozwiązania tekstowe i graficzne będą ze sobą konkurować.