Czy ten ciąg jest kwadratem?

44

Ciąg uważa się za kwadratowy, jeśli spełnione są następujące warunki:

  • Każda linia ma taką samą liczbę znaków
  • Liczba znaków w każdej linii jest równa liczbie linii.

Twoim zadaniem jest napisanie programu lub funkcji, która określa, czy dany ciąg wejściowy jest kwadratem, czy nie.

Możesz wymagać ograniczenia danych wejściowych przez wybór LF, CR lub CRLF.

Znaki nowego wiersza nie są uważane za część długości linii.

Możesz wymagać, aby na wejściu pojawiał się znak nowej linii, ale nie jest to dodatkowy wiersz.

Dane wejściowe to tablica znaków lub 1D; nie jest to lista ciągów.

Możesz założyć, że dane wejściowe są niepuste i zawierają tylko drukowalny kod ASCII, w tym spacje.

Musisz podać prawdziwą wartość dla ciągów kwadratowych i fałsz dla innych ciągów.

Prawdziwe przypadki testowe:

bla
bar
baz
.
.s.
.ss
.s.
(s oznacza spację)
ss
ss
(s oznacza spację)
aaaaa
aaaaa
aaaaa
aaaaa
aaaaa

Przypadki testowe Falsy:

..
.
.

.
....


....
4444
333
22
333
333
abc.def.ghi

Zwróć uwagę na dodatkowe puste linie w niektórych przypadkach fałszowania.

To jest - wygrywa najmniej bajtów!

Pavel
źródło
Możliwy duplikat projektowania języka: 2-D dopasowanie wzoru . Problem nr 5 jest taki sam jak to pytanie.
mbomb007
1
@ mbomb007 Czuję, że różne kryteria wygranej sprawiają, że nie jest to duplikat? „Golfiness” było jednym z kryteriów głosowania, ale nie sądzę, aby odpowiedzi na to pytanie w dużej mierze odzwierciedlały te tutaj.
FryAmTheEggman
2
@ mbomb007 Głosuję za pozostawieniem tego pytania otwartym, ponieważ chociaż jest ono podzbiorem drugiego pytania, drugie pytanie jest ograniczone do języków utworzonych specjalnie dla tego pytania.
ETHproductions
2
@ mbomb007: To nie jest duplikat, ponieważ to pytanie wymaga zaprojektowania języka w celu udzielenia odpowiedzi na pytanie, zamiast odpowiedzi w istniejącym języku. Bardzo niewiele odpowiedzi tutaj byłoby legalnych.
1
@ mbomb007: To nie jest powód, aby zakończyć to wyzwanie i dać ludziom nigdzie nie zamieszczać odpowiedzi w istniejących językach. Może to potencjalnie stanowić argument za zamknięciem drugiego wyzwania (ponieważ jest to po prostu bardziej restrykcyjna wersja tego), chociaż uważam to za kiepski argument i uważam, że oba powinny pozostać otwarte.

Odpowiedzi:

19

Brachylog (2), 3 bajty

ṇẹṁ

Wypróbuj online!

Pełny program Wyjścia true.dla truthy, false.dla falsey.

Wyjaśnienie

ṇẹṁ
ṇ     Split {standard input} into lines
 ẹ    Split {each line} into basic elements {in this case, characters}
  ṁ   Assert that the result is square

Byłem nieco sceptycznie nastawiony do użyteczności wbudowanego, kiedy został dodany, ale tak naprawdę nie mogę zaprzeczyć, że jest on pomocny tutaj…

Brachylog (2), 7 bajtów

ṇẹ.\l~l

Wypróbuj online!

Niezintegrowane rozwiązanie. Nadal bije wszystkie inne wpisy, w momencie pisania. EDYCJA: Niezupełnie, wpis Jelly o równej długości wszedł, kiedy to pisałem, i pokonał go za pomocą znacznika czasu.

Wyjaśnienie

ṇẹ.\l~l
ṇ         Split {standard input} into lines
 ẹ        Split {each line} into basic elements {in this case, characters}
   \l     Assert that the result is rectangular, and the number of columns
  .  ~l     is equal to the number of rows

