Introdução
"Yarr !! Tivemos um rapaz que se considerava um" programador "fazer um mapa do nosso tesouro escondido! Mas está escrito com 'números e letras estranhos!" E5, N2, E3 "... o que é que isso faz loucura! Não é possível escrever um mapa do tesouro adequado, cretino inútil. Conserte-o! Vamos oferecer uma parte do tesouro! "
Descrição do Desafio
Um grupo de piratas está tendo problemas para ler um mapa do tesouro. Você pode escrever um programa para convertê-lo em um formato mais ... pirata?
Como entrada, você receberá o mapa do tesouro original. É uma lista de sequências separadas por vírgula, cada sequência que consiste em uma parte da letra (que informa aos piratas em que direção eles precisam entrar) e uma parte numérica (que informa aos piratas quantos passos devem ser seguidos nessa direção). Por exemplo, o seguinte mapa do tesouro:
E2,N4,E5,S2,W1,S3
significaria "andar dois passos para o leste, andar quatro passos para o norte, andar cinco passos para o leste, andar dois passos para o sul, andar um passo para o oeste, depois andar três passos para o sul".
Como saída, você vai saída o mapa em um formato gráfico, usando os personagens >
, ^
, v
, e <
como ponteiros. Aqui está a saída para a entrada acima:
>>>>>v
^ v
^ v<
^ v
>>^ X
Observe que substituímos o último passo para o sul por um X
. Isso ocorre porque o último passo é onde está o tesouro e, como todos sabemos, os piratas devem ter um X em seus mapas, caso contrário eles não saberão como lê-lo.
A propósito, o mapa nunca se cruzará, então você não precisa se preocupar em lidar com sobreposições. Além disso, você pode ter uma nova linha à direita no final da saída.
Amostras de entradas e saídas
S5,W2
v
v
v
v
v
X<
N1,E1,S1,E1,N1,E1,S2
>v>v
^>^X
N1
X
N6,E6,S6,W5,N5,E4,S4,W3,N3,E2,S2,W1,N2
>>>>>>v
^>>>>vv
^^>>vvv
^^^Xvvv
^^^^<vv
^^^<<<v
^^<<<<<
E21,S2
>>>>>>>>>>>>>>>>>>>>>v
X
N12,E11,S12,W2,N4
>>>>>>>>>>>v
^ v
^ v
^ v
^ v
^ v
^ v
^ v
^ v
^ X v
^ ^ v
^ ^ v
^ ^<<
X
deveria marcar o passo após a última jogada, como todas as outras jogadas são contadas. Imagine que o último passo é N3: você caminha três passos para o norte e cava, mas não há nada aqui, você teve que caminhar 2 passos. Não me importo se você mantiver a regra existente, porque ela adiciona uma pequena caixa de canto para lidar. Mas lembre-se do que aconteceu com esse rapaz.Respostas:
Rubi,
213 209 198 186178Passe a entrada via stdin.
Isso usa um
y -> x -> char
dicionário para construir o mapa, onde ambosx
ey
podem ser negativos. Depois que a entrada foi analisada, o mínimo global da coordenada x é extraído. Para cada linha, ele itera sobre um intervalo que vai do índice mínimo global ao máximo da linha atual e imprime o caractere correto para esse índice.Para ficar com o tema, as expressões para ligar
NESW
para os índices apropriados foram descaradamente pirateado do SP3000 's resposta .Versão original que usava um
[x,y] -> char
dicionário:fonte
Python 2,
249248244239237 bytesEntrada como
"E2,N4,E5,S2,W1,S3"
.NSEW
é mapeado para[1, 3, 2, 0]
pord=ord(c)%10%7
. A decisão de mudary
oux
então é decididad%2
e se o incremento ou decremento é decidido pord-2|1
. A primeira e a terceira expressões foram encontradas pela força bruta.Fora isso, é um uso simples de um dicionário aninhado do formulário
{y: {x: char}}
.(Obrigado a @joriki pela ajuda com o mapeamento)
fonte
(d + 1 & 2) - 1
1|d%-3
(que é a negação, mas eu percebi que tudo bem também)!Javascript (ES6), 260
Este foi um interessante ...
Obrigado @ETHproductions, @ edc65 e @vihan pela ajuda!
Isso define uma função anônima, para chamá-la de adicionar
f=
ao início para dar um nome a ela.Testar:
console.log(f("E2,N4,E5,S2,W1,S3"))
Explicação:
fonte
i++
dofor
loop para o último local em que é usado, neste casoc=i++>r-2?"X":c
.v[0].repeat(+v.slice(1))
no lugarArray(v.slice(1)- -1).join(v[0])
e" ".repeat(j-p-1)
no lugar deArray(j-p).join(" ")
salvar 11 bytes no geral. Eu acho que você também pode colocarF='forEach'
no início da função, em seguida, mudar a cada.forEach
de lá para[F]
, economizando mais 4.if
s, pode ajudar se você diminuir variáveis ao mesmo tempo tambémq=x=y=2e3
significa que a saída estaria incorreta se eu dissesse, digamosW9999
?PHP,
431417 bytesColoque-o em um arquivo (
treasure.php
), remova o recuo, junte-se às linhas (ele está encapsulado aqui para facilitar a leitura), coloque o<?php
marcador no início do arquivo (não exibido aqui, pois tecnicamente não faz parte do programa).Exemplo de execução:
A opção
-d error_reporting=0
é necessária para suprimir avisos sobre valores não encontrados nos índices especificados em$z
.Atualizar:
Enquanto eu preparava a versão não-gasta do código para publicação, descobri que ela continha duas atribuições desnecessárias (12 bytes) e um espaço em branco que pode ser removido (
as$i
); além disso, substituindo awhile
por umfor
loop e pressionando uma atribuição (não é possível usando owhile
loop), salvei outro byte.fonte
$count --;
.$argn
salvar 3 Byteschop
save 1 Byte"X"
->X
constantes uso economizar mais bytes$argn
dica. Estou ciente do"X"->X
truque, mas provavelmente me esqueci disso quando escrevi esta solução. Eu escrevo código PHP desde 2002, mas até hoje eu não percebi que o PHP fornece achop()
função. Obrigado por esta dica.Perl,
702613546474439338260 bytesObrigado a Dom Hastings por sua ajuda e sua versão supergolfada.
O código usa uma matriz 2D.
Versão de Dom Hastings:
Minha versão menor de 338 bytes (para referência):
Teste
fonte
use strict;
, não precisará de todos osmy
s, o que economizará pelo menos alguns bytes. Também==
é mais curto doeq
que o último requer espaços.$m
uma vez; portanto, em vez de armazenar o argumento da linha de comando como uma variável, você pode chamá-lo diretamentesplit
, ie@m=split(',',$ARGV[0])
.$d
e$s
podem ser capturadas usando o regex para economizar alguns bytes($d,$s)=/^(.)(.+)$/
, e todos osforeach
s podem serfor
(como são iguais. Você também pode salvar alguns caracteres substituindo alguns deles pormap{
...}@x
desde que você possa ignorar os parênteses ao redor do item iterado (isso funciona bem se você tem que conter outros ciclos) Se você está usando.$ARGV[0]
você pode substituir isso com pop, mas se você usar o script comoperl script.pl <<< "text"
você pode usar<>
em vez disso!pop
para salvar alguns. Em vez deuse Swtich
e as instruçõesswitch
/case
, você pode fazer verificações individuais que podem economizar bytes. Algo como$y-="N"eq$d
irá funcionar também (já que verdadeiro1
e falso é''
). Freqüentemente, você pode ter palavras como palavras de baralho, assim$y-=N eq$d
funcionará! Existem algumas variáveis mágicas que você pode usar para salvar bytes,$/
é'\n'
e$"
é' '
, mas às vezes uma nova linha literal pode ajudar a salvar um caractere também. Outro truque (sujo!) São várias atribuições para economizar um pouco mais, como$a=0;$b=0;
pode ser$a=$b=0
.substr($_,0,1)
pode sersubstr$_,0,1
. O Postfix para loops e se as verificações também puderem ser úteis, como emfor(@c){...}
vs.,...for@c
mas você não pode usar;
o código, será necessário separar vírgulas (o que nem sempre funciona quando você está chamando funções). Há muitas ótimas dicas também em codegolf.stackexchange.com/questions/5105/… . Boa sorte!Python 2, 394 bytes
Execute o programa e cole na entrada padrão como por exemplo
"E2,N4,E5,S2,W1,S3"
Isso não é muito otimizado. Primeiro, ele percorre a entrada para gravar o caminho. Depois, faz algumas contas para determinar a posição inicial correta e o tamanho de
o
. Em seguida, ele é executado novamente e define as entradas apropriadaso
como um dos>v<^X
. A principal inteligência está em reutilizar a mesma função para ambos os percursos.fonte
XQuery 3.0, 498
O XQuery nem sempre é um pouco competitivo, então isso foi divertido.
Ungolfed
fonte
PHP, 496
514528Tentei a sorte no PHP, o resultado é bastante longo, ainda quero publicá-lo, apenas por diversão.
Ungolfed
fonte
for(;$i++<$f;)
, tentar remover suportes desnecessários, usar constantes indefinidos (N
) em vez de cordas ('N'
), ...if
s, tente usar operadores trenários ou ands lógicos. Além disso, ajudará se você usar PHP4.1 e usar uma matriz GET com os pontos.JavaScript (ES6),
244249274Os espaços à esquerda e as novas linhas foram adicionados para maior clareza e não são contados, exceto a nova linha no final da chamada de junção, que é significativa e contada.
Teste a execução do snippet (sendo apenas ECMAScript 6, Firefox e Safari 9)
fonte
C, 557
Versão não destruída:
A alocação dinâmica de memória não é muito mais difícil, mas o malloc é um identificador muito longo para ser usado no código golf. Eu sinto que deveria haver algum tipo de cabeçalho PCG.h legalmente incluído automaticamente para jogar golfe em c, apenas para colocar em curto alguns identificadores.
fonte
Groovy, 359
fonte
Lisp comum - 603
Implementação sem matriz: imprime de cima para baixo, da esquerda para a direita.
Analise e expanda as direções em um rastreamento de
(x y char)
elementos:A entrada "N3" simples produz
((0 0 #\^) (0 -1 #\^) (0 -2 #\X))
x
ey
y
primeiro e depois porx
Iterar sobre a lista classificada enquanto move o cursor
x - minx
,y - miny
, imprimir o caractere desejadoExemplos
Resultado:
fonte
CoffeeScript,
303285 bytesMostrar snippet de código
fonte