Пентоміно валідатор


9

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

Ваше завдання

З огляду на деякий вхідний поділ на нові рядки, що містять 12 унікальних символів, вирішіть, чи це правильне рішення.

Дійсне рішення ОБОВ'ЯЗКОВО

  • Має 5 символів кожного (крім нових рядків)
  • Кожен набір символів повинен бути повністю пов'язаний
  • Кожен набір символів повинен мати унікальну форму
  • Будьте в правильній прямокутній формі

Якщо це правильне рішення, виведіть просте значення, інакше виведіть помилкове значення.

Ваша програма може бути функцією або повноцінною програмою, але вона повинна приймати вхід від stdin та вихід у stdout.

Тестові справи

Дійсні рішення

000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!

00.@@@ccccF111//=---
0...@@c))FFF1//8===-
00.ttttt)))F1/8888=-

Недійсні конфігурації

invalid (doesn't contain 12 unique characters)

111112222233333444445555566666
77777888889999900000qqqqqwwwww (Each set has the same shape)

1234567890qw
w1234567890q
qw1234567890
0qw123456789
90qw12345678 (None of the characters are connected)

1234567890qw (Not 5 characters in every set)

1111122222333334444455555666666
77777888889999900000qqqqqwwwwww (More than 5 characters in some sets)

00
0                   
00.@@@ccccF111//=---
 ...@@c))FFF1//8===-
  .ttttt)))F1/8888=- (Doesn't form a rectangular shape)

1. Чи має відображення пентоміно таку ж форму, як оригінал? 2. Чи можна припустити, що вхід буде складатися з друкованих символів ASCII та нових рядків?
Денніс

@Dennis Так і так
Blue

@DigitalTrauma Це далеко не дублікат цього. До речі, це було дивовижне питання, прикро, що я не встиг відповісти на нього, коли його знову задали.
Річка Рівня Св.

@steveverill Ви праві - я не правильно прочитав це питання
Digital Trauma

Відповіді:


3

JavaScript (ES6), 237 235 222 байт

f=p=>(m=[],s=[],d=0,l=p.indexOf`
`+1,[...p].map((c,i)=>(i+1)%l&&!m[i]?g=d-2<s.indexOf((t=a=>m[a]|p[a]!=c?r=0:(m[a]=y.push(a),n=a<n?a:n,t(a+1)+t(a-1)+t(a+l)+t(a-l)+1))(n=i,y=[])!=5?g=0:s[d++]=y.map(a=>r+=a-n)|r):0),d==12&g)

2 байти збережено завдяки @DankMemes !

Використання

f(`000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!`);
=> true

Пояснення

Кілька приміток щодо цього рішення:

  • Можливо, ця відповідь не вірна. Він насправді не перевіряє, чи мають обертові пентоміно однакову форму, проте я спробував, але не зміг знайти дійсний прямокутник пентоміно, який відповідає вимогам правил і включає два чи більше однакових фігур, що повертаються. Але я не є експертом з пентоміно, тому якщо ви знайдете дійсну комбінацію, з якою це не вдається, дайте мені знати.
  • Правила також вимагають відповіді на використання STDINта STDOUTвведення та виведення, але prompt()розроблені лише для введення в одну лінію, і мій комп'ютер (Windows) автоматично ставить \r\nсимволи в кожен новий рядок під час вставки, тому я зробив це функцією, яка приймає рядок.
f=p=>(
  m=[],                      // m = map of checked characters
  s=[],                      // s = list of shapes found (stored as integer)
  d=0,                       // d = number shapes found
  l=p.indexOf`
`+1,                         // l = length of each line (including newline character)
  [...p].map((c,i)=>         // iterate through each character of the input
    (i+1)%l&&                // skip newline characters
      !m[i]?                 // skip the character if it has already been mapped
        g=                   // g = pentomino is valid
          d-2<s.indexOf(     // check if shape already existed before just now
            (t=a=>           // t() checks if character is part of the shape then maps it
              m[a]|          // skip if character is already mapped
                p[a]!=c      //    or if the current character is part of the shape
              ?r=0:(
                m[a]=        // mark the character as mapped
                  y.push(a), // y = list of shape character indices
                n=a<n?a:n,   // n = minimum index of all characters in the shape
                t(a+1)+      // check and map adjacent characters
                t(a-1)+
                t(a+l)+
                t(a-l)+
                1
              )
          )(n=i,y=[])
            !=5?g=0:         // make sure there are only 5 characters in the shape
            s[d++]=          // add the shape to the list
              y.map(a=>      // sum of (index of each character in the shape - minimum
                r+=a-n)|r    //     index) = unique integer representing the shape
        ):0
  ),
  d==12&g                    // ensure there is 12 shapes and return the 'is valid' result
)

1
Ви можете зловживати позначеними шаблонами, l=p.indexOf`<newline here>`щоб зберегти 2 байти
DankMemes

@DankMemes Дякую за улов! Я дуже втомився, коли написав це, і ще не перевіряв це ще двічі. : P
користувач81655
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.