Apakah string ini kotak?

44

String dianggap persegi jika kondisi berikut dipenuhi:

  • Setiap baris memiliki jumlah karakter yang sama
  • Jumlah karakter pada setiap baris sama dengan jumlah baris.

Tugas Anda adalah menulis program atau fungsi yang menentukan apakah string input yang diberikan adalah kuadrat atau tidak.

Anda mungkin memerlukan input untuk dibatasi oleh LF, CR, atau CRLF pilihan Anda.

Karakter baris baru tidak dianggap sebagai bagian dari panjang garis.

Anda mungkin memerlukan ada atau tidak menjadi baris baru di input, yang tidak dihitung sebagai baris tambahan.

Input adalah string atau array char 1D; ini bukan daftar string.

Anda dapat menganggap input tidak kosong dan hanya berisi ASCII yang dapat dicetak, termasuk spasi.

Anda harus menampilkan nilai kebenaran untuk string kuadrat dan yang salah untuk string lainnya.

Kasus uji kebenaran:

foo
bar
baz
.
.s.
.ss
.s.
(s mewakili spasi)
ss
ss
(s mewakili spasi)
aaaaa
aaaaa
aaaaa
aaaaa
aaaaa

Kasus uji palsu:

..
.
.

.
....


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

Perhatikan baris kosong ekstra dalam beberapa kasus palsu.

Ini adalah - byte terkecil menang!

Pavel
sumber
Kemungkinan rangkap dari Desain Bahasa: Pencocokan Pola 2-D . Masalah # 5 sama dengan pertanyaan ini.
mbomb007
1
@ mbomb007 Saya merasa seperti kriteria kemenangan yang berbeda membuat ini bukan duplikat? "Golfiness" adalah salah satu kriteria pemungutan suara, tetapi saya tidak berpikir jawaban untuk pertanyaan itu sebagian besar akan mencerminkan yang ada di sini.
FryAmTheEggman
2
@ mbomb007 Saya memberikan suara untuk membiarkan pertanyaan ini terbuka karena, sementara itu adalah himpunan bagian dari pertanyaan lain, pertanyaan lain dibatasi untuk bahasa yang dibuat khusus untuk pertanyaan itu.
ETHproduk
2
@ mbomb007: Itu bukan duplikat, karena pertanyaan itu meminta Anda mendesain bahasa untuk tujuan menjawab pertanyaan, alih-alih menjawab dalam bahasa yang sudah ada. Sangat sedikit jawaban di sini yang legal di sana.
1
@ mbomb007: Itu bukan alasan untuk menutup tantangan ini , dan memberikan orang tempat untuk memposting jawaban mereka dalam bahasa yang sudah ada sebelumnya. Mungkin berpotensi menjadi argumen untuk menutup tantangan lain (karena ini hanya versi yang lebih ketat dari yang satu ini), meskipun saya menganggapnya sebagai argumen yang buruk dan percaya keduanya harus dibiarkan terbuka.

Jawaban:

19

Brachylog (2), 3 byte

ṇẹṁ

Cobalah online!

Program lengkap. Keluaran true.untuk kebenaran, false.untuk falsey.

Penjelasan

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

Saya agak skeptis tentang kegunaan builtin ketika ditambahkan, tetapi saya tidak dapat benar-benar menyangkal bahwa ini sangat membantu di sini ...

Brachylog (2), 7 byte

ṇẹ.\l~l

Cobalah online!

Solusi non-builtin. Masih mengalahkan semua entri lainnya, pada saat penulisan. EDIT: Tidak cukup, entri Jelly dengan panjang yang sama masuk saat saya menulis ini, dan mengalahkannya melalui tiebreak timestamp.

Penjelasan

ṇẹ.\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

sumber
1
Alat yang tepat untuk pekerjaan itu!
Pavel
10
= "Tegaskan bahwa hasilnya kuadrat" :(
Erik the Outgolfer
5
Ada tantangan beberapa waktu yang lalu di mana saya berjuang untuk menulis kotak- .\l~ltegas (itu akan menjadi sesuatu seperti pada saat itu, kecuali bahwa perintah backslash, yang antara lain menyatakan bahwa inputnya adalah persegi panjang , telah rusak; perhatikan bahwa meskipun kita ganti dengan .\l~l, ini masih merupakan program terpendek di sini; kalau dipikir-pikir, saya akan menambahkannya ke posting). Perintah backslash diperbaiki, tetapi penulis bahasa memutuskan untuk menambahkan kotak-tegas pada saat yang sama. Saya berpikir "pasti itu tidak akan pernah muncul lagi". Ternyata saya salah.
2
@Phoenix: Nomor versi bahasa, ini tidak akan berfungsi di Brachylog v1. Kebanyakan orang hanya mengatakan "Brachylog" (seperti kebanyakan orang mengatakan "Perl" daripada "Perl 5"), tetapi saya terbiasa dengan kebiasaan itu beberapa waktu lalu karena saya menggunakan Brachylog v1 pada kesempatan yang jarang.
2
@ iFreilicht Ini buruk karena mengungguli setiap bahasa golf lainnya sejauh ini.
Erik the Outgolfer
21

Python 2 , 52 byte

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

Cobalah online! atau Coba semua test case

tongkat
sumber
4
Saya suka fakta bahwa ini golf dan mudah dibaca.
jpmc26
Anda tidak perlu '\n', biarkan saja kosong (karena tidak ada spasi dan tab di input).
12431234123412341234123
@ 12431234123412341234123 tidak, itu tidak berfungsi untuk string persegi yang berisi spasi !!!
Tn. Xcoder
@ Mr.Xcoder Haruskah ini berfungsi dengan spasi? Seperti yang saya mengerti tidak pernah ada spasi di input.
12431234123412341234123
Anda salah memahami spesifikasi: Anda dapat menganggap input tidak kosong dan hanya berisi ASCII yang dapat dicetak. , dan spasi putih (``) dapat dicetak ASCII
Tn. Xcoder
14

JavaScript (ES6), 46 45 byte

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

Penjelasan

  1. Pisahkan string ke array pada baris baru.
  2. Ulangi array.
  3. Kurangi panjang array dari panjang setiap baris.
  4. Jika nilai bukan nol (yaitu, kebenaran) dikembalikan untuk setiap baris, string tidak kuadrat.
  5. Meniadakan hasil dari loop untuk mendapatkan truekuadrat dan falseuntuk tidak.

Cobalah

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>

Shaggy
sumber
3
Saya pikir Anda dapat menyimpan byte dengans=>!(s=s.split`\n`).some(x=>x.length-s.length)
ETHproduk
Terima kasih, @ETHproductions. Saya memiliki kebiasaan yang sangat buruk untuk menolak begitu !somesaja, hanya karena panjangnya sama every.
Shaggy
9

05AB1E , 10 8 byte

¶¡€gDgQP

Cobalah online!

-2 Berkat Riley, ini pada dasarnya jawabannya ._.

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
Guci Gurita Ajaib
sumber
@Riley ahhh, tangkapan yang bagus, ide awal saya lebih sesuai dengan apa yang Anda miliki tetapi sedikit berbeda. Iterasi dua kali lagi dan tidak menangkap kesalahan matematika saya.
Magic Gurita Guci
Saya tidak berpikir "Header" adalah formulir yang valid pada input.
Pavel
@Phoenix apakah itu lebih baik?
Magic Gurita Guci
1
Input juga dapat diambil dengan tiga kutipan, seperti ini .
Adnan
1
Jika Anda mendapatkan panjang masing-masing pertama Anda dapat menghindari s. Seperti ini¶¡€gDgQP
Riley
9

Haskell, 38 34 byte

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

Cobalah online!

Versi pointfree f s = all ((==length (lines s)).length) (lines s), yaitu membagi input menjadi beberapa baris dan memeriksa apakah panjang setiap baris sama dengan jumlah baris.

Sunting: Terima kasih kepada @xnor selama 4 byte.

nimi
sumber
1
Saya pikir Anda dapat menggunakan alluntuk mapmemotong and..
xnor
9

Jelly , 7 byte

ỴµL;L€E

Cobalah online!

Penjelasan

Ỵµ       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
sumber
1
TIO Link Anda tampaknya menunjukkan bahwa tidak ada baris baru yang tertinggal di sana.
Pavel
@Phoenix diperbaiki / dikembalikan ...
steenbergh
Ini hanya memeriksa untuk melihat apakah semua baris memiliki panjang yang sama - sebenarnya tidak memperhitungkan jumlah baris baru sama sekali. Ketika Anda mencapai atom E, Anda memiliki daftar panjang garis dan hanya itu.
bubar
@ Kristen diperbaiki dan dipersingkat. Maaf karena kebingungan, saya kira ada yang salah setelah saya punya solusi yang berhasil dan saya mencoba bermain golf itu ..
steenbergh
9

Japt , 9 byte

=Ur.Q)¥Uy

Uji secara online!

Penjelasan

 =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

Menggunakan beberapa fitur yang diimplementasikan tidak lama setelah tantangan ini diposting, ini bisa 6 byte:

r.Q
¥y

Uji secara online!

Penjelasan

       // 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
Produksi ETH
sumber
Bagaimana kamu begitu cepat?
totallyhuman
@ sebenarnya manusia saya kebetulan melihat pertanyaan saat itu diposting, dan saya butuh dua menit untuk datang dengan algoritma. Setelah itu baru mengimplementasikan dan memposting. (Juga saya punya beberapa hal untuk kembali ke haha)
ETHproduk
Bagus :) Saya tahu yadalah solusinya tetapi milik saya datang dengan beberapa byte lagi.
Shaggy
" Menggunakan beberapa fitur yang diimplementasikan tidak lama setelah tantangan ini diposting " - Anda sekarang dapat mempostingnya sebagai asnwer Anda.
Shaggy
7

Retina , 33 31 byte

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

Cobalah online! Penjelasan: Tahap pertama hanya mengubah semua ASCII yang dapat dicetak menjadi karakter yang sama agar lebih mudah dicocokkan. (Bisa dilakukan tanpa, tapi ini golf kode, bukan tantangan kode.) Tahap kedua cocok dengan setidaknya satu karakter di baris pertama. Namun, untuk setiap karakter tambahan di baris pertama, maka secara opsional cocok dengan baris baru diikuti oleh salinan dari baris pertama. Bagian terakhir dari ekspresi menyebabkan kecocokan gagal jika ada lebih banyak kolom daripada baris.

Neil
sumber
Sayangnya, output ini benar untuk testcase ini .
Kritixi Lithos
@ KritixiLithos Saya yakin kiriman ini membutuhkan garis baru di input, yang diizinkan.
Pavel
Juga saya percaya menggunakan \S\n;bukannya baris pertama menghemat satu byte
Kritixi Lithos
@ KritixiLithos Sebenarnya mengganti .dengan .menghemat dua, tapi terima kasih.
Neil
@ Neil Itu benar-benar pintar!
Kritixi Lithos
6

Sekam , 6 byte

S≡T'a¶

Mengambil string dan mencetak salah satu 1atau 0. Cobalah online! Baris pertama beralih pada kasus uji; hapus jika Anda ingin menguji pada satu nilai.

Penjelasan

Husk adalah bahasa golf fungsional baru yang dibuat oleh saya dan Leo . Ini kehilangan banyak fitur dan pengembangan sedang berlangsung. Fitur utamanya adalah sistem tipe kaku yang memungkinkan kita untuk membebani fungsi tingkat tinggi.

Pada tingkat tinggi, program ini bekerja seperti ini:

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.

Fungsi sebenarnya memeriksa apakah dua array memiliki bentuk yang sama dan distribusi elemen kebenaran yang sama. Dalam Sekam, semua karakter kecuali byte nol adalah benar, dan itu tidak akan terjadi pada input kami. Juga, Sadalah S-combinator , fungsi yang mengambil sebagai masukan dua fungsi, di sini dan T'a, dan kembali fungsi baru yang peta xuntuk ≡(x)(T'a x). Hasil Sdisusun dengan , dan fungsi itu diterapkan pada input secara implisit.

Bagaimana Husk tahu bahwa itu harus berlaku Suntuk fungsi berikutnya, tetapi harus disusun dengan fungsi di sebelah kirinya? Sederhana: itu hanya mencoba setiap interpretasi dan memilih satu di mana jenisnya masuk akal. Ini dijelaskan lebih detail dalam dokumentasi Husk .

Zgarb
sumber
5

Bash murni (tanpa utilitas), 55

