形状识别程序


25

您的任务是构建一个识别输入形状的程序。要标识的形状可以是以下任意一种:

广场

要被识别为正方形,源必须具有所有等长的行,并且每行的字符数与行数相同(不包括换行符)。可选的尾随换行符是可接受的。

$_='
$_="
$_"'
;say

长方形

要被识别为矩形,源必须具有全部等长的行,但是行数与每行的字符数不匹配(不包括换行符)。可选的尾随换行符是可以接受的。这可以是水平或垂直的。

$_=
"no
t a
squ
are
";#

$_="but it
is still a
consistent
shape!";##

三角形

要标识为三角形,源代码必须以一个字符开头,并且每行之后必须有一个附加字符(包括最后一个字符),或者在第一行之后,每行之后的最后一行应少一个字符,直到最后一行只有一个。

$
_=
"So
this
"."".
shape;

$_="or
even,
this
way
!!
"

混乱

任何不遵循上述一致格式的内容,都必须识别为混乱。

规则

  • 您可以返回任何四个一致的可打印值来标识每个形状。
  • 您的源代码还必须遵守上述形状之一(不,不要乱成一团)。
  • 您的源中的一条尾随换行符是可以接受的。
  • 您可以假定输入不包含任何空行(包括尾随换行符),不为空并且不仅由换行符组成。
  • 所有形状的高度和宽度必须大于等于2,否则定义为混乱。
  • 禁止出现标准漏洞。
  • 每种语言中以字节为单位的最短解决方案为准。

“您的源代码还必须遵守上述形状之一”是否表示一个衬板就可以了?
tsh

1
@ tshAll shapes must have a height and width of >= 2.
TFeld

1
输入可以是数组吗?例如,正方形['abc','cfd','fgh']
路易斯·费利佩·德·耶稣·穆诺兹

1
@recursive更新,谢谢!
Dom Hastings

3
您是在告诉我我的源代码不会一团糟吗?为什么不?!?!
NH。

Answers:


9

果冻,35个字节

L€ṀR,Ṛ$ċƲȧ3
L€,;¥LE€S+Ç
ỴµZL«L>1ȧÇ 

在线尝试!

0=混乱
1=矩形
2=正方形
3=三角形


代码的最后一行是否使用空格?还是只是为了满足“矩形”条件而填充?
BradC

@BradC后者。我可能应该添加一个解释。
暴民埃里克

7

Brachylog,45个字节

lᵐ{≥₁|≤₁}o{l>1&t>1&}↰₃
lg,?=∧1w|=∧2w|t⟦₁≡?∧3w

在线尝试!

代码是一个矩形(尽管它在我的屏幕上呈现的方式)。输出:1代表正方形,2代表矩形,3代表三角形,乱七八糟


说明:

lᵐ{≥₁|≤₁}o{l>1&t>1&}↰₃
lg,?=∧1w|=∧2w|t⟦₁≡?∧3w

lᵐ                        Get the length of each string
  {     }                 Verify 
   ≥₁                     The list is non-increasing
     |                    or...
      ≤₁                  The list is non-decreasing
         o                Sort it to be non-decreasing
          {        }      Verify
           l>1            The number of lines is greater than 1
              &           and...
               t>1&       The longest line is longer than 1 character
                    ↰₃    Call the following

lg,?                      Join the number of lines with the line lengths
    =∧1w                  If they are all equal, print 1 (Square)
         |=∧2w            Or if just the line lengths are equal, print 2 (Rectangle)
              |t⟦₁         Or if the range [1, 2, ... <longest line length>]
                  ≡?       Is the list of lengths
                    ∧3w    Print 3 (triangle)
                           Otherwise print nothing (mess)

7

爪哇10,231个 221 219 217 213 211 207字节

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

函数本身就是一个矩形。
1=正方形;2=矩形;3=三角形;0=混乱

-14个字节,感谢@OlivierGrégoire

说明:

在线尝试。

