長方形のコードで長方形のテキストを検出


19

改行でもスペースでもない文字を少なくとも1つ含む印刷可能なASCIIテキストの文字列(改行とスペースを含む)が与えられた場合、文字列が長方形の場合は真理値を出力し、そうでない場合は偽値を出力します。さらに、ソリューションのソースコードは、長方形でなければなりません

次の条件をすべて満たす場合、文字列は長方形です。

  1. 最初の行と最後の行にはスペースが含まれていません。
  2. 各行の最初と最後の文字はスペースではありません。
  3. すべての行の文字数は同じです。

たとえば、次のテキストは長方形です。

abcd
e fg
hijk

ただし、このテキストは長方形ではありません(要件#3):

1234
567
8900

テストケース

真実:

sdghajksfg
asdf
jkl;
qwerty
u i op
zxcvbn
1234
5  6
7890
abcd
e fg
hijk

偽り:

a b c
123
456
7 9
12
345
qwerty
 uiop
zxcvnm
1234
567
8900

これはであるため、バイト単位の最短ソリューションが優先されます。




9
それで、スペースのないワンライナーは正しい提出ですか?
アーナウルド


1
入力を各行に1つずつ、文字列の配列として受け取ることはできますか?または、改行を含む単一の長い文字列を入力する必要がありますか?
BradC

回答:


12

C(GCC) 127の 125 124 118バイト

  • r*=!e&(!t|t==c);へのゴルフで2バイト節約しましたr>>=e||t&&t-c;(このゴルフは、私の最近のCのヒントがInverse flag updateに答えたインスピレーションでした。)
  • *(_-2)へのゴルフでバイトを保存しました_[~1]
  • ゴルフによって6つのバイトを保存*_++-10||(...)する*_++<11?...:0とプレースホルダゼロ利用...:0ゴルフに(建設に使用されていない)c++増分。これらのゴルフでは、さらにいくつかのループシャッフルが許可されました。
  • 複数の偽値を使用できる場合、114バイトが可能です。
r,e,c,t;_(char*_){for(r=1,t=c=0;*_;*_++<11?r*=(t||(t=c,!e))&*_>32&_[~1]>32&t==c,c=e=0:c++)*_-32||(e=1);r>>=e||t&&t-c;}

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

より高い長方形を実現するソースレイアウト。

説明

以下は、124バイト長のバージョンについて説明しています。

r,e,c,t;_(char*_){     // `r` is the boolean result flag, `e` a boolean flag if the current line contains
                       //  a space, `t` the first line's width, `c` the current line's current width
 for(r=1,t=c=0;*_;c++) // initialize, loop through entire string
  *_-32||              // if the current char is a space,
   (e=1),              //  the current line contains a space
  *_++-10||            // if the current char is a newline (char pointer `_` now incremented)
   (r*=(t||(t=c,!e))   // if t is not yet set, the current line is the first line; set it
                       //  to this line's length, check that no spaces where found
    &*_>32             // the next line's first char should not be a space
    &_[~1]>32          // this line's last char should not have been a space
    &t==c,c=~0,e=0);   // the line lengths should match, reset `c` and `e` to zero
                       //  (`~0 == -1`, countering the loop's increment of `c`)
 r>>=e||t&&t-c;}       // return boolean flag, check that the last line does not contain spaces,
                       //  there was either no newline or line lengths match
                       //  (here) equivalent to `r*=!e&(!t|t==c)`

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


10
+1r,e,c,t
マジックタコ

4

Java 10、214 176 169 152 144 139バイト

s->{String[]a=s.split("\n")
;int r=1,i=0,R=a.length;for
(;i<R;i++)if(i<1|i>R-2?a[i]
.contains(" "):a[i].trim( )
!=a[i])r=0;return-r<0;}////

@Neilのおかげで-5バイト。

String[]a代わりに使用しvar aます。return-r<0;代わりにreturn r>0;; //最後にコメントを追加したため、最初と最後の行にスペースがありません。

この長方形は単一行入力よりも短いことに注意してください。これint r=1,...;はに置き換える必要があるためint[]v{1,...};、整数のすべての使用はv[n]nは配列内の変数のインデックスですv)になります。

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

説明:

s->{                        // Method with String parameter and boolean return-type
  String[]a=s.split("\n");  //  Input split by new-lines
  int r=1,                  //  Result-integer, starting at 1
      i=0,                  //  Index `i`, starting at 0
      R=a.length;           //  Amount of rows `R`
  for(;i<R;i++)             //  Loop `i` over the rows
    if(i<1                  //   If it's the first row,
       |i>R-2?              //   or the last row:
        a[i].contains(" ")  //   And the current row contains a space
       :a[i].trim()!=a[i])  //   Or either column of the current row contains a space
      r=0;                  //    Set the result `r` to 0
   return-r<0;}             //  Return whether `r` is still 1
