形状識別プログラム


25

あなたの仕事は、入力の形状を識別するプログラムを作成することです。識別される形状は、次のいずれかです。

平方

正方形として識別されるためには、ソースはすべて同じ長さの行と、1行あたりの文字数と同じ行数(改行文字を除く)を持っている必要があります。オプションの末尾の改行も使用できます。

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

矩形

長方形として識別されるためには、ソースはすべて等しい長さの行を持っている必要がありますが、行数は行ごとの文字数と一致しません(改行文字は除外されます)。オプションの末尾の改行も使用できます。これは、水平または垂直のいずれかです。

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

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

三角形

三角形として識別するには、ソースは1文字で始まり、後続の各行に追加の文字(最後を含む)が1つ必要です。または、最初の行の後、後続の各行は最後まで1文字少ない必要があります。 1つだけです。

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

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

混乱

上記のような一貫した形式に従わないものはすべて、混乱として識別される必要があります。

ルール

  • 4つの一貫した印刷可能な値を返して、各形状を識別できます。
  • また、ソースコードは上記の形状のいずれかに準拠する必要があります(いや、混乱ではありません)。
  • ソース内の単一の末尾の改行は許容されます。
  • 入力には空白行(末尾の改行を含む)が含まれておらず、空ではなく、改行のみで構成されていないことが想定できます。
  • すべての形状の高さと幅は2以上である必要があります。それ以外の場合、これは混乱として定義されます。
  • 標準的な抜け穴は禁止されています。
  • 各言語のバイト単位の最短ソリューションが勝ちです。

「あなたのソースコードも上記の形状のいずれかに準拠する必要があります」ということは、1つのライナーが問題ないということですか?
tsh

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

1
入力は配列にすることができますか?たとえば、正方形['abc','cfd','fgh']
ルイスフェリペデジェススムニョス

1
@再帰が更新されました、ありがとう!
ドムヘイスティングス

3
あなたは私のソースコードが混乱することはできないと言っていますか?何故なの?!?!
NH。

回答:


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

Java 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=混乱。

@OlivierGrégoireのおかげで-14バイト。

説明:

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

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することにより、さらに2バイトをゴルフしましたD>-2|D<2。1とすることを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;++)。ループとその後のステートメントを1つにマージすることで、まだゴルフができますが、今はどのように見えるかわかりません。
オリビエグレゴワール


6

ゼリー32 27バイト

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

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

行のリストで入力を受け取り、の 代わりにafterで切り替え>1×’a使用SƲL€ますFLƲƊ。これにより、2行に凝縮でき、合計で5バイト節約できました。次の値は以前と同じです。

[0.0, 0.0]=メス
[0.0, 1.5707963267948966]=長方形
[0.0, 0.7853981633974483]=正方形
[1.5707963267948966, 0.0]=三角形


ZL«L高さと幅の最小値を取得し、1 を減算します。 Çは2つ目のリンクを呼び出し、入力が1行であるÇ場合には出力が1行のみである場合の結果は前の数と論理ANDを取ります[0.0, 0.0]

2番目のリンクで,Uは、逆になった行の長さのリストを生成します。Jでありrange(number of lines)⁼€それぞれがの結果と等しいかどうかをチェックしますJ(任意)入力が三角形の場合、1になります。

E すべての行の長さが等しいかどうかを確認します(長方形/正方形)。

SƲa $を使用して、それらを単一のモナドにグループ化し、文字の総数が二乗数であるかどうかをチェックします。

したがって、2番目のリンクの最後には、[[a,b],c]各数値がどこにあるか、0または1入力が三角形、長方形、およびそれぞれ正方形の文字数であるかどうかを示します。

ただし、要素の平方数は、入力が正方形であることを意味するものではありません。

a3.
4

要素の平方数がありますが、正方形ではありません。

これがæA(arctan2)の出番です。0æA0== 0æA1== 0。言い換えると、入力に要素の平方数があるが、長方形ではない場合、それは正方形ではありません。これを行うためのより明確な方法は確かにありますが、考えるバイトがあり、一貫した任意の出力が許可されている場合、それは重要です。