mapfile -t a
for l in ${a[@]};{
((c+=${#l}^${#a[@]}))
}
  • mapfile membaca input ke dalam array a
  • maka jumlah elemen array adalah XOR dengan masing-masing panjang garis, dan jumlah yang diambil. Untuk kuadrat sempurna, setiap hasil XOR (dan dengan demikian jumlahnya) akan menjadi 0. Untuk hal lain, hasilnya adalah> 0.

Rasa kebalikan dari ini dikembalikan sebagai kode pengembalian shell (periksa dengan echo $?) - kuadrat sempurna adalah 1, yang lainnya adalah 0.

Cobalah online (benar) .

Cobalah secara online (falsy) .


Jawaban sebelumnya menggunakan eval-escape-expansion hell, 78:

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

Cobalah online (benar) .

Cobalah secara online (falsy) .

Trauma Digital
sumber
5

Perl 6 , 27 byte

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

Menguji apakah jumlah baris dalam string input sama dengan jumlah karakter pada setiap baris.

Sean
sumber
apakah ini mengabaikan karakter baris baru?
Khaled.K
Ya, baris baru tidak dikembalikan oleh .linesmetode.
Sean
4

Pyth, 7 byte

CImL1.z

Coba di sini

Tidak memerlukan trailing newline. Mengganti input dengan array 2D 1s di mana 1 mewakili karakter apa pun di input asli. Kemudian kami memeriksa apakah array itu tidak berubah setelah mentransposnya (mengganti kolom dengan baris). Hanya persegi yang akan mengembalikan true dalam situasi seperti itu.

FryAmTheEggman
sumber
4

Java (OpenJDK 8) ,96 91 90 87 byte

-5 byte berkat @KevinCruijssen
-1 byte terima kasih ke @TheLethalCoder
-2 byte terima kasih kepada @ OlivierGrégoire

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

Cobalah online!

Bashful Beluga
sumber
1
Anda dapat menghapus spasi di String[]sdan Anda dapat menghapus ,0di .split("\\n");untuk -3 byte. Dan titik koma / ;di akhir Anda tidak perlu menghitung, sehingga -1 lain. Oh, dan Anda harus memasukkan java.util.di depan Arrayssaya takut. Impor / usings juga merupakan bagian dari byte-count.
Kevin Cruijssen
1
Karena Anda lupa menyertakan java.util., hanya untuk-loop biasa seperti ini for(String x:s)if(x.length()!=s.length)return 0>1;return 1>0;tampaknya lebih pendek dari return java.util.Arrays.stream(s).anyMatch(l->l.length()!=s.length);.
Kevin Cruijssen
2
Bukankah itu adil \n?
TheLethalCoder
1
Mengulangi a.split("\n")sebenarnya lebih pendek! a->java.util.Arrays.stream(a.split("\n")).allMatch(x->x.length()==a.split("\n").length)
Olivier Grégoire
2
Hmmm ... ada lagi yang hadir antara lengdan th(). Jadi ternyata, mereka muncul pertama kali setelah karakter ke-60 lalu setiap 20 karakter.
Olivier Grégoire
3

05AB1E , 7 byte

|€gDgQP

Cobalah online!

Erik the Outgolfer
sumber
Jenis kecurangan imo, itu pada dasarnya mengambil ninput bukannya 1 dan mengapa jawaban asli saya tidak berhasil.
Magic Gurita Guci
@carusocomputing Tidak, |berarti "ambil sisa input dan bagi dengan baris baru" yang sama sekali tidak mengambil banyak input. Anda hanya perlu memperlakukan STDIN sebagai satu input.
Erik the Outgolfer
3

R , 57 byte

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

Fungsi anonim; Membagi baris baru, menghitung panjang setiap baris, dan memeriksa apakah semua sama dengan jumlah baris.

Cobalah online!

Giuseppe
sumber
3

MATL , 14 12 byte

10H&XXot&n=h

String input didefinisikan menggunakan string concatenation ( [...]) dan dengan titik kode 10untuk mewakili LF. Sebagai contoh, ['aaa' 10 'bb']ditafsirkan dalam MATL sebagai string yang disatukan 'aaa'dengan karakter dengan titik kode yang 10disatukan dengan string 'bb'.

Output adalah vektor numerik yang tidak kosong, yang truthy jika dan hanya jika semua entri yang non-nol.

Cobalah online!

Penjelasan

Pertimbangkan input ['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
sumber
3

R, 35 byte

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

Mengambil input dari stdin. Periksa bahwa jumlah karakter di setiap baris sama dengan jumlah total baris. Pengembalian TRUEatau yang FALSEsesuai.

rturnbull
sumber
perhatikan bahwa input harus dibungkus dengan tanda kutip atau ini mungkin memecah spasi dalam setiap baris.
Giuseppe
2

JavaScript (ES6), 48 byte

s=>(a=s.split`
`,a.every(l=>l.length==a.length))
kamoroso94
sumber
2

CJam, 11 byte

qN/:,_,f=:*

Cobalah online!

Buah Esolanging
sumber
2

Pyth, 12 10 byte

!fnl.zlT.z

Disimpan 2 byte berkat @FryAmTheEggman.

Cobalah online

Penjelasan

!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.
Mnemonik
sumber
2

QBIC , 43 byte

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

Saya, saya senang dengan betapa singkatnya turunan QBasic untuk menghadapi tantangan ini.

Penjelasan:

{_?       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
sumber
2

Pyth, 7 byte

qCC.z.z

Demonstrasi

Transposkan input dengan pemotongan dua kali, lalu periksa apakah hasilnya sama dengan aslinya.

isaacg
sumber
2

Ruby, 50 byte

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

Cobalah online!

Penjelasan

  1. Membagi input menjadi array pada baris baru.
  2. Menyatakan bahwa array yang hanya berisi ukuran array ini sama dengan array yang berisi semua ukuran uniq (set union with array kosong) semua elemen dalam array ini.
IngoAlbers
sumber
1
Simpan karakter dengan .split($/,-1);->.split $/,-1;
Christopher Lates
Simpan lebih banyak dengan menggunakan linesalih-alih readkemudian split(tetapi kemudian Anda harus menambahkan 1 sizekarena baris-baris menyertakan baris baru)
GB
1

Clojure, 58 byte

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

Membutuhkan baris baru, menantikan untuk melihat sesuatu yang lebih ajaib.

NikoNyrh
sumber
1

APL (Dyalog) , 17 byte

Membutuhkan ⎕ML←3yang default pada banyak sistem. Menggunakan CR.

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

Cobalah online!

↓∘⎕FMT [adalah] split-ke-garis F atau m a t ted-ke-a-persegi argumen

 sama dengan

⎕TC[2]∘≠ karakter -kelompok-ke-non-baris-baru *

 dipartisi

 argumen?

* Elemen kedua dari daftar T erminal C ontrol karakter.


Dalam versi 16.0, satu dapat menulis ↓∘⎕FMT≡⎕TC[3]∘≠⊆⊢dengan ⎕ML←1.

Adm
sumber
Penasaran, apa ⎕ML?
Pavel
1
@Phoenix Dalam Dyalog APL dan APL +, M igration L Evel adalah ukuran kasar untuk gerakan dialektis di arah APL2 IBM. Semakin tinggi angkanya, semakin mirip APL2 bahasa. Orang yang bermigrasi dari APL2 ke APL lain cenderung berjalan dengan tinggi ⎕ML, sementara orang yang memulai dengan APL lain cenderung menjalankan dengan rendah ⎕ML.
Adám
1

PowerShell, 64 byte

Pendekatan yang sama (split, panjang garis, jumlah baris) seperti jawaban bahasa non-golf lainnya, tetapi tidak ada peta yang bagus () yang setara, jadi ini adalah array panjang garis dengan jumlah garis yang ditandai di bagian akhir, lalu array itu dikelompokkan. Kotak keluar seperti 3,3,3,3 -> 1 group, all line lengths and line count were equaldan non-kotak keluar seperti 3,2,1 -> 3 groups, ada sesuatu yang tidak sama di alun-alun:

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

Membutuhkan ujung gaya Linux baris baru, tanpa garis akhir baris baru. misalnya

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

$Ttests | % { & $f $_ }

(Dan Anda dapat melakukan hal yang sama untuk tes palsu, tapi saya tidak akan menaruhnya di sini karena ada lebih banyak dari mereka) Pasangan @simbol diperlukan ketika input adalah tunggal '.'jika tidak membaginya tidak membuat array dari satu string, itu hanya membuat satu string, dan kemudian array array tidak menghasilkan 1,1output 2.

Saya berharap mungkin lebih pendek untuk mengganti semua karakter dengan 'a', dan kemudian brute force dari 1 ke Input Length semua kotak 'a' dan lihat apakah ada yang cocok dengan input. Setelah saya melewati param () dan .Length dan -join dan -replace berakhir lebih lama lagi pada 81 byte:

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

Grime , 11 byte

e`.|_./+/.+

Mencetak 1untuk kotak dan 0untuk non-kotak. Cobalah online!

Penjelasan

Penjelasan terperinci dapat ditemukan di halaman tutorial Grime , yang kebetulan berisi program yang tepat ini sebagai contoh.

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
sumber