s->{                        // Method with String parameter and integer return-type
  var a=s.split("\n");      //  Input split by new-lines
  int r=a.length,           //  Amount of lines
      l=a[0].length(),      //  Length of the first line
      R=0,                  //  Result-integer, initially 0
      i=1,                  //  Index integer, starting at 1
      L,D;                  //  Temp integers
  if(r>1){                  //  If there are at least two lines:
    for(L=a[1].length(),    //   Set `L` to the length of the second line
        D=L-l;              //   And set `D` to the difference between the first two lines
        ++i<r;              //   Loop over the array
        ;                   //     After every iteration:
         R=L-a[i-1].length()//     If the difference between this and the previous line
          !=D?              //     is not equal to the difference of the first two lines:
           1                //      Set `R` to 1
          :                 //     Else:
           R)               //      Leave `R` the same
      L=a[i].length();      //    Set `L` to the length of the current line
  R=R<1?                    //   If `R` is still 0:
     D==0?                  //    And if `D` is also 0:
      r==l?                 //     And the amount of lines and length of each line is equal
       1                    //      It's a square, so set `R` to 1
      :                     //     Else:
       2                    //      It's a rectangle, so set `R` to 2
     :D>-2&D<2&             //    Else-if `D` is either 1 or -1,
      (l<2|L<2)?            //    and either `l` or `L` is 1:
       3                    //     It's a triangle, so set `R` to 3
    :0:0;}                  //   In all other cases it's a mess, so set `R` to 0
  return R;}                //  Return the result `R`

