この文字列は正方形ですか?


44

次の条件が満たされる場合、文字列は正方形と見なされます。

  • 各行の文字数は同じです
  • 各行の文字数は、行数と同じです。

あなたの仕事は、与えられた入力文字列が正方形かどうかを決定するプログラムまたは関数を書くことです。

LF、CR、またはCRLFの選択により、入力を区切る必要がある場合があります。

改行文字は、行の長さの一部とは見なされません。

入力に末尾の改行があるかどうかを要求する場合がありますが、これは追加行としてカウントされません。

入力は文字列または1D文字配列です。文字列のリストではありません。

入力は空ではなく、スペースを含む印刷可能なASCIIのみを含むと想定できます。

正方形の文字列には真理値を、他の文字列には偽の値を出力する必要があります。

真実のテストケース:

foo
バー
バズ
.s。
.ss
.s。
(sはスペースを表します)
ss
ss
(sはスペースを表します)
ああああ
ああああ
ああああ
ああああ
ああああ

偽のテストケース:

..
。
....


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

いくつかの偽のケースで余分な空白行に注意してください。

これは -最少バイトが勝ちます!


言語設計の重複の可能性:2-Dパターンマッチング。問題#5はこの質問と同じです。
mbomb007

1
@ mbomb007私は、異なる勝利基準がこれを複製ではないと感じていますか?「ゴルフ」は投票基準の1つでしたが、その質問に対する回答がここの回答に大きく反映されるとは思いません。
FryAmTheEggman

2
@ mbomb007この質問は、他の質問のサブセットですが、他の質問はその質問専用に作成された言語に制限されているため、この質問を開いたままにしておきます。
ETHproductions

2
@ mbomb007:それは重複ではありません。その質問では、既存の言語で答えるのではなく、質問に答えるために言語を設計するように求められるからです。ここでの答えはごくわずかです。

1
@ mbomb007:だからといって、この課題を終わらせ、既存の言語で回答を投稿する場所を人々に提供する理由はありません。私はそれを貧弱な議論と考えて、両方を開いたままにしておくべきだと信じていますが、それは潜在的に他の挑戦を閉じるための議論かもしれません(この挑戦のより制限的なバージョンだからです)。

回答:


19

Brachylog(2)、3バイト

ṇẹṁ

オンラインでお試しください!

完全なプログラム。true.偽りのための真実のfalse.ための出力。

説明

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

追加されたときの組み込みの有用性については少し懐疑的でしたが、ここで役立つことを本当に否定することはできません…

Brachylog(2)、7バイト

ṇẹ.\l~l

オンラインでお試しください!

非組み込みソリューション。執筆時点で、他のすべてのエントリを依然として上回っています。編集:そうではありませんが、私がこれを書いている間に同じ長さのJellyエントリが入り、タイムスタンプタイブレークを介してそれを打ち負かしました。

説明

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

1
仕事のための正しいツール!
パベル

