这条线是正方形吗?


44

如果满足以下条件,则将字符串视为正方形:

  • 每行字符数相同
  • 每行上的字符数等于行数。

您的任务是编写确定给定输入字符串是否为正方形的程序或函数。

您可能需要通过选择LF,CR或CRLF来分隔输入。

换行符不视为行长度的一部分。

您可能需要在输入中包含或不包含尾随换行符,这不会算作附加行。

输入是字符串或一维char数组;它不是字符串列表。

您可以假定输入为非空,并且仅包含可打印的ASCII(包括空格)。

您必须为平方字符串输出一个真值,为其他字符串输出一个虚值。

真实的测试案例:

富
酒吧
巴兹
.s。
.ss
.s。
(s代表空间)
ss
ss
(s代表空间)
aa
aa
aa
aa
aa

虚假的测试案例:

..
。
....


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

在某些虚假情况下,请注意额外的空白行。

这是 -最少的字节数获胜!


语言设计的可能重复项:二维模式匹配。问题5与这个问题相同。
mbomb007

1
@ mbomb007我觉得不同的获胜标准使得这不是重复的吗?“高尔夫”是投票标准之一,但我认为该问题的答案不会在很大程度上反映在这里。
FryAmTheEggman

2
@ mbomb007我赞成将此问题保留为开放状态,因为尽管它是另一个问题的子集,但另一个问题仅限于专门为该问题创建的语言。
ETHproductions '17

2
@ mbomb007:这不是重复的,因为该问题要求您设计一种语言来回答问题,而不是使用现有语言进行回答。这里很少有答案是合法的。

1
@ mbomb007:这没有理由解决这个挑战,但是也没有给人们任何地方以现有语言发布答案的理由。尽管我认为这是一个糟糕的论点,并且认为应该将两者都置之门外,但这可能是解决另一个挑战的论点(因为这只是该挑战的限制性更强的版本)。

Answers:


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
=“断言的结果是正方形” :(
埃里克Outgolfer

5
一段时间以前,我一直在努力写一个断言广场(当时有点像.\l~l,除了反斜杠命令断言了它的输入是一个矩形)被打破了。请注意,即使我们替换.\l~l,这是仍然在这里最短的程序;想起来了,我会补充说该职位)。反斜杠命令已修复,但语言作者决定同时添加一个断言正方形。我当时在想“肯定不会再出现了”。显然我错了。

2
@Phoenix:语言的版本号,这在Brachylog v1中不起作用。大多数人只是说“ Brachylog”(就像大多数人说“ Perl”而不是“ Perl 5”一样),但是我早就养成了习惯,因为我很少使用Brachylog v1。

2
@iFreilicht不好,因为到目前为止它超越了其他所有高尔夫语言。
暴民埃里克(Erik the Outgolfer)

21

Python 2,52字节

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

在线尝试!尝试所有测试用例


4
我喜欢这样的事实,它既打高尔夫球又可读。
jpmc26 2015年

您不需要'\n',只需将其留空(因为输入中没有空格和制表符)。
12431234123412341234123 2015年

@ 12431234123412341234123不,它不适用于包含空格的方形字符串!!!
Xcoder先生17年

@ Mr.Xcoder必须使用空格吗?据我了解,输入中永远不会有空格。
12431234123412341234123年

您误解了规范:您可能会假设输入为非空且仅包含可打印的ASCII。,并且空格(``)是可打印的ASCII
Xcoder先生17年

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,妙趣横生,我的初衷更多地与您的想法相似,但略有不同。重复了两次,但没有发现我的数学错误。
Magic Octopus Urn

我认为“页眉”不是输入的有效形式。
帕维尔

@Phoenix是那个更好?
魔术章鱼缸

1
输入也可以用三个引号引起来,例如this
阿德南(Adnan)

1
如果得到每个首位的长度,则可以避免s。这样¶¡€gDgQP
Riley


9

Haskell,38 34字节

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

在线尝试!

点的无点版本,即将f s = all ((==length (lines s)).length) (lines s)输入分成几行,并检查每行的长度是否等于行数。

编辑:感谢@xnor 4个字节。


1
我认为你可以使用allmap切割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链接似乎表明不应该包含尾随换行符。
帕维尔

@凤凰固定/还原...
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

@totallyhuman我碰巧在发布问题的那一刻就看到了这个问题,花了我两分钟才想到一个算法。之后,它只是实施和发布。(此外,我还有事要回到哈哈)
ETHproductions 2015年

尼斯:)我知道y是解决方案,但是我的解决方案又增加了几个字节。
毛茸茸的