1
修复了221个字节:s->{var a=s.split("\n");int S=a.length,l=a[0].length(),L,D,b=0,i=1;if(S<2)return 0;for(L=a[1].length(),D=L-l; b<1&++i<S;)if((L=a[i].length())-a[i-1].length()!=D)b=1;return b<1?D==0?S==l?1:2:D==-1|D==1?l==1|L==1?3:0:0:0;}(后双空格var,换行后D=L-l;
奥利维尔·格雷瓜尔

@OlivierGrégoire谢谢。通过更改D==-1|D==1为,我又打了两个字节D>-2|D<2。这一个和l==1|L==1可能与一些位操作更golfable,但是这不是我的专长。
凯文·克鲁伊森

1
207个字节:(s->{var a=s.split("\n");int r=a.length,l=a[0].length(),L,D,b=0,i=1;if(r>1){for(L=a[1].length(),D=L-l;++ i<r;b=L-a[i-1].length()!=D?1:b)L=a[i].length();b=b<1?D==0?r==l?1:2:D>-2&D<2&(l<2|L<2)?3:0:0;}return b;}在之后中断D=L-l;++)。通过将循环和语句合并为一个,仍然可以进行高尔夫运动,但是我现在不知道如何。
奥利维尔·格雷戈雷

6

Python 2中129个 114 109 107 113字节

l=map(len,input().split('\n'));m=len(
l);r=range(1,m+1);print[[1],0,r,r[::-
1],[m]*m,0,[max(l)]*m,l].index(l)%7/2

在线尝试!


版画

  • 0 = Mess
  • 1 = Triangle
  • 2 = Square
  • 3 = Rectangle

@KevinCruijssen谢谢,应该立即解决
TFeld

6

果冻32 27字节

,U⁼€JẸ,E;SƲ$
ZL«L’aL€Ç$æAƝ

在线尝试!

现在在行列表中输入并切换 >1×’a和使用SƲL€ 的替代FLƲƊ。这些使我可以精简为两行,总共节省了5个字节。以下值与以前相同。

[0.0, 0.0]=梅斯
[0.0, 1.5707963267948966]=矩形
[0.0, 0.7853981633974483] =正方形
[1.5707963267948966, 0.0]=三角形


ZL«L获得高度和宽度的最小值,并从中减去1。 Ç调用第二个链接,如果输入是单行,则在最后结束,如果只有一行,则将结果Ç与前一个数字进行逻辑与运算[0.0, 0.0]

在第二个链接中:,U产生一个行长列表,并与之相反。Jrange(number of lines)⁼€检查它们是否均等于的结果J如果输入是三角形,则(Any)得出1。

E 检查所有线长是否相等(矩形/正方形)。

SƲ 与一个 $分组为一个monad可以检查字符总数是否为平方数。

因此,在第二个链接的末尾,我们有了[[a,b],c]每个数字所在的位置01指示输入是否分别是三角形,矩形和正方形字符。

但是,元素的平方并不意味着输入是平方的,因为像

a3.
4

元素数量为正方形,但不是正方形。

这是æA(arctan2)出现的地方。0æA0== 0æA1==0。换句话说,如果输入的元素数量为正方形,但不是矩形,则它不是正方形。当然,有更明确的方法可以做到这一点,但是当我们有字节要考虑并且允许一致的任意输出时,那又有什么用呢?

请注意,我以前使用æA/而不是æAƝ(在第二个链接中用a ,代替a ;),但是前一种方法将具有正方形元素数的三角形与没有正方形元素的三角形区分开,但是显然应该将它们视为同一事物。


我看着数字在想着,他们似乎隐约熟悉...
Dom Hastings

@DomHastings哈哈。我在区分正方形和元素平方的混乱时遇到了麻烦,arctan2而这正是我所需要的。
dylnan

1
有趣的是,如果没有来源限制,我认为这不会再短了
dylnan

...您确定这是有效的吗?由于Jelly中的换行符是0x7F,而不是0x0A。
user202729'4

@DomHastings这有效吗?(请参阅上述原因)
user202729'4

4

Java的10,274个 323 298 229字节

第一个三角形提交。

s
->
{  
var 
a=s. 
split 
("\n");
int i,l=
a.length,
c,f=a[0]. 
length(),r=
l<2||f<2&a[1
].length()<2?
0:f==l?7:5;var
b=f==1;for(i=1;
i<l;){c=a[i++]. 
length();r&=c!=f?
4:7;r&=(b&c!=f+1)|
(!b&c!=f-1)?3:7;f=c
;}return r;}        

0 混乱

1 长方形

3 广场

4 三角形

在这里在线尝试。

进行了多次编辑以进一步打高尔夫球。

当然,通过将其也变成矩形,我可以节省很多字节(281 267 259 200字节,请参见此处)。

标识的结果使用按位AND进行操作,产生如下的位掩码:

1        1      1
triangle square rectangle

非高尔夫版本:

s -> {
    var lines = s.split("\n"); // split input into individual lines
    int i, // counter for the for loop
    numLines = lines.length, // number of lines
    current, // length of the current line
    previous = lines[0].length(), // length of the previous line
    result = numLines < 2 // result of the identification process; if there are less than two lines
    || previous < 2 & lines[1].length() < 2 // or the first two lines are both shorter than 2
    ? 0 : previous == numLines ? 7 : 5; // it's a mess, otherwise it might be a square if the length of the first line matches the number of lines
    var ascending = previous == 1; // determines whether a triangle is in ascending or descending order
    for(i = 1; i < numLines; ) { // iterate over all lines
         current = lines[i++].length(); // store the current line's length
        result &= current != previous ? 4 : 7; // check if it's not a rectangle or a square
        result &= (ascending & current != previous+1)|(!ascending & current != previous-1) ? 3 : 7; // if the current line is not one longer (ascending) or shorter (descending) than the previous line, it's not a triangle
        previous = current; // move to the next line
    }
    return result; // return the result
}

1
欢迎来到PPCG!
Steadybox'3

万岁的三角形!谢谢!
唐·黑斯廷斯

嗨,欢迎来到PPCG!很棒的第一答案。我也尝试过使答案为三角形,但是与矩形相比,它会花费太多字节,并且某些关键字在我的最初答案中也太长了。:)很好的答案,我+1。我可以自由地编辑您的帖子,以在整个帖子中添加突出显示的内容,因此,您无需阅读的版本中的注释就更易于阅读。入住愉快!
凯文·克鲁伊森

@KevinCruijssen感谢您的支持和编辑,现在看起来好多了。通过将它也变成一个矩形(281个字节)可以缩短我的答案。但是那有什么乐趣呢?
OOBalance

3

Javascript 125字节

_=>(g=(l=_.split('\n').map(a=>a.length)).
length)<3?0:(r=l.reduce((a,b)=>a==b?a:0))
?r==g?2:1:l.reduce((a,b)=>++a==b?a:0)?3:0

0 = Mess
1 = Rectangle
2 = Square
3 = Triangle

fa=_=>(g=(l=_.split('\n').map(a=>a.length)).length)<3?0:(r=l.reduce((a,b)=>a==b?a:0))?r==g?2:1:l.reduce((a,b)=>++a==b?a:0)?3:0

var square = `asd
asd
asd`