10
=「結果が正方形であることをアサート」:(
エリック・ザ・アウトゴルファー

5
私はアサートスクエアを書くのに苦労していたしばらく前に挑戦がありました(.\l~lその入力は長方形であると断言するバックスラッシュコマンドが壊れていたことを除いて、それは当時のようなものだったでしょう;我々は交換する場合でも、そのノート.\l~l、これはまだ私はポストにそれを追加します、考えてみると);ここでは最短のプログラム。バックスラッシュコマンドは修正されましたが、言語の作成者はアサートスクエアを同時に追加することにしました。私は「確かにそれは二度と起こらない」と考えていました。どうやら私は間違っていた。

2
@Phoenix:言語のバージョン番号。これはBrachylog v1では機能しません。ほとんどの人は「Brachylog」と言うだけです(ほとんどの人が「Perl 5」ではなく「Perl」と言うのと同じです)が、まれにBrachylog v1を使用するので、しばらく習慣になりました。

2
@iFreilichtこれは、これまでのところ他のすべてのゴルフ言語を凌olfしているため、悪いことです。
エリックアウトゴルファー

21

Python 2、52バイト

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

オンラインでお試しください!またはすべてのテストケースを試す


4
これはゴルフで読みやすいという事実が大好きです。
jpmc26

を使用する必要はありません'\n'(入力にスペースやタブがないため)。
12431234123412341234123

@ 12431234123412341234123いいえ、スペースを含む正方形の文字列では機能しません!!!
ミスターXcoder

@ Mr.Xcoderスペースで動作する必要がありますか?私が理解したように、入力にスペースはありません。
12431234123412341234123

仕様を誤解しました:入力は空ではなく、印刷可能なASCIIのみを含むと仮定することができます。、および空白( ``)は印刷可能なASCII
Mr. Xcoder

14

JavaScript(ES6)、46 45バイト

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

説明

  1. 文字列を改行で配列に分割します。
  2. 配列をループします。
  3. 各行の長さから配列の長さを引きます。
  4. ゼロ以外の(つまり、真の)値が任意の行に返される場合、文字列は正方形ではありません。
  5. ループの結果を否定して、true平方を取得しfalseます。

それを試してみてください

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>


3
私はあなたがバイトを保存することができると思うs=>!(s=s.split`\n`).some(x=>x.length-s.length)
ETHproductions

ありがとう、@ ETHproductions。!some単純にそれがの長さと同じだからという理由で、私は手に負えない状態で却下するというひどい習慣を持っていeveryます。
シャギー

9

05AB1E10 8バイト

¶¡€gDgQP

オンラインでお試しください!

-2ライリーのおかげで、これは基本的に彼の答えです。

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

@Riley ahhh、いいね、私の最初のアイデアはあなたが持っていたものの線に沿っていたが、わずかに異なっていた。さらに2回繰り返しましたが、数学エラーをキャッチできませんでした。
魔法のタコUr

「ヘッダー」は入力の有効なフォームではないと思います。
パベル

@Phoenixの方いいですか?
魔法のタコUr

1
入力は、次のように 3つの引用符で取り込むこともできます。
アドナン

1
最初にそれぞれの長さを取得する場合、を回避できますs。このように¶¡€gDgQP
ライリー


9

Haskell、38 34バイト

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

オンラインでお試しください!

のPointfreeバージョンf s = all ((==length (lines s)).length) (lines s)。つまり、入力を行に分割し、各行の長さが行数と等しいかどうかを確認します。

編集:4バイトの@xnorに感謝します。


1
私はあなたが使用することができると思うallのためにmapカットしますand.
XNOR

9

ゼリー、7バイト

ỴµL;L€E

オンラインでお試しください!

説明

Ỵµ       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.

1
TIOリンクは、後続の改行が存在しないことを示しているようです。
パベル

固定@Phoenix /元に戻す...
steenbergh

これは、すべての行が同じ長さであるかどうかを確認するだけです。実際には、改行カウントはまったく考慮されません。Eアトムに到達すると、行の長さのリストが表示され、それだけです。
散布

@Christianが修正および短縮されました。申し訳ありませんが「混乱試合、私は私が働いて解決策を持っていたし、私はその...ゴルフをしようとした後に何かが間違っていたと思います
steenbergh

9

Japt、9バイト

=Ur.Q)¥Uy

オンラインでテストしてください!

説明

 =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

このチャレンジが投稿された直後に実装されたいくつかの機能を使用すると、これは6バイトになります。

r.Q
¥y

オンラインでテストしてください!

説明

       // 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

あなたはどのようにあなたはとても速いですか?
完全に人間の

@totallyhuman私はたまたま質問が投稿された瞬間に見たのですが、アルゴリズムを思いつくのに2分かかりました。その後は、実装と投稿だけでした。(また、
ハハに

ニース:)私yは解決策を知っていましたが、私のものはさらに数バイトで入っていました。
シャギー

このチャレンジが投稿された直後に実装されたいくつかの機能を使用する」- これをあなたのasnwerとして投稿できます。
シャギー

7

網膜33 31バイト

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

オンラインでお試しください!説明:最初の段階では、すべての印刷可能なASCIIを同じ文字に変更するだけで、一致しやすくなります。(それはなくても可能ですが、これはコードチャレンジであり、コードチャレンジではありません。)2番目のステージは、最初の行の少なくとも1つのキャラクターに一致します。ただし、最初の行の追加文字ごとに、必要に応じて改行と最初の行のコピーが一致します。式の最後の部分では、行よりも列の数が多い場合、一致が失敗します。


残念ながら、これはこのテストケースに対してtrueを出力します。
クリチキシリトス

