Программа идентификации формы

25

Ваша задача - создать программу, которая идентифицирует форму ввода. Формы для идентификации могут быть любой из следующих:

Площадь

Чтобы быть идентифицированным как квадрат, источник должен иметь строки одинаковой длины и столько же строк, сколько символов в строке (символы новой строки исключаются). Дополнительный трейлинг-перевод строки является приемлемым.

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

Прямоугольник

Чтобы быть идентифицированным как прямоугольник, источник должен иметь строки одинаковой длины, но количество строк не соответствует количеству символов в строке (символы новой строки исключаются). Дополнительный трейлинг-перевод строки является приемлемым. Это может быть как горизонтально, так и вертикально.

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

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

Треугольник

Чтобы быть идентифицированным как треугольник, источник должен начинаться с одного символа, и каждая последующая строка должна иметь один дополнительный символ (включая последний), или после первой строки каждая последующая строка должна иметь на один символ меньше до последнего, что есть только один.

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

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

бардак

Все, что не соответствует формату, указанному выше, должно быть идентифицировано как беспорядок.

правила

  • Вы можете вернуть любые четыре последовательных значения для печати, чтобы идентифицировать каждую форму.
  • Ваш исходный код также должен соответствовать одной из вышеперечисленных форм (нет, не беспорядок).
  • Один трейлинг-перевод строки в вашем источнике является приемлемым.
  • Можно предположить, что входные данные не содержат пустых строк (включая завершающие новые строки), не являются пустыми и состоят не только из новых строк.
  • Все фигуры должны иметь высоту и ширину> = 2, в противном случае это определяется как беспорядок.
  • Стандартные лазейки запрещены.
  • Самое короткое решение в байтах, на каждом языке, выигрывает.
Дом Гастингс
источник
«Ваш исходный код должен также придерживаться одной из вышеперечисленных форм», это означает, что один вкладыш просто в порядке?
ч. В
1
@ tshAll shapes must have a height and width of >= 2.
TFeld
1
На входе может быть массив? например квадрат ['abc','cfd','fgh']?
Луис Фелипе Де Иисус Муньос
1
@ рекурсивное обновление, спасибо!
Дом Гастингс
3
Вы говорите мне, что мой исходный код не может быть беспорядком? почему бы нет?!?!
НХ.

Ответы:

9

Желе , 35 байт

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

Попробуйте онлайн!

0= Беспорядок
1= прямоугольник
2= квадрат
3= треугольник

Эрик Outgolfer
источник
Используется ли место в вашей последней строке вашим кодом? Или это просто заполнение, чтобы соответствовать критериям "прямоугольника"?
BradC
@BradC Последний. Я, вероятно, должен добавить объяснение.
Эрик Outgolfer
7

Брахилог , 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)
PunPun1000
источник
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= Беспорядок

-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может быть более пригодным для игры с некоторыми побитовыми операциями, но это не совсем мой опыт.
Кевин Круйссен
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
TFeld
источник
@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выдает список длин строк в паре с обратным. 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Ɲ,вместо вместо ;во второй ссылке), но первый метод различает треугольники с квадратным числом элементов и те, у которых их нет, но они, очевидно, должны учитываться как одно и то же.

dylnan
источник
Я смотрел на цифры, думая, что они кажутся смутно знакомыми ...
Дом Гастингс
@DomHastings Ха-ха. Мне было трудно отличить квадраты от беспорядка числа элементов, и это arctan2было именно то, что мне было нужно.
Дилнан
1
Забавно, что я не думаю, что это было бы
немного
... Вы уверены, что это действительно? Новая строка в Jelly - 0x7F, а не 0x0A.
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 байтов, см. Здесь ).

Результатом идентификации манипулируют с помощью побитового И, получая битовую маску следующим образом:

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
}
OOBalance
источник
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 (включая переводы строк)
Герман Л
Треугольник должен идти в 1? не 3456
l4m2
@ l4m2 что ты имеешь в виду?
Луис Фелипе Де Иисус Муньос
2
треугольник всегда должен начинаться с 1?
Луис Фелипе Де Иисус Муньос
3
Я думаю, что @ l4m2 указывает на то, что треугольник должен иметь только один символ в первой или последней строке, в противном случае это «беспорядок».
Лохматый
3

Perl 5 -p , 83 байта

  • Беспорядок: ничего
  • Площадь: 0
  • Треугольник: 1
  • Прямоугольник: 2
($z)=grep++$$_{"@+"-$_*~-$.}==$.,0,/$/,-1
}{$.<2or$_=$$z{$z>0||$.}?$z%2:@F>1&&2x!$z

Попробуйте онлайн!

Тон Хоспел
источник
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 Попробуйте онлайн!
Дом Гастингс
3

Perl 6 , 81 байт

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

Попробуйте онлайн!

Возвращает Trueдля квадрата, Falseдля прямоугольника, 3для треугольника, Nilдля беспорядка.

nwellnhof
источник
Очень хорошо, не могли бы вы немного распаковать его, в частности $_ Z- .skip?
Фил Х
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 байта благодаря Линн !

Laikoni
источник
3

05AB1E , 35 29 27 байт

Сохранено 8 байт благодаря волшебной урне с осьминогом

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

Попробуйте онлайн!

0= Беспорядок
4= Треугольник
1= Прямоугольник
3= Квадрат

Emigna
источник
Похоже, что на каком-то грязном коде ничего не получится: попробуйте онлайн!
Дом Гастингс
@DomHastings: Спасибо, что поймали это. Я думал, что гольф был немного ненадежным. Должно быть хорошо сейчас.
Эминья
Попробуйте онлайн! - 19 байтов - 1 (прямоугольник), 2 (треугольник), 5 (квадрат) и 0 (беспорядок) [использование двоичных чисел]. Возможно, не приемлемо лол. gs€g©QP®¥ ÄP®1å&®ËJCМожно добавить символ пробела и Cдля 21, хотя.
Волшебный Осьминог Урна
@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) или квадратом в коде выше. Этот байт может быть переключен на что-то другое, если требуется, чтобы вход содержал этот байт.

Попробуйте онлайн!

Vlo
источник
может быть, вы могли бы использовать 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~
feersum
источник
Я всегда стремился играть с этим языком с тех пор, как прочитал вопрос, который его породил!
Дом Гастингс
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, затем квадраты, прямоугольники, треугольники и провал для беспорядка.

квадрат = 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

Рубин , 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. бардак
Кирилл Л.
источник
Это выглядит неудачно на некоторых, которые должны быть помечены как беспорядок: попробуйте это онлайн!
Дом Гастингс
Ой, я думаю, что это должно быть быстрым решением. Вероятно, нужно будет попробовать поиграть в гольф немного больше ...
Кирилл Л.