źródło
1
Właściwe narzędzie do pracy!
Pavel
10
= "Potwierdź, że wynik jest kwadratowy" :(
Erik the Outgolfer
5
Jakiś czas temu istniało wyzwanie, w którym starałem się napisać kwadrat assert ( .\l~lw tamtym czasie byłoby to coś podobnego , z wyjątkiem tego, że polecenie odwrotnego ukośnika, które między innymi twierdzi, że jego wejście jest prostokątem , zostało przerwane; Zauważ, że nawet jeśli zastąpi się .\l~l, to nadal najkrótszy program, tutaj, jeśli pomyśleć o tym, dodam, że na stanowisko). Polecenie odwrotnego ukośnika zostało naprawione, ale autor języka postanowił dodać jednocześnie kwadrat assert. Myślałem „z pewnością już nigdy więcej się nie pojawi”. Najwyraźniej się myliłem.
2
@Phoenix: Numer wersji języka, to nie będzie działać w Brachylog v1. Większość ludzi po prostu mówi „Brachylog” (tak jak większość ludzi mówi „Perl” zamiast „Perl 5”), ale przyzwyczaiłem się już jakiś czas temu, ponieważ używam Brachylog v1 w rzadkich przypadkach.
2
@ iFreilicht Jest źle, ponieważ oblega każdy inny język golfowy do tej pory.
Erik the Outgolfer
21

Python 2 , 52 bajty

x=input().split('\n')
print{len(x)}==set(map(len,x))

Wypróbuj online! lub Wypróbuj wszystkie przypadki testowe

Pręt
źródło
4
Uwielbiam fakt, że jest to zarówno gra w golfa, jak i czytelność.
jpmc26
Nie potrzebujesz '\n', po prostu zostaw to puste (ponieważ na wejściu nie ma spacji i tabulatorów).
12431234123412341234123
@ 12431234123412341234123 nie, to nie działa dla ciągów kwadratowych zawierających spacje !!!
Pan Xcoder,
@ Mr.Xcoder Czy musi współpracować ze spacjami? Jak zrozumiałem, na wejściu nigdy nie ma spacji.
12431234123412341234123
Źle zrozumiałeś specyfikację: możesz założyć, że dane wejściowe są niepuste i zawierają tylko ASCII do wydruku. , a białe znaki (``) można wydrukować w ASCII
Mr. Xcoder,
14

JavaScript (ES6), 46 45 bajtów

s=>!(s=s.split`
`).some(x=>x.length-s.length)

Wyjaśnienie

  1. Podziel ciąg na tablicę w znakach nowej linii.
  2. Pętla nad tablicą.
  3. Odejmij długość tablicy od długości każdej linii.
  4. Jeśli dla dowolnego wiersza zostanie zwrócona niezerowa (tj. Prawdziwa) wartość, łańcuch nie będzie kwadratowy.
  5. Neguj wynik pętli, aby uzyskać truekwadrat i falsenie.

Spróbuj

f=
s=>!(s=s.split`
`).some(x=>x.length-s.length)
oninput=_=>o.innerText=f(i.value)
o.innerText=f(i.value=`foo
bar
baz`)
<textarea id=i></textarea><pre id=o>

Kudłaty
źródło
3
Myślę, że możesz zaoszczędzić bajt dziękis=>!(s=s.split`\n`).some(x=>x.length-s.length)
ETHproductions
Dzięki, @ETHproductions. Mam okropny zwyczaj zwalniania !somez ręki, po prostu dlatego, że ma taką samą długość jak every.
Kudłaty
9

05AB1E , 10 8 bajtów

¶¡€gDgQP

Wypróbuj online!

-2 dzięki Rileyowi, to w zasadzie jego odpowiedź ._.

Code       # Explanation                  | Truthy Example          | Falsy Example
-----------#------------------------------+-------------------------+--------------
¶¡         # Split on newlines            | [['aaa','aaa','aaa']]   | [['aa']]
  €g       # Get length of each           | [[3,3,3]]               | [[2]]
    D      # Dupe                         | [[3,3,3],[3,3,3]]       | [[2],[2]]
     g     # Get length                   | [[3,3,3],3]             | [[2],1]
      Q    # Check equality               | [[1,1,1]]               | [[0]]
       P   # Take product                 | 1                       | 0
Urna Magicznej Ośmiornicy
źródło
@ Riley ahhh, niezły chwyt, mój oryginalny pomysł był bardziej podobny do tego, co miałeś, ale nieco inny. Powtórzyłem jeszcze dwa razy i nie złapałem mojego błędu matematycznego.
Magic Octopus Urn
Nie sądzę, aby „Nagłówek” był poprawnym formularzem na wejściu.
Pavel
@Phoenix jest , że lepiej?
Magic Octopus Urn
1
Dane wejściowe można również pobrać za pomocą trzech cytatów, takich jak ten .
Adnan
1
Jeśli uzyskasz długość każdego pierwszego, możesz uniknąć s. W ten sposób¶¡€gDgQP
Riley
9

Haskell, 38 34 bajtów

l=length
(all=<<(.l).(==).l).lines

Wypróbuj online!

Wersja punktowa f s = all ((==length (lines s)).length) (lines s), tzn. Podziel dane wejściowe na linie i sprawdź, czy długość każdej linii jest równa liczbie linii.

Edycja: Dzięki @xnor za 4 bajty.

nimi
źródło
1
Myślę, że można użyć alldo mapcelu wyciąć and..
xnor
9

Galaretka , 7 bajtów

ỴµL;L€E

Wypróbuj online!

Wyjaśnienie

Ỵµ       Split the input on newline and use as input in the second link     
  L      Get the number of list items
   ;     And append to that
    L€   A list with the legth of each list item
      E  Check to see if all items are equal.
Steenbergh
źródło
1
Twój link TIO wydaje się wskazywać, że nie powinien tam być końcowy znak nowej linii.
Pavel
@Phoenix naprawiono / przywrócono ...
steenbergh
To tylko sprawdza, czy wszystkie linie mają tę samą długość - w rzeczywistości nie bierze pod uwagę licznika nowej linii. Kiedy dotrzesz do atomu E, masz listę długości linii i to wszystko.
rozproszyć
@Christian naprawiono i skrócono. Przepraszam za zamieszanie, chyba coś poszło nie tak po tym, jak miałem działające rozwiązanie i próbowałem
zagrać w
9

Japt , 9 bajtów

=Ur.Q)¥Uy