私が以前使っていた注意æA/の代わりにæAƝ(と,代わりの;が、第2リンクでの)要素とそうでないものの正方形の数を持っていますが、それらは明らかに同じものとしてカウントされなければならない三角形の間に前者の方法を区別します。


私は数字の考え方を見ていた、彼らは思え漠然とおなじみの...
ドムヘイスティングス

@DomHastingsハハ。私は正方形と要素の平方数の混乱を区別するのに問題arctan2があり、まさに私が必要としていたものでした。
ディルナン

1
おかしい、私は何のソース制限がなかった場合、これは任意の短いだろうとは思わないこと
dylnan

...これは有効ですか?Jellyの改行は0x0Aではなく0x7Fです。
-user202729

@DomHastingsこれは有効ですか?(上記の理由を参照)
user202729

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

三角形の完全版!ありがとう!
ドムヘイスティングス

こんにちは、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(改行を含む)
ハーマンL

三角形は1になりますか?3456ではない
l4m2

@ l4m2どういう意味ですか?
ルイスフェリペデイエスムニョス

2
三角形は常に1から開始する必要がありますか?
ルイスフェリペデジェススムニョス

3
@ l4m2が指摘しているのは、三角形の最初の行または最後の行に1文字のみが含まれている必要があるということです。
シャギー


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



3

スタックス、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

05AB1E35 29 27バイト

Magic Octopus Urnのおかげで8バイト節約

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

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

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


これはいくつかの厄介なコードで失敗するようです:オンラインで試してみてください!
ドムヘイスティングス

@DomHastings:それをキャッチしてくれてありがとう。ゴルフは少し不確かだと思いました。今は大丈夫です。
エミグナ

オンラインでお試しください!-19バイト-1(長方形)、2(三角形)、5(正方形)、および0(混乱)[2進数を使用]。おそらく受け入れられない笑。ただしgs€g©QP®¥ ÄP®1å&®ËJC、スペース文字とC21 を追加できます。
魔法のタコ

@MagicOctopusUrn:長さ/高さ> = 2を確認する必要がありますが、バイトを節約する必要があります。バイナリから出力数を構築する巧妙なトリック!
エミグナ

1
@MagicOctopusUrn:元のバージョンでいくつかのバイトを保存するために、デルタとバイナリのトリックを使用しました。おそらくそれをもう少し書き換えてさらに保存できます。
エミグナ

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 =ランダム

コードは、「否定的承認」(U + 0015)または上記のコードの四角を処理できません。入力にこのバイトが含まれている場合は、このバイトを別のバイトに切り替えることができます。

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


多分あなたはreadLines()代わりに使用できますscan()か?
ジュゼッペ

@Giuseppeは、/あまりにも仕事にreadLinesを取得するためにnoobのできない
VLO

うーん、file("stdin")(コードの次の行ではなく)コンソールから読み取るように指定する必要があるようです。それはおそらくゴルフが少なくなることを意味します。まぁ。
ジュゼッペ

2

カタツムリ、29バイト

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

出力キー:

  • 0-混乱
  • 3-三角形
  • 6-長方形
  • 7-スクエア

ソースレイアウトなしでは23バイトになります。

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

私はそれを生み出した質問を読んで以来、この言語で遊ぶことに常に熱心でした!
ドムヘイスティングス

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文字の入力をテストし、次に正方形、長方形、三角形、および混乱のフォールスルーをテストすることです。

square = 0、rectangle = 1、triangle = 2、mess = 3

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


@DomHastings、修正されました。
ケリーロウダー



1

ルビー115 111バイト

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

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

匿名ラムダ。出力:

  1. 平方
  2. 矩形
  3. 三角形
  4. 混乱

これは、混乱としてフラグが付けられるべきもので失敗するようです
ドムヘイスティングス

痛い、私はこれが簡単な修正として行かなければならないと思う。おそらく、もう少しそれをゴルフしようとする必要があります...
キリルL.

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