////                        // Comment to comply to the rules of the challenge

以下は、スペース(128 126バイト)がある同じ基本プログラムです。

s->{var a=s.split("\n");int r=1,i=0,R=a.length;for(;i<R;i++)if(i<1|i>R-2?a[i].contains(" "):a[i].trim()!=a[i])r=0;return r>0;}

@Neilのおかげで-2バイト。

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



3

T-SQL、237207バイト

SELECT(SELECT(IIF(max(len(v))=min(len(v)),1,0)*IIF(SUM(len(v+'x')-len
(trim(v))-1)=0,1,0))FROM t)*(SELECT(IIF(SUM(charindex(' ',v))=0,1,0))
FROM[t]WHERE[i]IN(SELECT(min(i))FROM[t]UNION(SELECT(max(i))FROM[t])))

長方形の場合は1、それ以外の場合は0を出力します。スペースをなくすには、余分な括弧とブラケットをたくさん使わなければなりませんでしたが、改善の余地は大きいと確信しています。

説明

許可されたI / Oオプションと質問コメントの説明に従って、入力は既存のテーブルtの個別の行として取得されます。SQLのデータは本質的に順序付けられていないため、そのテーブルには「行番号」IDフィールドが含まれます iが

CREATE TABLE t (i INT IDENTITY(1,1), v VARCHAR(999))

基本的に、私のSQLは3つのサブクエリを実行し、それぞれが返します 0か、1「矩形」コードの3つの基準に基づきます。これら3つの値は乗算され、13をすべて満たすコードに対してのみ返されます。

編集:基準2と3を同じSELECTに結合して、スペースを節約します

SELECT(
SELECT(IIF(max(len(v))=min(len(v)),1,0)                  --All rows same length
      *IIF(SUM(len(v+'x')-len(trim(v))-1)=0,1,0))FROM t) --no leading or trailing spaces
*(SELECT(IIF(SUM(charindex(' ',v))=0,1,0))               --No spaces at all in
FROM[t]WHERE[i]IN(SELECT(min(i))FROM[t]                  --   first row or
            UNION(SELECT(max(i))FROM[t])))               --   last row

TRIM(v)関数は、SQL 2017以降でのみサポートされています。以前のバージョンではが必要LTRIM(RTRIM(v))になり、行の再調整が必要になります。

ランダムな注意:LEN()SQL の関数は末尾のスペースを無視しますLEN('foo ') = 3。「真の」長さを得るには、文字を最後に付け加えてから1つ引く必要があります:P


3

C ++、199 183 181 175バイト

このテンプレート関数は、イテレータのペアとして渡される文字列(ワイド文字列の場合があります)のコレクションとして行を受け入れます。

#include<algorithm>//
template<class I>bool
f(I a,I b){return!~+(
*a+b[-1]).find(' ')&&
std::all_of(a,b,[&a](
auto&s){return' '+-s.
back()&&s[0]-' '&&a->
size()==s.size();});}

メンバーのことを思い出させてくれたユーザーErroneousに感謝します。back()std::stringnpos+1ゼロであることを指摘してます。

非ゴルフ同等

唯一の本当のゴルフは、最初と最後の行を連結することfindです。そうすることで、それらのスペースに対してシングルを実行できます。

#include <algorithm>
template<class It>
bool f(It a, It b)
{
    return (*a+b[-1]).find(' ') == a->npos
        && std::all_of(a, b,
                       [=](auto s) {
                           return s.back() != ' '
                               && s.front() != ' '
                               && s.size() == a->size(); });
}

テストプログラム

#include <iostream>
#include <string>
#include <vector>
int expect(const std::vector<std::string>& v, bool expected)
{
    bool actual = f(v.begin(), v.end());
    if (actual == expected) return 0;
    std::cerr << "FAILED " << (expected ? "truthy" : "falsey") << " test\n";
    for (auto const& e: v)
        std::cerr << "  |" << e << "|\n";
    return 1;
}
int expect_true(const std::vector<std::string>& v) { return expect(v, true); }
int expect_false(const std::vector<std::string>& v) { return expect(v, false); }
int main()
{
    return
        // tests from the question
        + expect_true({"sdghajksfg"})
        + expect_true({"asdf", "jkl;",})
        + expect_true({"qwerty", "u i op", "zxcvbn",})
        + expect_true({"1234", "5  6", "7890",})
        + expect_true({"abcd", "e fg", "hijk",})
        + expect_false({"a b c",})
        + expect_false({"123", "456", "7 9",})
        + expect_false({"12", "345",})
        + expect_false({"qwerty", " uiop", "zxcvnm",})
        + expect_false({"1234", "567", "8900",})
        // extra tests for leading and trailing space
        + expect_false({"123", " 56", "789"})
        + expect_false({"123", "45 ", "789"})
        // the function source
        + expect_true({"#include<algorithm>//",
                       "template<class I>bool",
                       "f(I a,I b){return!~+(",
                       "*a+b[-1]).find(' ')&&",
                       "std::all_of(a,b,[&a](",
                       "auto&s){return' '+-s.",
                       "back()&&s[0]-' '&&a->",
                       "size()==s.size();});}",})
        ;
}

