형상 식별 프로그램


25

당신의 임무는 입력의 모양을 식별하는 프로그램을 구축하는 것입니다. 식별 할 모양은 다음 중 하나 일 수 있습니다.

광장

정사각형으로 식별 되려면 소스에 길이가 모두 같은 행과 한 줄에있는 문자와 동일한 수의 행이 있어야합니다 (줄 바꿈 문자 제외). 선택적인 후행 줄 바꿈이 허용됩니다.

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

구형

사각형으로 식별하려면 소스에 길이가 모두 같은 줄이 있어야하지만 줄 수는 줄당 문자 수와 일치하지 않습니다 (줄 바꿈 문자 제외). 선택적인 후행 줄 바꿈이 허용됩니다. 가로 또는 세로 일 수 있습니다.

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

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

삼각형

삼각형으로 식별하려면 소스는 하나의 문자로 시작해야하며 이후의 각 줄에는 하나의 추가 문자 (마지막 포함)가 있어야합니다. 하나만 있습니다.

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

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

음식물

위와 같이 일관된 형식을 따르지 않는 것은 엉망으로 식별해야합니다.

규칙

  • 각 모양을 식별하기 위해 4 개의 일관된 인쇄 가능 값을 반환 할 수 있습니다.
  • 소스 코드는 위의 형태 중 하나를 준수해야합니다 (엉망이 아님).
  • 소스에서 하나의 후행 줄 바꿈이 허용됩니다.
  • 입력에 빈 줄이 포함되지 않고 (후행 줄 바꿈 포함) 비어 있지 않고 줄 바꿈만으로 구성되지 않는다고 가정 할 수 있습니다.
  • 모든 모양의 높이와 너비는> = 2 여야합니다. 그렇지 않으면 엉망으로 정의됩니다.
  • 표준 허점은 금지되어 있습니다.
  • 각 언어에서 가장 짧은 바이트 단위의 솔루션이 우선합니다.

"소스 코드도 위의 모양 중 하나를 준수해야합니다."하나의 라이너만으로도 괜찮습니까?
tsh

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

1
입력은 배열이 될 수 있습니까? 예를 들어, 사각형 ['abc','cfd','fgh']?
Luis felipe De jesus Munoz 12

1
@ 재귀 업데이트, 감사합니다!
Dom Hastings

3
내 소스 코드가 엉망이 될 수 없다고 말하고 있습니까? 왜 안돼?!?!
NH.

답변:



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= 엉망.

@ 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. l==1|L==1비트 단위 작업을 통해 그 중 하나와 골프를 더 골프화 할 수는 있지만 실제로는 내 전문 지식이 아닙니다.
Kevin Cruijssen

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;++) 이후 . 루프와 문장을 하나로 합쳐서 여전히 골프를 할 수는 있지만 지금은 잘 모르겠습니다.
Olivier Grégoire


6

젤리 , 32 27 바이트

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

온라인으로 사용해보십시오!

이제 줄 목록에서 입력을 받고 대신에 after 를 사용하여 전환 >1×했습니다 . 이것으로 두 줄로 압축하고 총 5 바이트를 절약했습니다. 다음과 같은 값이 이전과 동일합니다.’aSƲL€FLƲƊ

[0.0, 0.0]= 메시
[0.0, 1.5707963267948966]= 사각형
[0.0, 0.7853981633974483]= 사각
[1.5707963267948966, 0.0]= 삼각형


ZL«L높이와 너비의 최소값을 구하고 1을 뺍니다. Ç입력이 단일 라인 인 경우 두 번째 링크를 호출하고 마지막에 단일 라인 Ç만있는 경우 이전 번호와 논리 AND 된 결과 가 출력됩니다 [0.0, 0.0].

두 번째 링크에서 : ,U그와 짝을 이루는 줄 길이 목록을 생성합니다. Jis range(number of lines)⁼€각각이의 결과와 같은지 확인합니다 J. 입력이 삼각형이면 (임의의 값)은 1입니다.

E 모든 선 길이가 동일한 지 확인합니다 (직사각형 / 정사각형).

SƲ를 사용하여 $단일 모나드로 그룹화하면 총 문자 수가 제곱인지 여부를 확인합니다.

따라서 두 번째 링크의 끝에 [[a,b],c]각 숫자가 0있거나 1입력이 삼각형인지, 사각형인지, 문자 수가 제곱인지를 나타내는 위치 가 있습니다 .

그러나 제곱 수의 요소는 입력이 제곱임을 암시하지 않습니다.

a3.
4

요소의 제곱은 있지만 정사각형은 아닙니다.

