Codegolf — Путь Правильный?

  • Автор темы Jaganat
  • Обновлено
  • 21, Oct 2024
  • #1

Путь правильный?

Учитывая строку, ваша программа должна определить, сможет ли Алиса связаться с Бобом, следуя указателям на карте. Вы должны вернуть истинное или ложное значение.

Входная строка будет содержать следующие символы:

  • (пространство) и
     
     (length of input)*4 
    . Only used for padding.
  • while , for , A , A , являются «знаками». Они показывают направление.
  • AvB ----------------- A&B ----------------- A><B ----------------- A>v ^<B . Ignore next char, whatever it is (including spaces и A>B ----------------- <BA ----------------- A B ----------------- BA ----------------- Av >B > ^ ----------------- Av B ----------------- A>v >B ----------------- A>v> v>B v< > &<^ > ^ ----------------- A>v> v v< >B&< > ^ ----------------- A&<B ----------------- A&B< ----------------- <A &B )
  • - and B соответственно Алиса и Боб.

Карта представляет собой тор. Если Алиса достигает конца ряда, она телепортируется обратно в начало этого ряда. То же самое относится и к столбцам.

Примеры

Учитывая эти примеры в качестве входных данных, ваша программа должна возвращать истинное значение (каждый входной сигнал разделяется знаком A line):

Bob

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

&

Просмотр пути

Вы можете иметь визуальное представление ввода здесь. Спасибо Арнемарту за этот.

Некоторые правила

  • Ввод может быть дополнен пробелами, чтобы сформировать прямоугольник.
  • Изначально Алиса идет прямо вперед (сверху она идет вправо)
  • Ваша программа должен обрабатывать случаи бесконечного цикла (см. подсказку)
  • v is not always the first character, as you may have seen, however, you may write a program that handles only input with ^ это первый символ, но к вашему счету будет добавлено 20 байт.
  • Карта (вход) считается недействительной, если в ней присутствуют другие символы, кроме указанных выше. Вашей программе не придется их обрабатывать.
  • Это так, поэтому побеждает самый короткий код в байтах.

Намекать

Ваша программа, скорее всего, будет циклической, если только вы не найдете более математическое решение этой задачи. Для обработки бесконечного пути я рекомендую использовать конечный цикл (например, < ) instead of a potentially infinite one (e.g > ).

Следовательно, максимальная итерация цикла, которую я могу придумать (я не делал никаких математических вычислений, любые исправления приветствуются): \n

#код-гольф #код-гольф #строка

Jaganat


Рег
06 Nov, 2005

Тем
81

Постов
218

Баллов
633
  • 26, Oct 2024
  • #2

С, 250 байт

 
 
 
 var solution =

m=>[

...m,                           // iterate m.length times

q=~m.length,                    // q = total length of m

l=~m.search`\n`||q,             // l = line length

a=m.search`A`,                  // a = index of Alice

p=                              // p = previous character

d=                              // d = direction offset

r=1                             // r = result

].map(_=>(                        // loop

a+=d,                           // move Alice

a-=d*((a-l+1)%l?m[a]?0:q/l:~l), // wrap

c=m[a],

p=="&"?0:                       // do nothing after &

d={">":1,"<":-1,"^":l,v:-l}     // set the new direction

[c=="B"?r=0:c]                // if on Bob, r = 0

||d,

p=c

))&&!r                            // return result

var testCasesTrue =
`A>B
-----------------
<BA
-----------------
A       B
-----------------
BA
-----------------
Av  >B

>  ^ 
-----------------
Av

B
-----------------
A>v 

>B
-----------------
A>v>   v>B

v< > &<^ 

> ^      
-----------------
A>v>   v

v< >B&<

> ^    
-----------------
A&<B
-----------------
A&B<
-----------------
<A       &B`
.split("\n-----------------\n");

var testCasesFalse =
`AvB
-----------------
A&B
-----------------
A><B
-----------------
A>v 

^<B`
.split("\n-----------------\n");

var test = (cases, expected) => cases.map((t,i)=>++i+": "+(solution(t)==expected?"Pass":"Fail")).join`\n`;
document.write(`<pre>${test(testCasesTrue,true)}\n\n${test(testCasesFalse,false)}</pre>`); 

Это также требует, чтобы ввод был дополнен пробелами.

Негольфед:

m=>[...m,q=~m.length,l=~m.search` `||q,a=m.search`A`,p=d=r=1].map(_=>(a+=d,a-=d*((a-l+1)%l?m[a]?0:q/l:~l),c=m[a],p=="&"?0:d={">":1,"<":-1,"^":l,v:-l}[c=="B"?r=0:c]||d,p=c))&&!r ||answer||

JavaScript (ES6), 176 байт

#define h x=(j+x-1+d%3)%j,i=(j+i+(d=='v')-(d==94))%j char a[999],b[999];x,i,d=2,k,f; main(j){ for(;gets(a+j*i);)j=strlen(a+j*i++); //read lines and determine line length for(x=strchr(a,65)-a,i=x/j,x=x%j; //the current position is 'A' !k*d; //as long as we have not arrived at 'B' //and not travelled through the same cell and in the same direction twice h) //advance one in the current direction k|=b[f=j*i+x]&1<<d%5,b[f]|=1<<d%5, //if we have already travelled //through this cell in this direction (f=a[f])&16?d=f //change direction if this cell is one of <>^v :f&4?h //if this cell is '&', advance one in the current direction :f&2?d=0:0; //if we have reached 'B' putchar(48+!k); }

Объяснение

Требуется, чтобы ввод был дополнен пробелами, чтобы сформировать прямоугольник (надеюсь, это нормально).

#define h x=(j+x-1+d%3)%j,i=(j+i+(d=='v')-(d==94))%j char a[999],b[999];x,i,d=2,k,f;main(j){for(;gets(a+j*i);)j=strlen(a+j*i++);for(x=strchr(a,65)-a,i=x/j,x=x%j;!k*d;h)k|=b[f=j*i+x]&1<<d%5,b[f]|=1<<d%5,(f=a[f])&16?d=f:f&4?h:f&2?d=0:0;putchar(48+!k);}
 

Sekilb93


Рег
27 Nov, 2019

Тем
64

Постов
176

Баллов
526
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно