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


25

Ваше завдання - створити програму, яка визначає форму вводу. Форми, які слід ідентифікувати, можуть мати будь-яку з наведених нижче форм.

Майдан

Щоб бути ідентифікованим як квадрат, джерело повинно мати рядки однакової довжини та таку ж кількість рядків, що й символи на рядок (символи нового рядка виключені). Необов'язковий останній новий рядок прийнятний.

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

Прямокутник

Для ідентифікації прямокутника у джерела повинні бути лінії однакової довжини, але кількість рядків не відповідає кількості символів на рядок (символи нового рядка виключені). Необов'язковий останній новий рядок прийнятний. Це може бути як горизонтальним, так і вертикальним.

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

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

Трикутник

Щоб ідентифікувати трикутник, джерело повинно починатись з одного символу, і кожен наступний рядок повинен мати один додатковий символ (включаючи останній), або після першого рядка кожен наступний рядок повинен мати на один символ менше до останнього, який має лише одну.

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

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

Безлад

Все, що не дотримується послідовного формату, як зазначено вище, повинно бути визначено як безлад.

Правила

  • Ви можете повернути будь-які чотири послідовні значення для друку для ідентифікації кожної форми.
  • Ваш вихідний код також повинен відповідати одній із наведених вище форм (ні, не безлад).
  • Прийнятний єдиний новий рядок у вашому джерелі.
  • Ви можете припустити, що введення не містить пустих рядків (включаючи трейлінг нових рядків), не порожнє і не складається лише з нових рядків.
  • Усі форми повинні мати висоту та ширину> = 2, інакше це визначається як безлад.
  • Стандартні лазівки заборонені.
  • Виграє найкоротше рішення в байтах на кожній мові.

"Ваш вихідний код також повинен відповідати одній із вищезазначених форм", чи означає це, що один вкладиш просто добре?
tsh

1
@ All shapes must have a height and width of >= 2.
tsh

1
Вхід може бути масивом? наприклад, квадрат ['abc','cfd','fgh']?
Luis felipe De jesus Munoz

1
@recursive оновлено, дякую!
Дом Гастінгс

3
Ви говорите мені, що мій вихідний код не може бути безладом? чому ні?!?!
NH.

Відповіді:


9

Желе , 35 байт

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

Спробуйте в Інтернеті!

0= Безлад
1= Прямокутник
2= Квадрат
3= Трикутник


Чи простір в останньому рядку використовується вашим кодом? Або це просто прокладка, щоб відповідати критеріям "прямокутника"?
BradC

@BradC Останнє. Мені, мабуть, слід додати пояснення.
Ерік Аутгольфер

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

Желе , 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. Çвикликає друге посилання і в кінці, якщо вхід є одним рядком, результат Çотримує логічний ANDed з попереднім номером, якщо є лише один рядок, вихід буде [0.0, 0.0].

У другому посиланні: ,Uвиводиться список довжин рядків, сполучених із зворотним. Jє 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
Смішно, що я не думаю, що це було б коротше, якби не було обмеження джерела
dylnan

... Ви впевнені, що це дійсно? Оскільки новий рядок в Jelly становить 0x7F, а не 0x0A.
користувач202729,

@DomHastings Чи дійсно це? (див. причину вище)
користувач202729

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 від мене. І я взяв на себе сміливість відредагувати вашу публікацію, щоб додати підсвічування до всієї публікації, тому коментарі у вашій неперевершеній версії легше читати. Насолодитися перебуванням!
Kevin Cruijssen

@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 що ти маєш на увазі?
Luis felipe De jesus Munoz

2
трикутник завжди повинен починатися з 1?
Luis felipe De jesus Munoz

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

Збережено кілька байт завдяки Дому Гастінгсу.

Спробуйте в Інтернеті!

Зараз виправлено декілька проблем ... Тестові запуски створюють це.

$_="
$_="
$_""
;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?
Phil H

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

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 = Випадковий

Код не може мати "NEGATIVE ACKNOWLEDGE" (U + 0015) або квадрат у наведеному вище коді. Цей байт можна переключити на щось інше, якщо для введення потрібен цей байт.

Спробуйте в Інтернеті!


можливо, ви могли б використовувати readLines()замість scan()?
Джузеппе

@Giuseppe Не можу / занадто 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

Мова Вольфрама (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 символу, потім квадрати, прямокутники, трикутники та провал для messes.

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