@KritixiLithos提出には、入力に末尾の改行が必要であると考えていますが、これは許可されています。
パベル

また、私は使用して信じている\S\n;代わりの最初の行は1バイトの節約
KritixiのLithos

@KritixiLithos実際に置き換える..2つ節約できますが、ありがとう。
ニール

@Neilそれは本当に賢いです!
クリティキシリソス

6

、6バイト

S≡T'a¶

文字列を受け取り、1またはを出力します0オンラインでお試しください! 最初の行はテストケースを反復します。単一の値でテストする場合は削除します。

説明

ハスクは、私とレオによって作成された新しい機能的なゴルフ言語です。多くの機能が欠落しており、開発が進行中です。その主な機能は、高階関数をオーバーロードできるリジッド型システムです。

高レベルでは、プログラムは次のように機能します。

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.

この関数は、2つの配列が同じ形状を持ち、同じ要素が同じ分布であるかどうかを実際にチェックします。Huskでは、nullバイト以外のすべての文字は真実であり、入力では発生しません。また、SあるS-コンビネータここでは、入力として二つの機能を取る関数、およびT'a、およびマップする新しい関数を返すxには≡(x)(T'a x)。の結果はSで構成され、その関数は暗黙的に入力に適用されます。

HuskはS、次の関数に適用されるべきであるが、左側の関数で構成される必要があることをどのように知っていますか?シンプル:すべての解釈を試行し、型が意味をなすものを選択します。これについては、Huskのドキュメントで詳しく説明しています


5

Pure bash(ユーティリティなし)、55

