Alphys'in en yeni bulmacasını geliştirmeye yardım et!


16

Yeraltı Kraliyet Bilimcisi Alphys, yeni bir bulmaca için bir prototip tamamladı. Ancak, test etmek isteyen birini bulamıyor gibi görünüyor.

Yapbozunun kuralları aşağıdaki gibidir:

Amaç, sol taraftaki en ortadaki karodan başlayarak sağ tarafa ulaşmaktır. Çift sayılı yüksekliklere sahip bulmacalar için, iki orta karonun altından başlayın. (Örnekler: Sıfır dizinli 4x4 dizisinde, başlangıç ​​konumu [2,0] - satır 2, sütun 0 olacaktır. Sıfır dizinli 5x5 dizisinde başlangıç ​​konumu [2,0] - satır 2, sütun olacaktır. 0)

Her renkli döşemenin kendi "sadist" işlevi vardır:

  • Pembe ve yeşil fayanslar ("P" ve "G" olarak temsil edilir) hiçbir şey yapmaz
  • Kırmızı ve sarı fayanslar ("R", "Y") geçilmezdir.
  • Turuncu fayans ("O") oyuncuyu portakal gibi kokuyor
  • Mor fayanslar ("U") oyuncuyu karşı karşıya oldukları yönde bir sonraki karoya zorlar ve limon gibi kokturur
  • Mavi karolar ( "B") olduğu sürece oyuncu yok gibi fena değil portakal gibi kokuyor.

Lezzet mekaniğini açıklığa kavuşturmak için, bir oyuncunun kokusu süresiz olarak veya farklı kokulu bir karo tarafından geçersiz kılınana kadar, yani bir oyuncu turuncu bir karo üzerine basarsa, mor bir karo üzerine basana kadar portakal gibi kokar.

Ek olarak, mavi bir karoya dikey veya yatay olarak yerleştirilmiş sarı bir karo, mavi karonun da geçilmez olmasına neden olacaktır.


Göreviniz, bulmacanın düzenini giriş olarak temsil eden ve hem orijinal bulmacayı hem de çözülmüş bulmacayı yıldız işaretleri veya bazılarıyla çıktı olarak gösteren 2 boyutlu bir karakter dizisini (veya 1D dize dizisini veya başka bir geçerli biçimi) kabul eden bir program veya işlev yazmaktır. diğer karakter doğru yolu gösterir. Verilen bulmacanın çözülebilir olduğunu varsayın.

Bu bulmacayı örnek olarak kullanın:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

Programınızın çıktısı:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

Kullanılan tüm bulmaca kullanılarak oluşturulmalıdır bu .

Standart kod golf kuralları geçerlidir. En iyi cevaplar her dil için en kısa olacaktır. Yanıtlar dili, bayt sayısını ve üç test vakasını içermelidir. İlk ikisi seçtiğiniz herhangi bir düzen olabilir, ancak üçüncüsü şöyle olmalıdır:

RRRR
RPPR
PUOR
RPBP

Önerilen test örneği: RRRR | RPPR | PUOR | RPBP. Eğer bir hata yapmazsam, bu iki kez U döşemesini geçmenizi gerektirir. Ayrıca, kiremit geçilmezken U'nun davranışından emin değilim, yine de U'ya yürüyebilir misiniz yoksa bunu yapamaz mısınız?
FryAmTheEggman

@FryAmTheEggman U döşemesinden sonraki döşemenin geçilemez olması durumunda, bu döşemede U döşemesinde yürüyemezsiniz.
EnragedTanker

@TimmyD Sanırım bu bulmacayı ilk yaptığımda fark etmedim.
EnragedTanker

@crayzeedude Sanırım Fry'ın test davası yanlış. İkinci sırada RPPR olmalı, RPRR değil.
Sherlock9

@ Sherlock9 Hata! Gerçekten yaptım, teşekkürler.
EnragedTanker

Yanıtlar:


2

C 529 bayt

#define M m[y][x]
char**m,*l,i;main(Y,X){for(;scanf("%ms",&l)>0;)(m=realloc(m,Y*8))[Y-1]=l,X=puts(m[Y++-1])-2;puts("");int s(x,y,c,d){(x<0|y<0|y/Y)?:({if(M^'R'&&M^'Y')if(M^'B'||c^2&&!((y&&m[y-1][x]=='Y')|(x&&m[y][x-1]=='Y')|(y<Y-1&&m[y+1][x]=='Y')|(x<X-1&&m[y][x+1]=='Y'))){x^X?:({M='#';return 1;});c=M^'O'?c:2;M^'U'?:({return s(x+(d<4?d-2:0),y+(d>3?d-5:0),1,d)?({M='#';1;}):0;});if(d^1&&s(x+1,y,c,3)||d^4&&s(x,y+1,c,6)||d^6&&s(x,y-1,c,4)||d^3&&s(x-1,y,c,1)){M='#';return 1;}}});return 0;}s(0,--Y/2,0,3);for(;i<Y;)puts(m[i++]);}

Bilmece, bloke edilmediğimiz, sonra denedikten sonra aşağıya ve son olarak sola geri dönmemiz koşuluyla önce sağa adım atarak yaklaşıyoruz. Arama özyinelemelidir ve başarılı bir yol belirlediğimizde, matrisimizdeki boşlukları işaretler ve geri döneriz.

Çevrimiçi Deneyin

Ungolfed

#include <stdio.h>
#include <malloc.h>
char**m,*l,i;
main(Y,X) {
  for(Y=1;scanf("%ms",&l)>0;Y++)
      m=realloc(m,Y*8),
      m[Y-1]=l,
      X=puts(m[Y-1])-2;
  puts("");
  int step(x,y,c,d,i){
    if(x<0||y<0||y>=Y)return 0;
      if(m[y][x]=='R'||m[y][x]=='Y')return 0;
      if(m[y][x]=='B'&&(c==2||(y&&m[y-1][x]=='Y')||(x&&m[y][x-1]=='Y')
               ||(y<Y-1&&m[y+1][x]=='Y')||(x<X-1&&m[y][x+1]=='Y')))return 0;
      if(x==X){m[y][x]='#';return 1;}
      if(m[y][x]=='O')c=2;
      if(m[y][x]=='U')return step(x+(d<4?d-2:0),y+(d>3?d-5:0),1,d,i+1)?({m[y][x]='#';1;}):0;
      else if((d!=1&&step(x+1,y,c,3,i+1)) ||
    (d!=4&&step(x,y+1,c,6,i+1)) || (d!=6&&step(x,y-1,c,4,i+1)) ||
    (d!=3&&step(x-1,y,c,1,i+1))) {m[y][x]='#';return 1;}
      return 0;
  }
  step(0,--Y/2,0,3,0);
  for(;i<Y;)puts(m[i++]);
}

Örnek Çıktı 1

PYYOPPPP
YRGGRYRG
PGPBYPUR
PYRBOYOG
OBPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

PYY#####
YR##RYRG
###BYPUR
#YRBOYOG
#BPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

Örnek Çıktı 2

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
PUPUUURO
BGGUYPRG
GBOPGGRG
PUPUBUYB
GYOPRPOG

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
###UUURO
BG#UYPRG
GB####RG
PUPUB#YB
GYOPR###

Örnek Çıktı 3

RRRR
RPPR
PUOR
RPBP

RRRR
R##R
###R
R###
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.