Você é um explorador, mapeando um mundo desconhecido. Seu navio é levado pelo vento. Para onde vai, quem sabe?
Todos os dias, na luneta, você vê recursos ao norte, sul, leste e oeste. Você sempre vê quatro desses recursos, correspondentes às direções cardeais. Sua luneta relata símbolos ASCII como este:
~~.*
, ~~~~
, ~.^^
,~#~#
Os símbolos estão na ordem (norte, sul, leste, oeste).
Estes são os símbolos: ~
= mar, .
= costa, ^
= montanha, *
= árvore, #
= inválido (nenhuma observação, isso ocorre sempre que você vê a borda do mundo ou a paisagem é obscurecida pelo nevoeiro). Sua luneta vê exatamente uma unidade em todas as direções.
Todas as noites, você olha para as estrelas para ver até onde você viajou. Olhar para as estrelas relata um símbolo ascii como este:
n
, s
, e
,w
correspondendo a norte, sul, leste e oeste, respectivamente. Você sempre move exatamente uma unidade para o norte, sul, leste ou oeste todas as noites. Então você, como explorador, receberá um fluxo interminável de símbolos:
~~.*n~~~~s~~.*s~.**
Sua tarefa é produzir um mapa 2D do mundo (onde ?
existem partes desconhecidas do mapa, o norte está no alto, o leste está no lado direito):
?~~~??????
?~~~??????
?~~~.^^.??
?~~.***.~~
~~.*^^*.~~
~~~..~~~~~
~~~~~~~~~~
~~~~~~~~~~
Por uma questão de simplicidade, vamos supor que você comece no canto inferior esquerdo do mapa. Suponha que todos os mapas sejam 8x8.
Aqui está um exemplo simples de 3x3. Suponha que o mapa fique assim:
~.~
~^~
~.~
Com a seguinte entrada: ~#.#n~~^#s
Você obterá esta saída:
~??
~^?
~.?
Mais exemplos de entradas e saídas:
entrada
~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w.#~~
saída
~~~~~~~~
~....~~~
~.????~~
~~????~~
~~????.~
~~????~~
~~?.^.~~
~~~~~~~~
Entrada:
~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s
Saída:
?~~~~~??
?....~??
?.**.~??
?~..~~??
?~~~~~??
?~~..~??
~~~.^.??
~~~~~~??
fonte
~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w
) está errado, ea saída deve ter??
onde diz?.
Respostas:
MATL ,
685958 bytesExperimente online!
Explicação
O mapa é mantido na parte inferior da pilha e preenchido gradualmente. A posição atual do explorador é armazenada na área de transferência J.
O mapa usa coordenadas da matriz, então (1,1) fica no canto superior esquerdo. Além disso, é utilizada a indexação linear principal da coluna. Isso significa que os elementos da matriz 8 × 8 que representam o mapa são acessados com um único índice da seguinte maneira:
Assim, por exemplo, o elemento (3,2) da matriz é o elemento com índice linear 11. O movimento em direção ao norte, sul, leste e oeste corresponde, respectivamente, à adição de -1, 1, 8 ou -8 ao índice linear. A matriz [-1 1 8 -8] serve para codificar duas coisas diferentes:
A sequência de entrada é organizada em pedaços de
5
caracteres. Como o primeiro pedaço está ausente do primeiro caractere (aquele que indica movimento), uma inicials
é incluída arbitrariamente para tornar todos os pedaços do mesmo tamanho. Para compensar isso, o explorador começa na posição 7, e não 8; portanto, o deslocamento inicial para o sul (adicione 1 ao índice linear) os deixa na posição 8.Os pedaços de 5 caracteres são processados em um loop. O primeiro caractere atualiza a posição e os 4 restantes, se diferentes
#
, são gravados nas entradas adequadas da matriz que representa o mapa.fonte
C,
210208207 bytesEste usa printf e scanf para ler a entrada e uma matriz linearizada em vez de x, y; então eu sinto que é suficientemente diferente de milibyte .
Golfe:
De certa forma não-destruído:
Representação:
Além disso, você começa na posição 8 porque isso raspa um caractere mais ou menos do loop de impressão.
fonte
Fortran,
263251247235234216 bytesVersão 1D (semelhante à de Don Muesli):
Versão 2D:
Para ativar a forma livre e o pré-processamento, o arquivo precisa da extensão
.F90
, por exemploexplorer.F90
. A entrada é lida em STDIN:fonte
C,
265226224 bytesO mapa é 8x8, eu não percebi isso antes. E aqui está a solução de 265 bytes que funciona para mapas com dimensões variáveis:
fonte
a[8][8]
ser suficiente?int a[8][8]
permite a inicialização gratuita do mapa e o uso de charm[64]
oferece ótimos descontos para a saída do mapa. Contagens de muito perto, emborae
ew
na sua representação de mapa, poderáfor(x=8;x--;)putchar((i=a[x][y])?i:63)
barbear dois bytes na saída.c=getchar(),c+1
é equivalentegetchar(),c++
ou há algum truque envolvido?Ruby,
169147 bytesPrograma completo. Pega a sequência de entrada de STDIN (você provavelmente precisará inseri-la em um arquivo para impedir que novas linhas finais atrapalhem as coisas) e envia o mapa resultante para STDOUT.
Aparou uma tonelada colocando todas as cordas em uma e depois dividindo-as mais tarde.
Ungolfed:
fonte
Lua, 354 bytes ( experimente online )
Golfe:
Ligeiramente não destruído:
fonte
x=x+(("w e"):find(e)or 2)-2 end
serx=x-2+(("w e"):find(e)or 2)end
?Kotlin, 242 bytes
As novas linhas podem ser substituídas por ponto e vírgula, se desejado.
Experimente aqui
fonte