使用发布此挑战后不久实现的一些功能 ”-您现在可以将其发布为您的附加内容。
毛茸茸的

7

视网膜33 31字节

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

在线尝试!说明:第一阶段只是将所有可打印的ASCII更改为相同的字符,以使其更易于匹配。(这可以在没有代码的情况下完成,但这是代码高尔夫,而不是代码挑战。)然后,第二阶段在第一行匹配至少一个字符。但是,对于第一行中的每个附加字符,它随后可选地匹配换行符,后跟第一行的副本。如果列数多于行数,则表达式的最后部分导致匹配失败。


不幸的是,此测试用例的输出为true 。
Kritixi Lithos

@KritixiLithos我相信提交内容需要在输入中使用尾随换行符,这是允许的。
帕维尔

我也相信使用\S\n;而不是第一行可以节省一个字节
Kritixi Lithos

@KritixiLithos实际替换..保存两个,但谢谢。
尼尔

@Neil真的很聪明!
Kritixi Lithos

6

外壳,6个字节

S≡T'a¶

接受字符串并打印10在线尝试! 第一行遍历测试用例。如果要测试单个值,请将其删除。

说明

谷壳是一种由我和狮子座创造的新的功能性高尔夫语言。它缺少许多功能,并且正在开发中。它的主要特征是一个刚性类型的系统,它使我们可以重载高阶函数。

在较高的层次上,该程序的工作方式如下:

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.

该函数实际上检查两个数组的形状和真元素的分布是否相同。在Husk中,除空字节外的所有字符都是真实的,并且在我们的输入中不会发生。另外,SS-组合子,这需要作为输入两种功能,在这里的功能T'a,并返回一个新的功能映射x≡(x)(T'a x)。的结果S由组成,并且该函数隐式应用于输入。

赫斯基如何知道它应该应用于S下一个功能,但应该由左侧的功能组成?很简单:它只是尝试每种解释,然后选择类型有意义的解释。在Husk文档中对此进行了更详细的说明


5

纯bash(无实用程序),55岁

mapfile -t a
for l in ${a[@]};{
((c+=${#l}^${#a[@]}))
}
  • mapfile 将输入读入数组 a
  • 然后将数组的元素数与每行长度进行XOR运算,然后求和。对于一个完美的平方,每个XOR结果(以及总和)将为0。对于其他任何结果,该结果将> 0。

与之相反的含义作为shell返回码返回(用检验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字节

@KevinCruijssen -5个字节,@@ LeLetalCoder,
-1个
字节,@OlivierGrégoire,-2个字节,

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

在线尝试!


1
您可以在删除的空间String[]s,你可以删除,0.split("\\n");为-3个字节。而分号/ ;最终不需要计数,因此再加上-1。哦,恐怕您必须java.util.在前面加上Arrays。导入/使用也是字节数的一部分。
凯文·克鲁伊森

1
由于您忘了包含java.util.,因此像这样的常规for循环for(String x:s)if(x.length()!=s.length)return 0>1;return 1>0;似乎比短return java.util.Arrays.stream(s).anyMatch(l->l.length()!=s.length);
Kevin 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

R,57字节

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

匿名函数;在换行符上分割,计算每行的长度,并检查所有行数是否与行数相同。

在线尝试!


3

MATL14 12字节

10H&XXot&n=h

使用字符串连接([...])定义输入字符串,并使用代码点10表示LF。例如,['aaa' 10 'bb']在MATL中被解释为字符串'aaa'与字符连接,而代码点10与string连接'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的输入。检查每行中的字符数是否等于总行数。返回TRUEFALSE视情况而定。


请注意,输入内容必须用引号引起来,否则可能会破坏每行中的空格。
朱塞佩

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

Pyth,7个字节

qCC.z.z

示范

用截断两次对输入进行转置,然后检查结果是否与原始结果相同。


2

Ruby,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中号泰德-进入-一个平方参数

 相同

⎕TC[2]∘≠ 非换行符*的组

 分区的

 争论?

*的列表的第二元件Ť端子Ç ONTROL字符。


在16.0版本中,一个能写↓∘⎕FMT≡⎕TC[3]∘≠⊆⊢⎕ML←1


很好奇,什么⎕ML
帕维尔

1
@Phoenix在Dyalog APL和APL +,中号 igration 大号伊维尔基尼为在IBM的APL2的方向上的辩证运动的粗略量度。数字越高,该语言就越像APL2。从APL2迁移到其他APL的人往往以较高的收益运行⎕ML,而从其他APL开始的人则以较低的收益运行⎕ML
ADAM

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输出2

我希望将所有字符替换为“ 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.
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.