Przetestuj online!

Wyjaśnienie

 =Ur.Q)¥ Uy
U=Ur.Q)==Uy
             // Implicit: U = input string, Q = quotation mark
U=    )      // Set U to
  Ur.Q       //   U with each non-newline (/./g) replaced with a quotation mark.
       ==Uy  // Return U == U transposed. U is padded to a rectangle with spaces before
             // transposing; if U was not a rectangle before, or the sides are not of
             // equal length, the result will not be the same as U.
             // Implicit: output result of last expression

W przypadku niektórych funkcji zaimplementowanych wkrótce po opublikowaniu tego wyzwania może to być 6 bajtów:

r.Q
¥y

Przetestuj online!

Wyjaśnienie

       // Implicit: U = input string
r.Q    // Replace each non-newline (/./g) in U with a quotation mark.
       // Newline: set U to the result.
¥      // Return U ==
 y     //   U transposed.
       // Implicit: output result of last expression
ETHprodukcje
źródło
Jak na świecie jesteś taki szybki?
całkowicie ludzki,
@ totalniehuman Natychmiast zobaczyłem pytanie, gdy tylko zostało opublikowane, i zajęło mi dwie minuty, aby wymyślić algorytm. Potem było tylko wdrażanie i publikowanie. (Też muszę wrócić do haha)
ETHproductions
Fajnie :) Wiedziałem, że yto rozwiązanie, ale moje przychodziło z jeszcze kilkoma bajtami.
Shaggy
Korzystanie z niektórych funkcji zaimplementowanych wkrótce po opublikowaniu tego wyzwania ” - Możesz teraz opublikować to jako swoją odpowiedź.
Kudłaty
7