var rectangle = `asd
asd
asd
asd
asd
asd`

var triangle = `asd
asdf
asdfg
asdfgh`

var mess = `asd
dasdasd
sd
dasasd`

console.log(fa(square), fa(rectangle), fa(triangle), fa(mess))


3
字节数为125(包括换行符)
Herman L

三角形应该去1吗?不是3456
l4m2,18年

@ l4m2是什么意思?
路易斯·费利佩·德·耶稣·穆诺兹

2
三角形应该总是从1开始?
路易斯·费利佩·德·耶稣·穆诺兹

3
我认为@ l4m2指出的是,三角形的第一行或最后一行必须只有一个字符,否则为“混乱”。
粗野的


3

PHP, 195 205字节

<?$a=$argv[1];$r=substr($a,-2,1)=="\n"?strrev($a):$a;foreach(explode("\n",$r)as$l){$s=strlen($l);$x[$s
]=++$i;$m=$i==$s?T:M;}$z=count($x);echo$i*$z>2?$z==1&&key($x)==$i?S:($z==1&&$i>2?R:($i==$z?$m:M)):M;?>

倒置三角形为此增加了昂贵的56个字节!

输出为S,R,T,M

感谢Dom Hastings,节省了几个字节。

在线尝试!

现在修复了一些问题。

$_="
$_="
$_""
;say

RESULT:S
=============
$_=
"no
t a
squ
are
";#

RESULT:R
=============
$
_=
"So
this
"."".
shape;

RESULT:T
=============
$_="or
even,
this
way
!!
"

RESULT:T
=============
as
smiley
asd
A

RESULT:M
=============
X

RESULT:M
=============
XX

RESULT:M
=============
cccc
a
aa
cccc

RESULT:M
=============

忽略?>应该没问题
tsh

这似乎回到Tcccc\na\naa\ncccc 它的在线试试吧!
Dom Hastings '18

3

Perl 6,81个字节

{.lines>>.chars.&{($_==.[0],3)[2*(2>.max
)+($_ Z- .skip).&{.[0].abs+.Set*2+^2}]}}

在线尝试!

返回True正方形,False矩形,3三角形,Nil混乱。


很好,您介意将其拆开一点$_ Z- .skip吗?
Phil H

3

Stax,39个字节