これは.find(' ')+1==0、のs.back()代わりに、およびを使用して、ライン幅22で183バイトにさらにゴルフできます*s.rbegin()
誤った




2

Haskell、79バイト

g(x:r)=all((==(0<$x)).(0<$))r&&all(>='!')(x++last(x:r)++(head<$>r)++(last<$>r))

オンラインでお試しください!入力を行のリストとして受け取ります。

パターンg(x:r)= ...は、最初の行をにバインドし、x残りの行の(空の場合もある)リストをにバインドしrます。次にall((==(0<$x)).(0<$))r、すべての行のr長さがxこのヒントを使用し)と同じかどうかを確認します。

そうでない場合、論理積は&&短絡し、を返しますFalse。それ以外の場合、右側が評価されます。x最初の行、last(x:r)最後の行r(またはr空の場合は最初の行)、および各行の(head<$>r)最初と(last<$>r)最後の文字で構成される文字列が作成されます。この文字列についてall(>='!')、スペースが含まれていないことを確認します((>' ')ソースコードの制限のため使用できません)。


"\ N \ N"のエラー
Angs

@Angs良いキャッチ。幸いなことに、OPはinput contains at least one character that is neither a newline nor a spaceによって空のリストケースを削除できることを明確にしました。
ライコニ

いいね、追加されることに気づかなかった
Angs

2

MATL、13バイト

ctgF6Lt&()32>

入力は、次の形式の文字列の配列です。 {'abc' 'de'}

出力は、1のみを含む配列(truthy)、または少なくとも0を含む配列(falsey)です。

オンラインでお試しください!または、すべてのテストケースを確認します、真実性/虚偽テストを含む。

説明

c       % Implicit input. Convert to char. This concatenates the
        % strings of the input cell array as rows of a rectangular
        % char array, right-padding with spaces as needed
tg      % Duplicate, convert to logical. Gives a logical array with
        % the same size containing true in all its entries
F       % Push false
6L      % Push the array [2, j-1], where j is the imaginary unit.
        % When used as an index, this is interpreted as 2:end-1
t       % Duplicate
&(      % Assignment indexing with 4 inputs: original array, new
        % value, two indexing arrays. This writes false at the inner
        % rectangle (2:end-1)×(2:end-1) of the logical array that
        % initially only contained true. This will be used as a
        % logical index (mask) into the rectangular char array
)       % Reference indexing. This selects the border of the char
        % array. The result is a column vector of chars
32>     % Is each entry greater than 32? (ASCII code for space)
        % Implicit display

11バイト:cO6Lt&(32=~ オンラインでお試しください!境界以外の部分をnullにして、スペースがあるかどうかを確認します。
スンダ

@sundarいいね!それは十分に異なります、自分で投稿してください
ルイスメンドー

1
いや、あなたの答えにあまりにも似ていると感じていますcF6Lt&(32=~。自由に編集してください。そうでない場合は、コメントにそのまま残してください。
スンダ


1

Canvas17 15 バイト

4[↷K;}┐){SL]∑4≡

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

説明(固定幅のASCIIフィード):

4[↷K;}┐){SL]∑4=  full program; pushes the input to the stack.
4[   }           repeat 4 times
  ↷                rotate ToS clockwise. This also pads the input with spaces
   K;              take off the last line and put it below the item
      ┐          pop the remaining of the input (the center)
       )         and wrap the rest (the sides) in an array
        {  ]     map over those
         S         split on spaces - should result to one item in the array
          L        and get the length
            ∑    sum those lengths together
             4=  check if equal 4

4
皮肉なことに、モノスペースのようなフォントのこれらのUTF8文字は、ソースに多くのスペースがあるという感覚を与えます。(少なくとも、私のブラウザーではそうです。)
アーナウルド

1
@Arnauld全角文字がそれを行います。そして、それが私が通訳のためにフォントを作成してきれいにした理由です:p
dzaima


1

216191バイト

func[s][d:(length?(first(s:(split(s)"^/"))))sp:
func[a][none = find a" "]b: on foreach c s[b: b
and(d = length? c )and(c/1 <>" ")and(" "<> last
c)]res:(sp(first(s)))and(sp(last(s)))and(b)res]

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

最初と最後の行に、そうでなければ必要のない括弧をたくさん入れました。


0

ゼリー、17バイト

Ỵµ.ịЀ;ịɗẎ⁶e<L€E$

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