Retina , 33 31 bajtów

.
.
^(.(.)*)(?<-2>¶\1)*$(?(2).)

Wypróbuj online! Objaśnienie: Pierwszy etap po prostu zmienia wszystkie drukowalne ASCII w ten sam znak, aby ułatwić dopasowanie. (Można to zrobić bez, ale jest to kod golfowy, a nie kodowy.) Drugi etap dopasowuje następnie co najmniej jeden znak w pierwszej linii. Jednak dla każdego dodatkowego znaku w pierwszym wierszu opcjonalnie dopasowuje nowy wiersz, a następnie kopię pierwszego wiersza. Ostatnia część wyrażenia powoduje niepowodzenie dopasowania, jeśli jest więcej kolumn niż wierszy.

Neil
źródło
Niestety, dane wyjściowe są prawdziwe dla tej skrzynki testowej .
Kritixi Lithos
@KritixiLithos Uważam, że przesłanie wymaga wprowadzenia nowego wiersza w danych wejściowych, co jest dozwolone.
Pavel
Uważam też, że użycie \S\n;zamiast pierwszego wiersza pozwala zaoszczędzić jeden bajt
Kritixi Lithos
@KritixiLithos Właściwie zastąpienie .przez .zapisuje dwa, ale dzięki.
Neil
@Neil To naprawdę sprytne!
Kritixi Lithos
6

Łuska , 6 bajtów

S≡T'a¶

Bierze ciąg i drukuje albo 1albo 0. Wypróbuj online! Pierwszy wiersz przechodzi przez przypadki testowe; usuń go, jeśli chcesz przetestować jedną wartość.

Wyjaśnienie

Husk to nowy funkcjonalny język golfa stworzony przeze mnie i Leo . Brakuje wielu funkcji, a prace rozwojowe trwają. Jego główną cechą jest sztywny system typu, który pozwala nam przeciążać funkcje wyższego rzędu.

Na wysokim poziomie program działa w następujący sposób:

S≡T'a¶  Define a function:
     ¶  split on newlines,
  T'a   transpose and pad to rectangle using character 'a',
 ≡      check if this has the same shape as
S       the split input.

Funkcja faktycznie sprawdza, czy dwie tablice mają ten sam kształt i taki sam rozkład elementów zgodnych z prawdą. W Husk wszystkie znaki z wyjątkiem bajtu zerowego są zgodne z prawdą i nie pojawią się w naszych danych wejściowych. Ponadto, Sjest S-syntezatora , funkcja, która przyjmuje jako wejścia dwóch funkcji, tu i T'ai zwraca nową funkcję, która mapuje xsię ≡(x)(T'a x). Wynik Sskłada się z , a funkcja ta jest domyślnie stosowana do danych wejściowych.

Skąd Husk wie, że powinien mieć zastosowanie Sdo następnej funkcji, ale powinien być złożony z funkcją po lewej? Proste: po prostu wypróbowuje każdą interpretację i wybiera tę, w której typy mają sens. Jest to wyjaśnione bardziej szczegółowo w dokumentacji Łuski .

Zgarb
źródło
5

Pure Bash (bez narzędzi), 55