이것은 æA(arctan2)가 들어오는 곳입니다. 0æA0== 0æA1== 0. 즉, 입력에 제곱 수의 요소가 있지만 사각형이 아닌 경우 사각형이 아닙니다. 이 작업을 수행하는 더 확실한 방법이 있지만 생각할 바이트가 있고 일관된 임의 출력이 허용되는 경우 문제가됩니다.

참고 이전 æA/æAƝ( 두 번째 링크에서 ,대신 대신) 대신 사용 ;했지만 이전 방법은 제곱 수의 요소가있는 삼각형과 그렇지 않은 삼각형을 구별하지만 분명히 같은 것으로 계산해야합니다.


나는 숫자 생각을보고 있었는데, 그들은 모호하게 친숙해 보입니다 ...
Dom Hastings

@DomHastings 하하. 나는 사각형을 요소 수의 엉망으로 구별하는 데 어려움을 겪고 arctan2있었고 정확히 내가 필요한 것입니다.
dylnan

1
소스 제한이 없다면 이것이 더 짧을 것이라고 생각하지 않는 것이 재미있다.
dylnan

... 이것이 유효합니까? 젤리의 개행 문자는 0x0A가 아니라 0x7F입니다.
user202729

@DomHastings 이것이 유효합니까? (위의 이유를 참조하십시오)
user202729

4

자바 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

삼각형을위한 만세! 감사!
Dom Hastings

안녕하세요, PPCG에 오신 것을 환영합니다! 좋은 첫 번째 대답. 나는 대답을 삼각형으로 만들기 전에 시도했지만 사각형과 비교할 때 너무 많은 바이트가 필요했으며 초기 키워드에서도 일부 키워드가 너무 길었습니다. :) 큰 대답이지만, 나에게서 +1. 또한 게시물 전체를 강조 표시하여 게시물 전체를 강조 표시 할 수있는 자유를 얻었으므로 ungolfed 버전의 댓글을 쉽게 읽을 수 있습니다. 체류를 즐길 수!
케빈 크루이 센

@KevinCruijssen 공감과 편집에 감사드립니다. 사각형을 281 바이트로 바꾸면 대답이 단축 될 수 있습니다. 그러나 그 재미는 어디에 있습니까?
OOBalance

3

자바 스크립트 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

@ l4m2 무슨 뜻인가요?
Luis felipe De jesus Munoz

2
삼각형은 항상 1에서 시작해야합니까?
Luis felipe De jesus Munoz

3
@ l4m2가 지적한 것은 삼각형이 첫 번째 또는 마지막 줄에 하나의 문자 만 있어야한다는 것입니다. 그렇지 않으면 "mess"입니다.
얽히고 설킨


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

이 반환 것으로 보인다 T위해 cccc\na\naa\ncccc 그것을 온라인으로보십시오!
Dom Hastings


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

05AB1E , 35 29 27 바이트

Magic Octopus Urn 덕분에 8 바이트 절약

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

온라인으로 사용해보십시오!

0= 엉망
4= 삼각형
1= 사각형
3= 사각형


지저분한 코드에서는 실패한 것 같습니다. 온라인으로 사용해보십시오!
Dom Hastings

@DomHastings : 그것을 잡아 주셔서 감사합니다. 나는 골프가 조금 멍청하다고 생각했다. 이제 괜찮을거야.
Emigna

온라인으로 사용해보십시오! -19 바이트-1 (사각형), 2 (삼각형), 5 (제곱) 및 0 (메시) [이진수 사용]. 허용되지 않는 lol. 그러나 gs€g©QP®¥ ÄP®1å&®ËJC공백 문자와 C21을 추가 할 수 있습니다 .
Magic Octopus Urn

@MagicOctopusUrn : 여전히 길이 / 높이> = 2를 확인해야하지만 여전히 바이트를 저장해야합니다. 바이너리에서 출력 번호를 만드는 영리한 트릭!
Emigna

1
@MagicOctopusUrn : 델타와 바이너리 트릭을 사용하여 원래 버전의 바이트를 절약했습니다. 재 작성을 조금 더 절약 할 수있을 것입니다.
Emigna

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

@Giuseppe readLines가 작동하지 않을 수 없습니다.
Vlo

흠, file("stdin")다음 코드 줄이 아닌 콘솔에서 읽 도록 지정해야 합니다. 그것은 아마 덜 골프 될 것임을 의미합니다. 아 잘.
Giuseppe

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 Language (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, 고정되었습니다.
Kelly Lowder



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}

온라인으로 사용해보십시오!

익명의 람다. 출력 :

  1. 광장
  2. 구형
  3. 삼각형
  4. 음식물

이것은 엉망으로 표시되어야하는 일부에서는 실패한 것 같습니다 .
Dom Hastings

아야, 이것이 빠른 수정으로 가야 할 것 같아요. 아마 좀 더 골프를 쳐볼 필요가있을 것입니다 ...
Kirill L.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.