@JonathanFrech Ah、修正済み。> _>
エリック・ザ・アウトゴルファー

ええええええと?これが正しく動作しない入力にリンクしてください。
エリックアウトゴルファー

ああ、いや、あなたDoes not seem to enforce equal line lengthは私が言っていたすべてのために私のものを呼びました。
魔法のタコ


1
@Angs 引用してみてください。このように配置すると、明らかに何も解析されません。
エリックアウトゴルファー

0

ゼリー、15 バイト

削除されたPythサブミッションで(現在-エッジケースエラーのため)Mnemonicが開発した方法を使用します。(修正された場合は、クレジットを与えてください!)

ỴµL€Eȧt€⁶ZUƊ4¡⁼

1または0を返す文字のリストを受け入れるモナドリンク。

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

どうやって?

ỴµL€Eȧt€⁶ZUƊ4¡⁼ - Link: list of characters
Ỵ               - split at newlines (making a list of lists - the rows)
 µ              - start a new monadic chain, call that ROWS
  L€            - length of €ach row in ROWS
    E           - all equal? (an integer: 1 if so, otherwise 0)
            4¡  - repeat four times:
           Ɗ    -   last three links as a monad:
      t€⁶       -     trim spaces (⁶) from €ach row in current ROWS
         Z      -     transpose that result
          U     -     upend (reverse each new row)
     ȧ          - logical AND (0 if L€E was 0 else the result of the repeated transform)
              ⁼ - equal to X? (the integer 0 is not equal to any listy of characters)

@ニーモニック-ジェリーファイド:)
ジョナサンアラン

0

ジャプト、22バイト

競合しない答え:Japtに既知のバグがありますには、2次元配列の回転により結果が切り捨てられます。そのバグのため、以下のコードは正方形の入力でのみ機能します。ただし、バグが存在しない場合、以下のコードは完全に正しく動作するはずです。

e_ʶUÌÊéUeº4o)r_z)mx}U
e_                      // Check if every line in the input array
  ʶUÌÊ                 // has the same length as the last item.
       é               // Also,
               r_z)mx}U // check if rotating and trimming the input array
           º4o)         // four times
         Ue             // is equal to the input array.

入力を文字列の配列として受け取ります。スペースの代わりに括弧を使用すると、長方形のコード要件が非常に簡単になります。
ここで試してみてください


0

Ruby 2.5 +、63バイト

->a{!a.uniq(&:size)[1]&&a.none?(/^\s|\s$/)&&!(a[0]+a[-1])[?\s]}

入力を文字列の配列として受け取ります。TIO(2.4)のバージョンはこのバージョンには古すぎるため、テストリンクはありません。代わりに、テスト用のわずかに長い(69バイト)バージョンがあります。

->a{!a.uniq(&:size)[1]&&a.none?{|l|l=~/^\s|\s$/}&&!(a[0]+a[-1])[?\s]}

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

違いは、2.5 RubyはRegexパターンを直接渡すことをサポートしているためです。 all?, any?, none?メソッドにているため、数バイトを節約できることです。メソッド自体は非常に自明です-テストします:

  1. 一意の行サイズが1つしかない場合
  2. 行の境界にスペースがある場合
  3. 最初と最後の行にスペースがある場合。


0

C#(.NET Core)145 167バイト

S[0].Length>1&&S[0].IndexOf
(" ") + S[ S.Count() - 1 ].
IndexOf(" ")<-1&Array.Find(
S,x=>x[0]==' '| x [x.Length
-1]  ==  ' '  | S[0].Length
!=x.Length)==null?11>0:0>1;

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

S[0].Length>1&                                    // And if the lenght of the first argument is more than 1 char
Array.Find(                                       // Find a string in an array
    S,                                            // The array which will be searched in
    x=>                                           // For x as the current string from the array
    x.Length!=S[0].Length|                        // If the string lenght match not the first argument lenght
    x[0]==' '|                                    // Or if the string begins with a spacer
    x[x.Length-1]==' '                            // Or if the string ends with a spacer
)==null&                                          // And if there was no string found which matched the conditions
S[0].IndexOf(" ")+S[S.Count()-1].IndexOf(" ")<-1  // And if the first and last string doesn't have a spacer
?                                                 // If all above is true do
1>0                                               // Return True
:                                                 // Else
0>1                                               // Return False

最初の行にスペースはありません。
FrownyFrog

@FrownyFrog S[0].IndexOf(" ")は、最初の行でスペースをS[S.Count()-1].IndexOf(" ")検索し、最後の行で検索しています。最初と最後の行にスペースがない場合、-2になります-2 < -1
ヒレ

2
つまり、あなたのコードには同じ制限があるため、最初の行にスペースを入れることはできません。
FrownyFrog

1
Trueプログラムに渡されると、コードが返される必要があります。これはこのチャレンジの追加の制限です。
FrownyFrog

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