mapfile -t a
for l in ${a[@]};{
((c+=${#l}^${#a[@]}))
}
  • mapfile 入力を配列に読み込みます a
  • 次に、配列の要素の数が各行の長さとXORされ、合計が取られます。完全な正方形の場合、各XOR結果(および合計)は0になります。それ以外の場合、結果は> 0になります。

これの反対の意味は、シェルの戻りコードとして返されます(で調べますecho $?)-完全な正方形は1、それ以外は0です。

オンラインで試してください(真実)

オンラインで試してみてください(偽)


eval-escape-expansion hellを使用した以前の回答、78:

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

オンラインで試してください(真実)

オンラインで試してみてください(偽)


5

Perl 6、27バイト

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

入力文字列の行数が各行の文字数と等しいかどうかをテストします。


これは改行文字を無視しますか?
Khaled.K

はい、.linesメソッドから改行は返されません。
ショーン

4

Pyth、7バイト

CImL1.z

ここで試してみてください

末尾の改行は不要です。入力を1の2D配列に置き換えます。1は元の入力の任意の文字を表します。次に、配列を転置(列を行に置き換え)した後、その配列が変更されていないかどうかを確認します。このような状況では、正方形のみがtrueを返します。


4

Java(OpenJDK 8)96 91 90 87バイト

-5バイト、@ KevinCruijssenに感謝
-1バイト
、@ TheLethalCoderに感謝-2バイト、@OlivierGrégoireに感謝

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

オンラインでお試しください!


1
でスペースをString[]s削除でき、-3バイト,0でin を削除でき.split("\\n");ます。そして;最後にセミコロン/ を数える必要はありません。ああ、あなたは私が恐れているのjava.util.前に含める必要がありますArrays。インポート/使用もバイトカウントの一部です。
ケビンCruijssen

1
を含めるのを忘れたのでjava.util.、このfor(String x:s)if(x.length()!=s.length)return 0>1;return 1>0;ような通常のforループはより短いようですreturn java.util.Arrays.stream(s).anyMatch(l->l.length()!=s.length);
ケビンCruijssen

2
それだけではありません\nか?
TheLethalCoder

1
繰り返しa.split("\n")は実際には短いです!a->java.util.Arrays.stream(a.split("\n")).allMatch(x->x.length()==a.split("\n").length)
オリビエグレゴワール

2
うーん...との間にもいくつかlengありth()ます。どうやら、それらは60文字目以降に最初に表示され、その後20文字ごとに表示されます。
オリビエグレゴワール

3

基本的nには1の代わりに入力を使用しているため、元の回答が機能しなかったのは、不正なimoのようなものです。
魔法のタコUr

@carusocomputingいいえ、|「入力の残りを取得し、改行で分割する」ことを意味しますが、これは決して複数の入力を取得しません。STDINを単一の入力として扱う必要があります。
エリックアウトゴルファー


3

MATL14 12バイト

10H&XXot&n=h

入力文字列は、文字列連結([...])および10LFを表すコードポイントを使用して定義されます。たとえば['aaa' 10 'bb']、MATLでは、文字と文字列が'aaa'連結され、コードポイントが文字列と連結されていると解釈され10ます'bb'

出力は空でない数値ベクトルです。これは、すべてのエントリがゼロ以外の場合にのみ真実です。

オンラインでお試しください!

説明

入力を検討してください['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]

3

R、35バイト

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

stdinから入力を受け取ります。各行の文字数が行の総数と等しいことを確認します。返品TRUEまたはFALSE適宜。


入力は引用符で囲む必要があります。そうしないと、各行内のスペースで改行される可能性があります。
ジュゼッペ

2

JavaScript(ES6)、48バイト

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



2

Pyth、12 10バイト

!fnl.zlT.z

@FryAmTheEggmanのおかげで2バイト節約されました。

オンラインで試す

説明

!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.

2

QBIC、43バイト

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

私、QBasicデリバティブがこの課題をどれほど短期間で達成できたかに満足しています。

説明:

{_?       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.


2

ルビー、50バイト

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

オンラインでお試しください!

説明

  1. 入力を改行で配列に分割します。
  2. この配列のサイズのみを含む配列が、この配列内のすべての要素のすべてのuniq(空の配列とユニオンを設定)サイズを含む配列と等しいことをアサートします。

1
.split($/,-1);->.split $/,-1;
Christopher Lates

保存より使用してlines代わりにreadして、split(しかし、その後、あなたがに1を追加する必要がsize行の末尾に改行が含まれているため)
GB


1

Clojure、58バイト

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

魔法のような何かを見るのを楽しみにして、末尾の改行が必要です。


1

APL(Dyalog)、17バイト

⎕ML←3多くのシステムでデフォルトである必要があります。CRを使用します。

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

オンラインでお試しください!

↓∘⎕FMT スプリットへのラインである[] F又はM A Tテッド-に-正方形引数

 と同じ

⎕TC[2]∘≠ 非改行*文字のグループに

 仕切られた

 引数?

*リストの2番目の要素T erminal C ontrol文字。


バージョン16.0では、1は書くことができ↓∘⎕FMT≡⎕TC[3]∘≠⊆⊢⎕ML←1


好奇心が強い、何⎕MLですか?
パベル

1
@PhoenixでDyalog APLとAPL +、M igrationのLの EVELは、 IBMのAPL2の方向に弁証法的運動のために粗い尺度です。数値が大きいほど、言語はAPL2のようになります。APL2から他のAPLに移行する⎕ML人は高い傾向にあり、他のAPLから始めた人は低い傾向にあります⎕ML
アダム

1

PowerShell、64バイト

他の非ゴルフ言語の回答と同じ(分割、行の長さ、行数)アプローチですが、同等の素敵なmap()はありませんので、行の長さの配列で、最後にタグ付けされた行の数、その配列グループ化されます。四角は次のように3,3,3,3 -> 1 group, all line lengths and line count were equalなり、非四角はのようになり3,2,1 -> 3 groupsます。

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

改行Linuxスタイルのエンディングが必要で、末尾の改行は不要です。例えば

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

$Ttests | % { & $f $_ }

(そして、あなたは偽のテストに対しても同様のことができますが、それらがもっとあるので、ここには入れません)。@入力が単一の'.'場合、いくつかのシンボルが必要です。それ以外の場合、分割は1つの文字列の配列を作成せず、単に1つの文字列を作成1,1します2。その後、配列連結はoutputを出力しません。

すべての文字を「a」に置き換えてから、1からすべての正方形「a」までの入力長さまでブルートフォースし、入力に一致するものがあるかどうかを確認する方が短いことを願っています。param()と.Lengthおよび-joinと-replaceを取得すると、81バイトではるかに長くなります。

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

1

グライム、11バイト

e`.|_./+/.+

1正方形および0非正方形の印刷。 オンラインでお試しください!

説明

詳細な説明は、Grimeチュートリアルページにあります。このページには、例としてこの正確なプログラムが含まれています。

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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.