使用矩形代码检测矩形文本


19

给定一串可打印的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
我们可以将输入作为字符串数组,每行一个吗?还是我们必须输入一个包含换行符的长字符串?
BradC

Answers:


12

C(GCC) 127个 125 124 118字节

  • 打高尔夫球r*=!e&(!t|t==c);至节省了两个字节r>>=e||t&&t-c;(这是我最近的C技巧答案反向标志更新的灵感来源。)
  • 通过高尔夫保存一个字节*(_-2)_[~1]
  • 保存由高尔夫六个字节*_++-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
+1 forr,e,c,t
魔术章鱼缸

4

爪哇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;}////

-5个字节,感谢@Neil

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;}

-2个字节感谢@Neil

在线尝试。



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中的数据本质上是无序的,因此该表包含“行号”标识字段i

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

基本上,我的SQL执行3个子查询,每个子查询都返回01基于“矩形”代码的3个条件。这3个值相乘,仅返回1满足所有3 个值的代码。

编辑:将条件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。要获得“真实的”长度,您必须在最后加上一个字符,然后减去一个: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::string并指出npos+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==0s.back()代替,进一步将其打成线宽为22的183个字节*s.rbegin()
错误


2

Python 2,82字节

lambda*s:len(set(map(len,s)))<2<'!'<=min(tuple(s[0]+s[-1])+zip(*s)[0]+zip(*s)[-1])

在线尝试!

调用为f("abcd", "e fg", "hijk")


2

Haskell中106个 102 98 110 109 102字节

(\a->all(==[])a||and(e((1<$)<$>a):map(all(>='!').($a))[head,last,map$last,map$head]));e(a:s)=all(==a)s

感谢@nimi和@Laikoni每个字节!

在线尝试!


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 '18

@Angs好收获。幸运的是,OP澄清了input contains at least one character that is neither a newline nor a space,它也允许删除空列表的大小写。
拉科尼

哦,好的,没有注意到,正在添加
Angs

2

MATL,13字节

ctgF6Lt&()32>

输入是一个字符串数组,格式为{'abc' 'de'}

输出是一个仅包含一个为true的数组,或者一个至少包含一个为false的零数组

在线尝试!验证所有测试用例,包括真实性/伪造性测试。

说明

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=~ 在线尝试!只是使非边界部分无效,然后检查是否有空格。
sundar-恢复莫妮卡

@sundar好主意!这就是不同的是,自己张贴
路易斯Mendo

1
不,感觉与您的答案过于相似,特别是如果我将其写为 cF6Lt&(32=~。随时对其进行编辑,否则,我们可以将其保留在注释中。
sundar-恢复莫妮卡

1

JavaScript(ES6),88个字节

s=>!s.split`\n`.some((s,i,a)=>s[L='length']-a[0][L]|(++i%a[L]>1?/^\s|\s$/:/\s/).test(s))

在线尝试!


1

帆布17 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字符的类空格字体给人的感觉是源中有很多空格。(至少它们是在我的浏览器中执行的。)
Arnauld

1
@Arnauld全角字符可以做到这一点。这就是为什么我为解释器制作了一种字体,使其更漂亮:p
dzaima


1

216个 191字节

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啊,固定。> _>
暴民埃里克(Erik the Outgolfer)'18年

@MagicOctopusUrn嗯?您能否链接到输入无法正常工作的输入?
暴民埃里克(Erik the Outgolfer)'18年

哦,不,您叫我的Does not seem to enforce equal line length也是我的意思。
魔术章鱼缸

似乎不适合" \n " 在线试用!
昂斯

1
@Angs 尝试引用它。如果你这样说的话,它显然没有被解析。
暴民埃里克(Erik the Outgolfer)'18年

0

果冻,15 字节

使用由助记符开发的方法(当前-由于边缘情况失败)删除了Pyth提交。(如果现在已修复,请给点信用!)

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

@Mnemonic-Jelly-fied :)
Jonathan Allan

0

Japt,22字节

非竞争性答案:Japt中存在一个已知的错误,其中二维数组旋转会截断结果。由于该错误,下面的代码仅适用于方形输入。但是,如果不存在该错误,则下面的代码应该可以完全正确地工作。

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(gcc),119字节

将输入作为n个字符串的列表。

f(s,n,m,r,p)char**s,*p;{for(r=m=n;m--;r*=strlen(*s)==strlen(s[m])&(!p||m&&m^n-1&&p!=s[m]&&p[1]))p=strchr(s[m],32);n=r;}

在线尝试!


0

C#(.NET核心)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,则在处为true -2 < -1
希勒,

2
我的意思是挑战,您的代码具有相同的限制,因此第一行不能有空格。
FrownyFrog

1
True传递给程序时,您的代码必须返回。这是此挑战中的附加限制。
FrownyFrog

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.