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


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= треугольник


Используется ли место в вашей последней строке вашим кодом? Или это просто заполнение, чтобы соответствовать критериям "прямоугольника"?
— 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)

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

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


Я смотрел на цифры, думая, что они кажутся смутно знакомыми ...
— Дом Гастингс

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

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

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для беспорядка.


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


3

05AB1E , 35 29 27 байт

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

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

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

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


Похоже, что на каком-то грязном коде ничего не получится: попробуйте онлайн!
— Дом Гастингс

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

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


может быть, вы могли бы использовать 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~

Я всегда стремился играть с этим языком с тех пор, как прочитал вопрос, который его породил!
— Дом Гастингс

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

Рубин , 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. бардак

Это выглядит неудачно на некоторых, которые должны быть помечены как беспорядок: попробуйте это онлайн!
— Дом Гастингс

Ой, я думаю, что это должно быть быстрым решением. Вероятно, нужно будет попробовать поиграть в гольф немного больше ...
— Кирилл Л.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.