mapfile -t a
for l in ${a[@]};{
((c+=${#l}^${#a[@]}))
}
  • mapfile wczytuje dane wejściowe do tablicy a
  • następnie liczba elementów tablicy jest XORowana przy każdej długości linii i pobierana suma. Dla idealnego kwadratu każdy wynik XOR (a więc i suma) będzie wynosił 0. Dla czegokolwiek innego wynik będzie wynosił> 0.

Odwrotne znaczenie jest zwracane jako kod powrotu powłoki (sprawdzaj za pomocą echo $?) - idealny kwadrat to 1, wszystko inne to 0.

Wypróbuj online (prawda) .

Wypróbuj online (falsy) .


Poprzednia odpowiedź przy użyciu eval-escape-extension hell, 78:

mapfile -t a
echo $[0$(eval eval echo +\\$\{#a[{0..$[${#a[@]}-1]}]}^${#a[@]})]

Wypróbuj online (prawda) .

Wypróbuj online (falsy) .

Cyfrowa trauma
źródło
5

Perl 6 , 27 bajtów

{.lines==all .lines».comb}

Sprawdza, czy liczba wierszy w ciągu wejściowym jest równa liczbie znaków w każdej linii.

Sean
źródło
czy to ignoruje znak nowej linii?
Khaled.K,
Tak, nowe linie nie są zwracane przez .linesmetodę.
Sean
4

Pyth, 7 bajtów

CImL1.z

Wypróbuj tutaj

Nie wymaga końca nowej linii. Zastępuje dane wejściowe tablicą 2D z 1s, gdzie 1 oznacza dowolny znak z oryginalnego wejścia. Następnie sprawdzamy, czy tablica nie uległa zmianie po transponowaniu (zastępując kolumny wierszami). Tylko kwadrat zwróci wartość true w takiej sytuacji.

FryAmTheEggman
źródło
4

Java (OpenJDK 8) ,96 91 90 87 bajtów

-5 bajtów dzięki @KevinCruijssen
-1 bajtów dzięki @TheLethalCoder
-2 bajtów dzięki @ OlivierGrégoire

a->java.util.Arrays.stream(a.split("\n")).allMatch(x->x.length()==a.split("\n").length)

Wypróbuj online!

Lękliwa Beluga
źródło
1
Możesz usunąć miejsce w String[]si możesz usunąć ,0w .split("\\n");dla -3 bajtów. I średnik / ;na samym końcu nie będziesz musiał liczyć, aby kolejne -1. Och, i obawiam się , że musisz podać java.util.przed siebie Arrays. Import / wykorzystanie jest również częścią liczby bajtów.
Kevin Cruijssen
1
Ponieważ zapomniałeś dołączyć java.util., zwykła pętla for for(String x:s)if(x.length()!=s.length)return 0>1;return 1>0;wydaje się być krótsza niż return java.util.Arrays.stream(s).anyMatch(l->l.length()!=s.length);.
Kevin Cruijssen
2
Czy to nie tylko \n?
TheLethalCoder
1
Powtarzanie a.split("\n")jest w rzeczywistości krótsze! a->java.util.Arrays.stream(a.split("\n")).allMatch(x->x.length()==a.split("\n").length)
Olivier Grégoire
2
Hmmm ... trochę więcej jest także obecnych pomiędzy lengi th(). Najwyraźniej pojawiają się najpierw po 60 znaku, a następnie co 20 znaków.
Olivier Grégoire
3

05AB1E , 7 bajtów

|€gDgQP

Wypróbuj online!

Erik the Outgolfer
źródło
Coś w rodzaju oszukiwania imo, to w zasadzie pobieranie ndanych wejściowych zamiast 1 i dlaczego moja pierwotna odpowiedź nie zadziałała.
Magic Octopus Urn
@ carusocomputing Nie, |oznacza „weź resztę danych wejściowych i podziel według nowych linii”, co w żaden sposób nie wymaga wielu danych wejściowych. Musisz traktować STDIN jako pojedyncze wejście.
Erik the Outgolfer
3

R , 57 bajtów

function(s)all(nchar(n<-strsplit(s,'
')[[1]])==length(n))

Anonimowa funkcja; Dzieli na nowe linie, oblicza długość każdej linii i sprawdza, czy wszystkie są takie same jak liczba linii.

Wypróbuj online!

Giuseppe
źródło
3

MATL , 14 12 bajtów

10H&XXot&n=h

Łańcuch wejściowy jest definiowany za pomocą konkatenacji łańcucha ( [...]) i za pomocą punktu kodowego 10reprezentującego LF. Na przykład ['aaa' 10 'bb']jest interpretowany w MATL jako ciąg 'aaa'połączony ze znakiem z punktem kodowym 10połączonym z ciągiem 'bb'.

Wyjście jest niepustym wektorem liczbowym, co jest prawdą wtedy i tylko wtedy, gdy wszystkie jego wpisy są niezerowe.

Wypróbuj online!

Wyjaśnienie

Rozważ wejście ['4444' 10 '333' 10 '22'].

10H   % Push 10 (code point of LF). Push 2
      % STACK: 10, 2
&XX   % Regexp with three arguments. First argument is implicit input (string);
      % second is 2, which indicates that we want to split the input; third is
      % 10, which is the character to split on. The result is a cell array of
      % matched strings
      % STACK: {'4444', '333', '22'}
o     % Concatenate into a numeric 2D array of code points, right-padding with
      % zeros if needed
      % STACK: [52 52 52 52; 51 51 51 0; 50 50 0 0]
t&n   % Duplicate. Push number of rows and number of columns
      % STACK: [52 52 52 52; 51 51 51 0; 50 50 0 0], 3, 4
=     % Are they equal?
      % STACK: [52 52 52 52; 51 51 51 0; 50 50 0 0], 0
h     % Concatenate into a row vector (in column-major order). Implicit display
      % STACK: [52 51 50 52 51 50 52 51 0 52 0 0 0]
Luis Mendo
źródło
3

R, 35 bajtów

all(nchar(x<-scan(,""))==length(x))

Pobiera dane wejściowe ze standardowego wejścia. Sprawdza, czy liczba znaków w każdym wierszu jest równa całkowitej liczbie wierszy. Zwraca TRUElub FALSEodpowiednio.

rturnbull
źródło
zwróć uwagę, że dane wejściowe muszą być zawinięte w cudzysłów, ponieważ może to spowodować przerwanie spacji w każdym wierszu.
Giuseppe
2

JavaScript (ES6), 48 bajtów

s=>(a=s.split`
`,a.every(l=>l.length==a.length))
kamoroso94
źródło
2

Pyth, 12 10 bajtów

!fnl.zlT.z

Zaoszczędź 2 bajty dzięki @FryAmTheEggman.

Wypróbuj online

Wyjaśnienie

!fnl.zlT.z
 f     T.z     Filter lines of the input
  nl.zl        whose length is not the number of lines
!              and return whether there are no such lines.
Mnemoniczny
źródło
2

QBIC , 43 bajty

{_?~_lA||h=h+1┘g=g+_lA|~g%_lA||_Xp]\_xg/h=h

Ja jestem zadowolony z tego, jak krótka pochodna QBasic mogła podjąć to wyzwanie.

Wyjaśnienie:

{_?       DO infinitely: ask the user for input, store as A$
~    |    IF
 _lA|       The length of A$   (implicitly <> 0)
h=h+1     Add 1 to our line counter
┘         (syntactic linebreak)
g=g+_lA|  Add the length of this line to the running total of line lengths
~      |  IF
 g%_lA|     The length of the running total modulo the length of the last string
            yields anything but 0, there is a discrepancy between earlier line
            lengths and this one.
_Xp]      THEN QUIT, printing 0, end IF
\         ELSE (refers to the LEN(A$), user didn't input anything.
_xg/h=h   QUIT (the inf. loop) printing -1 if the root of the chars is the row count
            or 0 if not.
Steenbergh
źródło
2

Pyth, 7 bajtów

qCC.z.z

Demonstracja

Dwukrotnie transponuj dane wejściowe ze obcięciem, a następnie sprawdź, czy wynik jest taki sam jak oryginał.

isaacg
źródło
2

Rubinowy, 50 bajtów

s=$<.read.split $/,-1;p [s.size]==s.map(&:size)|[]

Wypróbuj online!

Wyjaśnienie

  1. Podziel wejście na tablicę na nowej linii.
  2. Upewnij się, że tablica zawierająca tylko rozmiar tej tablicy jest równa tablicy zawierającej wszystkie rozmiary uniq (set union with empty array) wszystkich elementów w tej tablicy.
IngoAlbers
źródło
1
Uratuj postać za pomocą .split($/,-1);->.split $/,-1;
Christopher Lates
Zaoszczędź więcej, używając lineszamiast, reada potem split(ale wtedy musisz dodać 1, sizeponieważ linie zawierają końcowy znak nowej linii)
GB
1

Clojure, 58 bajtów

#(let[s(re-seq #"[^\n]+"%)c count](apply =(c s)(map c s)))

Wymaga końca nowej linii, nie mogę się doczekać, aby zobaczyć coś bardziej magicznego.

NikoNyrh
źródło
1

APL (Dyalog) , 17 bajtów

Wymaga ⎕ML←3ustawienia domyślnego w wielu systemach. Używa CR.

↓∘⎕FMT≡⎕TC[2]∘≠⊂⊢

Wypróbuj online!

↓∘⎕FMT [to] podział na linie F lub m a t ted-do-A-kwadrat argumentu

 identyczny z

⎕TC[2]∘≠ znaki w grupach nie-nowej linii *

 podzielony na partycje

 argument?

* Drugi element listy T erminal c znaków kontroli twoj ego.


W wersji 16.0 można pisać za ↓∘⎕FMT≡⎕TC[3]∘≠⊆⊢pomocą ⎕ML←1.

Adám
źródło
Ciekawe co jest ⎕ML?
Pavel
1
@Phoenix W Dyalog APL APL + M igration L evel jest szorstka miarą dialektycznego ruchu w kierunku APL2 IBM. Im wyższa liczba, tym bardziej język przypomina APL2. Ludzie migrujący z APL2 do innych APL mają tendencję do biegania z wysokim ⎕ML, podczas gdy ludzie, którzy zaczynali z innymi APL mają tendencję do biegania z niskim ⎕ML.
Adám
1

PowerShell, 64 bajty

To samo podejście (podział, długości linii, liczba linii) jak w innych odpowiedziach w języku innym niż golf, ale nie ma fajnego odpowiednika map (), więc jest to tablica długości linii z liczbą linii oznaczonych na końcu, a następnie ta tablica jest zgrupowane. Kwadraty wychodzą jak 3,3,3,3 -> 1 group, all line lengths and line count were equali nie-kwadraty wychodzą jak 3,2,1 -> 3 groups, coś było nierówne na kwadracie:

$f={@(@(($L="$args"-split"`n")|% le*)+$L.Count|group).Count-eq1}

Wymaga zakończenia nowej linii w stylu Linux, bez końcowego znaku nowej linii. na przykład

$Ttests = @(@'
foo
bar
baz
'@,
'.',
@'
aaaaa
aaaaa
aaaaa
aaaaa
aaaaa
'@
)
$Ttests = $Ttests | foreach {$_ -replace "`r"}

$Ttests | % { & $f $_ }

(I możesz zrobić podobnie dla fałszywych testów, ale nie umieszczę tego tutaj, ponieważ jest ich więcej). Kilka @symboli jest wymaganych, gdy wejście jest pojedynczym, w '.'przeciwnym razie rozdzielenie nie tworzy tablicy jednego łańcucha, tylko jeden łańcuch, a następnie konkatenacja tablicy nie 1,1generuje danych wyjściowych 2.

Miałem nadzieję, że krótsze może być zastąpienie wszystkich znaków „a”, a następnie brutalna siła od 1 do długości wejściowej wszystkich kwadratów „a” i sprawdzenie, czy jakikolwiek pasuje do danych wejściowych. Po przejściu przez param () i .Length oraz -join i -replace kończy się to znacznie dłużej na 81 bajtach:

$f={param($s)!!(1..$s.Length|?{,('a'*$_)*$_-join"`n"-eq($s-replace"[^`n]",'a')})}
TessellatingHeckler
źródło
1

Brud , 11 bajtów

e`.|_./+/.+

Wydruki 1na kwadraty i 0na kwadraty. Wypróbuj online!

Wyjaśnienie

Szczegółowe wyjaśnienie można znaleźć na stronie samouczka Grime , która zawiera przykładowy program.

e`.|_./+/.+
e`            Match entire input against pattern:
  .           A single character
   |          OR
    _         a recursive match of this pattern
     ./+      with one column of characters on its right
        /     and below that
         .+   one row of characters.
Zgarb
źródło