Затвердити петельні рішення


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(рішення недійсний) з наступним нулем або більше довільних символів виводяться певним чином

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

Оцінка балів

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

Подання, які не дотримуються специфікації вводу або виводу або генерують неправильні результати, є недійсними.


Як обробляти вхід? Читати з файлу? 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
    }
}

Дякую @ 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')

Перевіряє, чи має кожне число потрібну кількість рядків поруч, а потім проходить шлях навколо рядків і перевіряє, чи пропущено якесь.

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