Проверить Loopy Решения

9

Это дополнительная задача для создания головоломки Loopy . Возможно, вы захотите решить эту задачу, прежде чем пытаться выполнить более сложную задачу из предыдущей ссылки.

Цель этой задачи - проверить правильность решения загадочной головоломки. Пожалуйста, возьмите всю документацию о загадочной загадке из предыдущей ссылки. Решенная зацикленная головоломка отформатирована очень похожим образом на вывод правильного представления для задачи «генерировать зацикленные головоломки» и может выглядеть следующим образом:

+-+-+ +-+ +-+ +
|   | | |2|3|  
+-+ + + + + +-+
 2| | | |2|  3|
+ + +-+ + + +-+
 2|  2 1|3| |  
+-+ +-+ +-+ +-+
|2  | |    1 2|
+ +-+ +-+ +-+ +
| |2 1 2|3|3| |
+ + +-+ +-+ +-+
| | |3|2   1   
+ +-+ +-+-+-+-+
|        2 2  |
+-+-+-+-+-+-+-+

Путь , который составляет решение помечается |и -символы между +символами.

Входная спецификация

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

  • Головоломка имеет не менее 2 и не более 99 клеток в любом направлении
  • Таким образом, каждая строка имеет максимальную длину 199 символов, не включая символы новой строки
  • Таким образом, вход содержит максимум 99 строк
  • каждая строка может заканчиваться после последнего печатного символа или может быть дополнена пробельными символами, поэтому она имеет длину до 2 · y + 1 символов, где y - количество ячеек в горизонтальном направлении
  • каждая позиция с координатами x и y даже содержит +символ
  • позиции, расположенные горизонтально или вертикально рядом с позициями, содержащими +символы, содержат либо символ пробела, находятся за концом строки или содержат -символ, если он расположен горизонтально, или |символ, если он расположен вертикально
  • все остальные позиции либо за концом строки или содержать один из символов , 0, 1, 2, или3
  • все строки заканчиваются символами новой строки по умолчанию вашей платформы
  • есть ровно один завершающий перевод строки

Входные данные должны быть получены одним из следующих способов:

  • Со стандартного ввода
  • Как значение параметра, указанного pв запросе HTTP POST
  • Как содержание формы HTML
  • Как содержимое файла с именем pв каталоге, определяемом реализацией
  • В реализации, определенной способом во время выполнения, если первые четыре не доступны
  • Жестко запрограммирован, если ваш язык не дает возможности получить ввод

Спецификация выхода

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

  • В качестве состояния выхода либо ноль (решение является действительным), либо ненулевое (решение является недействительным)
  • В качестве символа y(решение допустимо) или n(решение недействительно) следует ноль или более произвольных символов, выводимых способом, определяемым реализацией

Поведение вашей программы не определено при обнаружении ввода, не отформатированного в соответствии со спецификацией ввода.

счет

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

Материалы, которые не соответствуют спецификации ввода или вывода или не дают неверных результатов, являются недействительными.

FUZxxl
источник
Как обрабатывается ввод? Читать из файла? STDIN? Могу ли я написать функцию?
Мартин Эндер
@ MartinBüttner "Ваша программа получит ...". Не уверен, почему вы хотели бы прочитать из файла.
Джон Дворак
@ MartinBüttner Вы должны написать полную программу. Я думаю, что язык "ваша программа", "должен прекратить", "статус выхода" довольно ясно.
FUZxxl
1
Также обратите внимание, что в большинстве головоломок 0также есть действительные числа для клетки.
Говард
@Howard Извините, пропустил это.
FUZxxl

Ответы:

2

GolfScript, 133 символа