L{%m~;:-c:u{hJchC; 
|mb1=-C;%a\sI^^P}M0

在线运行和调试!

迄今为止最短的纯ASCII答案。

0-混乱
1-矩形
2-正方形
3-三角形

说明

该解决方案利用了以下事实:如果在程序执行中明确打印了某些内容,则不会生成任何隐式输出。否则,将隐式输出执行结束时的堆栈顶部。

L{%m~;:-c:u{hJchC;|mb1=-C;%a\sI^^P}M0
L                                        Collect all lines in an array
 {%m                                     Convert each line to its length
    ~;                                   Make a copy of the length array, put it on the input stack for later use
      :-                                 Difference between consecutive elements.
                                         If the original array has only one line, this will be an empty array
        c:u                              Are all elements in the array the same?
                                         Empty array returns false
           {                      }M0    If last test result is true, execute block
                                         If the block is not executed, or is cancelled in the middle, implicitly output 0
            hJ                           The first element of the difference array squared (*)
              chC                        Cancel if it is not 0 or 1
                 ;|m1=                   Shortest line length (**) is 1
                      -                  Test whether this is the same as (*)
                                         Includes two cases:
                                             a. (*) is 1, and (**) is 1, in which case it is a triangle
                                             b. (*) is 0, and (**) is not 1, in which case it is a square or a rectangle
                        C                Cancel if last test fails
                         ;%              Number of lines
                           a\            [Nr. of lines, (*)]
                             I           Get the 0-based index of (**) in the array
                                         0-> Square, 1->Triangle -1(not found) -> Rectangle
                              ^^P        Add 2 and print

3

Haskell中113个 107 103 101字节

((#)=<<k).map k.lines;k=length;1#x=0;l#x|x==[1..l]
  ||x==[l,l-1..1]=3;l#x=k[1|z<-[l,x!!0],all(==z)x]

在线尝试!

分别为混乱,矩形,正方形和三角形返回0、1、2和3。

编辑:-2个字节,感谢Lynn


3

05AB1E35 29 27字节

魔术八爪Oct节省了8个字节

DgV€g©ZU¥ÄP®Y
QP®ËJCXY‚1›P*

在线尝试!

0=混乱
4=三角形
1=矩形
3=正方形


这似乎在一些混乱的代码上失败了:在线尝试!
Dom Hastings '18

@DomHastings:感谢您抓住这一点。我以为高尔夫有点开玩笑。现在应该可以了。
Emigna

在线尝试!-19字节-1(矩形),2(三角形),5(平方)和0(错误)[使用二进制数]。可能不可接受,哈哈。gs€g©QP®¥ ÄP®1å&®ËJC可以添加一个空格字符和一个C21。
魔术章鱼缸

@MagicOctopusUrn:它仍然需要检查长度/高度> = 2,但是仍然应该保存字节。巧妙的技巧从二进制文件构建输出数字!
Emigna '18

1
@MagicOctopusUrn:我用您的增量和二进制技巧在我的原始版本上保存了一些字节。可能可以节省更多重写时间。
Emigna '18

2

R,101字节

"if"(var(z<-nchar(y<-scan(,"",,,"
","")))==0,"if"(length(y)==z,1,2
),"if"(all(abs(diff(z))==1),3,4))

1 =平方
2 =矩形
3 =三角形
4 =随机

代码不能处理'NEGATIVE ACKNOWLEDGE'(U + 0015)或上面代码中的正方形。如果输入要求包含此字节,则可以将此字节切换为其他字节。

在线尝试!


也许您可以使用readLines()代替scan()
朱塞佩

@Giuseppe无法/太笨拙,无法使readLines正常工作
Vlo

嗯,看起来您必须指定file("stdin")要从控制台读取它(而不是下一行代码)。这意味着它可能不会那么打高尔夫球。呃,好吧。
朱塞佩

2

蜗牛,29个字节

ada7A
.2,lr
?!(t.
rw~)z
.+~o~

输出键:

  • 0-混乱
  • 3-三角形
  • 6-矩形
  • 7-正方形

如果没有源布局,则为23个字节:

zA
.2,dun!(t.rf~)z.+~o~

自从阅读了引发它的问题以来,我一直热衷于使用这种语言!
Dom Hastings

1

Wolfram语言(Mathematica),119字节

(x=StringLength/@#~StringSplit~"\n")/.{{1}->3,s~(t=Table)~{
s=Tr[1^x]}:>0,x[[1]]~t~s:>1,(r=Range@s)|Reverse@r:>2,_->3}&

Replace /.字符的使用和模式匹配逐行计数。Replace将删除匹配的规则的第一个RHS,因此顺序是测试1个字符的输入,然后测试正方形,矩形,三角形和乱码。

正方形= 0,矩形= 1,三角形= 2,混乱= 3

在线尝试!


@DomHastings,它是固定的。
凯利·洛德

1

红色,209字节

func[s][c: copy[]foreach a split s"^/"[append c length? a]d: unique c
r: 0 if 1 < l: length? c[if 1 = length? d[r: 2 if(do d)= l[r: 1]]n: 0
v: copy[]loop l[append v n: n + 1]if(v = c)or(v = reverse c)[r: 3]]r]

在线尝试!

0 混乱

1 广场

2 长方形

3 三角形


1

AWK,119字节

{p=l;l=L[NR]=length($0)
D=d}{d=p-l;x=x?x:NR>2?\
d!=D:0}END{print x==1?\
3:d*d==1?(L[NR]+L[1]==\
NR+1)?2:3:p!=NR}#######

在线尝试!

输出:

0=正方形
1=矩形
2=三角形
3=混乱


1

红宝石115111字节

->s{m=s.split(?\n).map &:size;r=*1..s=m.size;s<2?4:(m|[
]).size<2?m[0]<2?4:s==m[0]?1:2:r==m.reverse||r==m ?3:4}

在线尝试!

匿名lambda。输出:

  1. 广场
  2. 长方形
  3. 三角形
  4. 混乱

这似乎在某些应标记为混乱的问题上失败了:在线尝试!
Dom Hastings '18

哎呀,我想这将是一个快速解决方案。可能需要尝试打更多的高尔夫球……
Kirill L.

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.