Пентомино Валидатор


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 и символов новой строки?
Денис

@ Денис Да и Да
Синий

@DigitalTrauma Это не отдаленно дубликат этого. Кстати, это был потрясающий вопрос, жаль, что у меня не было времени ответить на него, когда его недавно спросили.
Уровень Река St

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