'|':^4,{48+.(}%+^*1>.^/'-'*+2/:F;4{{~@@/*}2F//n%zip-1%n*}:X*.'+-'?.3+@/(-2<' 9'+\+'9-+  99|+  9'3/:F;.,4*{X}*.9`?@=\' +09
'-!&'ny'1/=

Ожидает ввод от STDIN и печатает yдля правильного решения и nдля недопустимого. Выполняет задачу, используя в основном замену строк в сетке или с повернутыми версиями сетки.

Аннотированный код:

# construct the string "|0|/|1|0|2|1|3|2-0-/-1-0-2-1-3-2"
# split into pieces of two and save to variable F
'|':^4,{48+.(}%+^*1>.^/'-'*+
2/:F;

# run the code block X 4 times
# with X: string-replace 1st item in F with 2nd, 3rd with 4th, ...
# i.e. '|0' with '|/', '|1' with '|0'
# and then rotate grid by 90 degrees
4{{~@@/*}2F//n%zip-1%n*}:X*

# for a valid grid all digits are now reduced to exactly '0'
# (i.e. no '1' or '2' or '3' or '/')

# now follow the loop along and remove it
# start: find the first occurence of '+-+' and replace with '+ 9'
# note: '9' is the marker for the current position
.'+-'?
.3+@/(-2<' 9'+\+

# string-replace '9-+' or '9|+' by '  9' (i.e. go one step along the loop)
# using block X enough times
'9-+  99|+  9'3/:F;
.,4*{X}*

# look for the marker '9' in the result and check if it is at the original
# position again
.9`?
@=

# the remaining grid must not contain any digits besides 0 and 9
# esp. no '|' or '-' may remain
\' +09
'-!

# check if both conditions are fulfilled and output corresponding character
&'ny'1/=
Говард
источник
2

C # 803 579 байтов

Полная программа, считываемая из STDIN, должна соответствовать любой распространенной схеме новой строки, если она имеет перевод строки. Спасибо HackerCow за указание на то, что мне не нужно добавлять новую строку в другом вопросе, предлагая мне удалить ее здесь и сохранить 4 байта

Гольф-код:

using C=System.Console;class P{static void Main(){var D=C.In.ReadToEnd().Replace("\r","").Split('\n');int w=D[0].Length+2,h=D.Length+1,i=0,j,c,T=0,O=1,o,z,R=0;var B=new int[w,h];var S=new int[w*h*9];for(;i++<w-2;)for(j=0;j<h-2;B[i,j]=c)if((c=(D[j++][i-1]-8)%10)>5){c=5;T++;S[0]=i+j*w;}for(i=0;++i<w-1;)for(j=0;++j<h-1;)R=(i%2+j%2>1&(o=B[i,j-1]%2+B[i-1,j]%2+B[i+1,j]%2+B[i,j+1]%2)>0&o!=2)|((c=B[i,j])<4&c!=o)?7:R;for(o=h=0;o<O;B[i,j]=0)if(B[i=(c=S[o++])%w,j=c/w]>4){h++;S[O++]=(S[O++]=c-w-1)+2;S[O++]=(S[O++]=c+w-1)+2;z=j%2<1?w*2:2;S[O++]=c-z;S[O++]=c+z;}C.Write(h-R<T?"n":"y");}}

Код выполняет 3 проверки, сначала проверяя количество строк вокруг каждого числа, и что каждое соединение имеет 0 или 2 строки, идущие от него, затем все линии объединяются.

Форматированный код:

using C=System.Console;

class P
{
    static void Main()
    {
        var D=C.In.ReadToEnd().Replace("\r","").Split('\n');
        int w=D[0].Length+2,h=D.Length+1,i=0,j,c,T=0,O=1,o,z,R=0;
        var B=new int[w,h]; // this is the grid
        var S=new int[w*h*9]; // this is a list of joined up lines (stored as x+y*w)

        for(;i++<w-2;)
            for(j=0;j<h-2;B[i,j]=c)
                if((c=(D[j++][i-1]-8)%10)>5)
                { // we are a line
                    c=5;
                    T++; // increment line counter
                    S[0]=i+j*w; // set start of loop
                }

        for(i=0;++i<w-1;) // this loop checks the numbers and that every + has 0 or 2 lines leading from it
            for(j=0;++j<h-1;)
                R=(i%2+j%2>1&(o=B[i,j-1]%2+B[i-1,j]%2+B[i+1,j]%2+B[i,j+1]%2)>0&o!=2)|((c=B[i,j])<4&c!=o)?7:R; // set R to 7 (no significance) if check fails

        for(o=h=0;o<O;B[i,j]=0) // this loops through the list of joined lines adding more until the whole loop has been seen
            if(B[i=(c=S[o++])%w,j=c/w]>4)
            {
                h++; // increment "seen" counter
                S[O++]=(S[O++]=c-w-1)+2;
                S[O++]=(S[O++]=c+w-1)+2;
                z=j%2<1?w*2:2; // special for | and -
                S[O++]=c-z;
                S[O++]=c+z;
            }

        C.Write(h-R<T?"n":"y"); // check if R is greater than 0 or h is less than T and output appropriately
    }
}
VisualMelon
источник
Спасибо @ edc65, не знаю, как я это пропустил!
VisualMelon
1

Кобра - 514

class P
    def main
        t,m,g=[[1]][:0],nil,File.readAllLines('p')
        u,i=g[0].length,1
        for l in g.length,for c in u,if g[l][c]in'0123'
            n=0
            for j in-1:2:2,for r in[g[l+j][c],g[l][c+j]],if r in'-|',n+=1
            if'[n]'<>g[l][c],m?='n'
        else if g[l][c]in'-|',x,y,t,d=c,l,t+[[c,l]],g[l][c]
        while i
            i=z=6
            for f,b in[[-1,1],[1,1],[0,2],[-1,-1],[+1,-1],[0,-2]]
                if'-'==d,f,b=b,f
                for w in t.count,if z and t[w]==[x+f,y+b],t,x,y,d,z=t[:w]+t[w+1:],x+=f,y+=b,g[y][x],0
                i-=z//6
        print if(t.count,'n',m?'y')

Проверяет, имеет ли каждое число правильное количество строк рядом с ним, а затем обходит путь вокруг строк и проверяет, пропустило ли оно какие-либо.

Οurous
источник