Sumário
A tarefa é navegar no veículo espacial de Marte e informar suas coordenadas e direção finais.
Entrada:
Primeira entrada:
Primeiro, seu programa deve receber a entrada que estará no seguinte formato:
[X-Coordinate],[Y-Coordinate],[Direction]
A direção deve ser: N
ou S
ou E
ouW
(letras iniciais de norte, sul, oeste, leste)
Exemplo: 10,20,N
(x = 10, y = 20, direção = N (Norte))
Segunda entrada:
A segunda entrada consiste em série de R
, L
,M
para a direita, para a esquerda e mover respectivamente.
Para R
eL
(direita e esquerda), a direção do rover deve mudar de acordo.
Para M
o rover deve mover 1 unidade à frente na direção em que estava antes de se mover.
Regras para o cálculo de coordenadas:
N = Y + 1
E = X + 1
S = Y - 1
W = X - 1
Resultado:
As coordenadas finais e a direção atual do veículo espacial.
Exemplo:
Enter initial data: 1,2,N
Enter the instructions: MRMLM
Output: 2,4,N
As coordenadas podem ser qualquer número inteiro e podem ser negativas .
Todas as brechas padrão não são permitidas. Se for possível fornecer demonstração em sites como http://ideone.com etc., faça-o, para que eu possa verificar :)
Este é um concurso de popularidade, então seja criativo!
Seguindo o conselho de outras pessoas, decido fazer disso um código de golfe .
Respostas:
Ruby ≥ 2,0, 101
Esta solução pode ser testada aqui: https://ideone.com/C4PLdE
Observe que a solução vinculada ao ideone tem um caractere a mais (em
1.i
vez da1i
linha 3). A razão para isso é que o ideone suporta apenas o Ruby 1.9, que não permite a sintaxe abreviada de literais complexos.fonte
x,y,i=eval"[#{gets}]"
poreval"x,y,i="+gets
para salvar alguns caracteres.eval
regras de escopo:ruby -e 'eval"x=1";p x'
joga aNameError
forx
atp x
. Funciona ao usar constantes (eval"X,Y,I="+gets
), mas, como eu modifiqueii
, isso exigiria um adicionali=I
para evitar avisos sobre a redefinição de uma constante. Mas talvez estejamos falando de diferentes versões do Ruby?x,y,i=eval"*a="+gets
. Obrigado!Javascript ( ES6 )
145141127Edit: Removida a necessidade de uma matriz de conversão usando o método da solução C do edc65
Sem Golfe / Comentado:
fonte
Java - 327
Com espaço em branco:
Como de costume no Java, cerca da metade disso é apenas analisar a entrada e formar a saída. A lógica é bastante direta.
fonte
Javascript (E6) 175
Editar bug corrigido, possivelmente fora do intervalo, retornar valor para d
139 Lógica, 36 E / S
Basic ungolfed
Teste Teste no console javascript no Firefox. É mais simples testar a função F, evitando os pop-ups.
Resultado
fonte
C 164
180 186Editar Formato de entrada fixo e strchr removido
Editar Array de deslocamento removido, calculado usando bits
Ungolfed
fonte
C, 148
150151Uma emenda na solução do @ edc65 para usar minha abordagem de abuso de valor ASCII.
Especificamente:
d%8%5
mapeia os caracteresENWS
para0,1,2,3
respectivamentec%23
se transformaL
em7
,M
em8
eR
em 13. Comod
(a variável de direção) é sempre usada o mod 4, isso efetivamenteL
adiciona -1 mod 4,M
adiciona 0 mod 4 eR
adiciona 1 mod 4.d&1
é 1 paraNS
e 0 paraEW
instruções.d&2
é 2 paraWS
e 0 paraNE
instruções.~-(d&2)
é 1 paraWS
e -1 paraNE
direções.c%2
é 1 paraM
e 0 paraLR
.fonte
c%(2*(1-(d&2)))
Python 3 (com gráficos de tartaruga),
251199 bytesPythonistas sábios, por favor, seja gentil, pois esta é minha primeira tentativa de um programa escrito em sua linguagem refinada.
Tartarugas em Marte!
Esse desafio é mapeado naturalmente para gráficos de tartarugas no estilo de logotipo, para os quais o python é importante, é claro.
Lê entrada de duas linhas de STDIN.
Resultado:
O que mais gosto neste programa é que ele exibe graficamente o caminho do veículo espacial. Adicione
exitonclick()
ao final do programa para que a saída gráfica persista até o usuário clicar:Tenho certeza de que isso pode ser jogado muito mais - qualquer sugestão bem-vinda! Estou fazendo esse CW, porque espero que a comunidade possa jogar um pouco mais.
Alterar:
fonte
GolfScript,
116 98 88 8471Isto deve obter as coordenadas e as instruções de como argumentos da seguinte forma:
1 2 'N' 'MRMLM'
. Os argumentos são transformados em uma sequência e empurrados para a pilha.Se você quiser testar isso on-line, vá para web golfscript e cole um ponto-e-vírgula seguido de uma string com os argumentos (por exemplo
;"1 2 'N' 'MRMLM'"
) antes do código ( aqui está um link com um exemplo).Exemplos de saída:
Minhas tentativas anteriores
84 caracteres:
88 caracteres:
98 caracteres:
116 caracteres:
fonte
Delphi (819)
Quando eu comecei, não era um código de golfe . Editará mais tarde.
Não é possível encontrar um compilador online.
Ungolfed
fonte
=
? Por que eles são necessários? Além disso, os nomes das variáveis parece um caminho muito longo para mimJavascript (353)
Esta é minha primeira tentativa real no código de golfe, parece funcionar pelo menos!
fonte
var
s.Python (263)
Também deve haver uma maneira mais elegante de fazer isso, pois não precisa do ramo depois do resto.
http://ideone.com/eD0FwD
A entrada é horrível, eu queria fazê-lo,
split(',')
mas me deparei com problemas de transmissão entre as entradas e as cordas. Idealmente, eu também queria adicionar a posição antiga à posição móvel ... ah, agora é código-golfe. Oh bem, seja como for, vou deixar aqui, pode dar inspiração. Outras idéias que tive foram usar o módulo 4 da direção depois de mapear o rumo inicial para um índice. Também mesclando os turnos e as matrizes de movimentação para uma, pois nenhuma das teclas colide.mesmo assim, encurtar nomes de variáveis e remover espaços é 263:
fonte
Python 2.7 -
197192 bytesNa verdade, estou super orgulhosa desse.
Explicação
Primeiro, vamos limpar essa bagunça. Usei ponto e vírgula em vez de quebras de linha em muitos lugares porque acho que isso me deixa legal. Aqui está normalmente (ainda são 197 bytes, não foi totalmente destruído). Sim, ainda há um ponto e vírgula, mas esse realmente salva um byte.
Vamos começar!
Primeiro, definimos
q
como a string'NESW'
. Nós o usamos duas vezes depois, elen("q='NESW';qq") < len("'NESW''NESW'")
.Aqui, dividimos a primeira linha de entrada em cada vírgula. Nosso x coord é armazenado em
x
, y iny
e a primeira letra de nossa direção emd
.Então nós apenas fazemos os coords ints. (Fiquei chocado por não conseguir pensar em uma maneira melhor de converter duas seqüências de caracteres em ints. Tentei,
x,y=map(int,(x,y))
mas isso acabou sendo mais longo.)Isso converte nossa direção em um número inteiro. 0 é norte, 1 é leste, 2 é sul e 3 é oeste.
Aqui é onde a diversão começa.
Quando vamos para o norte, Y aumenta em 1. Portanto, este dicionário recebe 0 e fornece a string
'y+'
para "aumentar y". Ele fornece resultados semelhantes para outras direções: y ou x seguido de + ou -.Voltaremos a isso.
Eu tenho a liberdade de desenterrar este aqui um pouco.
Para cada caractere na segunda linha de entrada, fazemos duas coisas. Primeiro, definimos a variável
m
como qualquer que seja o nosso dicionário anterior nos fornece a nossa direção atual. Não há razão para que isso aconteça sempre, mas é mais fácil do que fazer acontecer quando precisamos.Em seguida, criamos uma lista com três elementos:
'd+'
,'d-'
, em
. NOTA DO EDITOR: Eu acho que posso me safar de não usar a variávelm
. Eu acho que posso simplesmente colocarv[d]
na lista diretamente. Isso me poupará alguns bytes, se funcionar, mas não sinto vontade de testá-lo até concluir esta explicação para que vocês possam lidar. (Sim, funcionou.)Procuramos o caractere atual da entrada na string 'RL'.
str.find
retorna -1 se não encontrar o caractere; portanto, isso converte um R em 0, um L em 1 e qualquer outra coisa em -1. Obviamente, a única outra entrada que podemos ter é M, mas são menos caracteres para fazê-lo funcionar para tudo.Usamos esse número como índice da lista que criamos. Os índices da lista Python começam no final se forem negativos, então obtemos o primeiro elemento se a entrada for R, o segundo se for L e o último se for M. Por uma questão de conveniência, estou prestes a assumir que estamos voltados para o norte, mas um princípio semelhante se aplica a outras direções.
Os possíveis valores com os quais trabalhamos são
'd+'
para R,'d-'
para L e'y+'
para M. Em seguida, anexamos'=1;d=d%4'
ao final de cada um. Isso significa que nossos possíveis valores são ...Esse é um código python válido! Esse é um código python válido que faz exatamente o que queremos fazer para cada um desses caracteres de entrada! (A
d=d%4
parte apenas mantém nossas orientações sãs. Novamente, não é necessário fazer isso todas as vezes, mas são menos caracteres.)Tudo o que precisamos fazer é executar o código que obtemos para cada caractere, imprimi-lo (convertendo nossa direção de volta para uma string) e pronto!
fonte
C - 350
Salvar como
rover.c
:Compilar:
Exemplo de execução:
Ideone
Ungolfed:
fonte
Haskell - 412 bytes
Testado com:
fonte
f=many digit
Muito LOL - TAL WOWread
várias vezes levou mais personagens para fazer do que usando parsec ...Bash + coreutils, 159 bytes
A entrada é lida a partir de 2 linhas de STDIN.
Resultado:
fonte
PowerShell,
170167166Não consigo jogar golfe ainda mais, o que é um pouco embaraçoso. Mas todos os hacks óbvios realmente não funcionam aqui.
Eu não posso
iex
a entrada porque a)N
,S
,E
eW
teria que ser funções para que funcione (ou eu preciso prefixo que com$
e b)1,2,N
teria que analisar oN
no modo de expressão, não ser capaz de executar um comando .A
switch
parece ser o caminho mais curto de fazer o movimento. A tabela de hash com blocos ou seqüências de caracteres de script não é mais curta e para todos os outros aspectos além doswitch
eu teria a sobrecarga do loop explícito.Não consigo me livrar do
IndexOf
porque um pipeline com?
ainda é mais longo.Também não consigo me livrar dos tipos explícitos na declaração inicial porque misturei tipos lá, portanto, um simples
|%{+$_}
não ajuda e todas as outras opções são mais longas.Às vezes eu odeio manipulação de entrada no PowerShell.
fonte
Python, 135
137138Abusos os valores ASCII de
L
,M
eR
para evitar o uso de quaisquer declarações condicionais.Experimente em ideone .
fonte
Python 2.7,
170149Coisas que mudei do original:
Alias raw_input, alterou o dicionário v [d], que deveria ter sido uma lista de qualquer maneira, para alguma seleção de string, usada
%=
.Editar: desempacotou a tupla e eval (raw_input ()) == input () para salvar 21 caracteres.
Muito emprestado do @undergroundmonorail, mas com muitas melhorias.
fonte
Bash / SHELF ,
243235" SHE ll go LF " é uma biblioteca de golfe do Bash que fornece alguns aliases úteis. Esta é uma resposta válida, pois a biblioteca existia e estava no GitHub antes do lançamento do desafio.
Desculpe, não consigo fazer isso funcionar em ideone.
Como executar
Isso toma a posição inicial (separada por vírgulas conforme especificado; isso adiciona muitos caracteres ao código) como seu primeiro argumento e as instruções sobre entrada padrão.
Saída de amostra
Código
Explicação
d
é para comparação; retorna 0 se seus dois argumentos forem iguais e 1 caso contrário, ele poderá ter outros comandos acorrentados a ele com&&
e||
.y
é comotr
(mas feito atravéssed
).Y
é comosed 's/.../.../g'
por seus dois argumentos.P
éecho -e -n
;p
é justoecho -e
.A próxima parte é profundamente feia, com cerca de 145 caracteres em uma linha. Se o comando atual for M, transforme as vírgulas em $ o em espaços, converta em matriz e salve em $ z. Em seguida, faça um switch ... case block para o último elemento de $ z (a direção que o rover está apontando. Altere as coordenadas de acordo. Em seguida, converta $ z novamente em uma string separada por vírgula e salve em $ o.
fonte
shelf.sh
fazer parte da solução? Como se você precisasse derequire
certos pacotes no Ruby ouimport
no Python, se precisar deles.import
PYG ao escrever um programa Python com ele, ou Rebmu (AFAIK), ao escrever um programa Rebol com eleHaskell, 291
Eu não tinha certeza de quão flexível era o formato da string de entrada e saída, por isso, certifiquei-me de que ele se parecesse exatamente com o exemplo (menos os prompts, é claro), mas isso adicionava muitos caracteres extras. Link Ideone
fonte
PHP - 224
Bem, eu tentei.
Entrada em STDIN, por exemplo:
fonte
Python3 (288)
Implementação usando o uso pesado de ifs ternários.
Omitir as queixas óbvias de entrada, fornecer valores intrínsecos às seqüências de direção pode ter beneficiado o tamanho do script. No entanto, a abordagem aqui é perfeitamente funcional (então eu acredito)
fonte
Python 3 (143)
http://ideone.com/wYvt7J
Usamos o tipo de número complexo interno do Python para armazenar o par de coordenadas. A direção é calculada levando a unidade imaginária
1j
à potência ded
, que armazena a direção mod 4. A rotação é feita aumentando ou diminuindod
. A expressão'ML'.find(c)
fornece a quantidade que queremos alterard
:1
forL
,0
forM
e-1
(o padrão para não encontrado) paraR
.O Python não tem um caminho curto para converter um número complexo em uma tupla, portanto, temos que fazer chamadas caras para
.real
e.imag
.fonte