As coordenadas no mundo da Terra plana consistem em latitude (x) e longitude (y), que são números inteiros no intervalo de 0 a 9999. Muito parecido com números inteiros gaussianos , mas eles sempre são escritos usando esta notação:
411S 370E
Ou seja, com S
ou N
anexado à latitude e / E
ou W
anexado à longitude, com espaço (s) entre os dois componentes.
Objetivo
Escreva um programa (não uma função) que leia duas coordenadas, separadas por espaços em branco, e produza sua soma. A primeira coordenada é um ponto de partida, a segunda é um deslocamento e a saída é a posição resultante.
Entrada / Saída
Como esse desafio é parcialmente sobre formatação, tentarei definir os formatos de entrada e saída sem ambiguidade.
O formato de entrada preferido possui 1 espaço entre os componentes de coordenadas, sem zeros à esquerda e um caractere de nova linha entre as duas coordenadas. O programa deve poder ler o formato preferido.
A saída pode conter qualquer quantidade de espaço em branco e zeros à esquerda. Se for diferente do formato de entrada preferido, o programa também deverá poder ler esse formato.
Apenas para esclarecer, a entrada não pode (não) conterá caracteres de formatação adicionais. Apenas espaços e novas linhas, quando necessário.
Pontuação
Esta é uma experiência sobre uma nova condição vencedora. Escolherei o vencedor aceitando uma resposta em algumas semanas. Se uma resposta melhor aparecer depois, alterarei a resposta aceita.
A pontuação do programa é sua contagem de bytes. O programa vencedor é menor que 400 bytes, possui o menor número de bytes, mas é escrito na linguagem de programação mais detalhada . Para determinar o vencedor:
- Remover programas com contagem de bytes 400 ou mais (eles podem participar, mas não podem vencer)
- Considere apenas o programa mais curto para cada linguagem de programação
- O programa mais longo vence
Os poliglotas competem contra programas em todos os idiomas em que são válidos (por exemplo, se um programa é válido em ambos bash
e sh
ele compete com programas em ambos os idiomas).
Casos de teste
Nos casos de teste, as duas primeiras linhas são a entrada e a terceira linha é a saída.
0S 0E
0S 0W
0N 0E
(a direção do zero não importa, tanto na entrada quanto na saída)
0S 9999E
9999N 9999W
9999N 0E
(valores máximos)
42S 314W
42N 2718W
0N 3032W
(a direção do zero não importa na saída)
5555N 8888W
7777S 0E
2222S 8888W
(sem valores negativos; mude a direção se precisar alterar o sinal)
0001N 4545W
0999N 5454W
1000N 9999W
(se o programa gerar zeros à esquerda e vários espaços, ele deverá ser capaz de lê-los; também deve poder ler entradas que não os contenham)
8888N 8888W
9999N 9999W
(entrada inválida - qualquer comportamento é aceitável, incluindo falha e loop infinito)
fonte
Respostas:
ABAP,
377365 bytesUngolfed:
Foi realmente desafiador estar com 400 caracteres.
Algumas notas:
ADD c TO a.
qual é uma das minhas declarações verbais favoritas.FORM
ePERFORM
explodiu a contagem de caracteres, mantive as macros+
sem um espaço anterior é um operador de deslocamento, exigindo muitos espaços no códigoRIGHTPLUS
a expressão necessária para ser um número, é necessário multiplicar por 1, mas o formato tem decimais.DECIMALS
fonte
JavaScript (ES6), 118 bytes
fonte
MATLAB,
327304296290282276267259255253 bytesAcho que estou chegando a um limite agora. Consegui remover
51, 60687274 bytes de uma resposta que achei que estava bem. =)Foram removidos 8 bytes por
input
dentrostrsplit
, graças a Luis Mendo. Foram removidos outros 6 bytes, levando toda a entrada para uma matriz de células em vez de duas. Foram removidos outros 8 bytes, levando as duas últimas instruções para dentrodisp()
. Foram removidos 6 bytes removendochar
e alguns colchetes. Isso não foi possível em uma revisão anterior da resposta. Dividir os elementos da célula em quatro variáveis custou 15 bytes, mas salvou 24, portanto, 9 bytes salvos! 8 bytes adicionais devido aodisp
esquema aprimorado .5*~~s
salva dois bytes em comparação com(s>0)*5
. Assim, 4 novos bytes salvos (para se). Tomar o oposto dessa última expressão economiza mais 2 bytes,83-5*~s
é menor que78+5*~~s
Código de golfe:
Mesmo código, mas com quebras de linha:
Casos de teste:
Salve o acima como
flat_earth.m
fonte
R, 196 bytes
R é bem detalhado, para os padrões de golfe. Vamos ver...
Ungolfed:
Editar para adicionar: Acabei de olhar para as outras respostas e estou surpreso que minha entrada seja uma das mais curtas! Talvez R não seja tão detalhado quanto eu pensava ...
fonte
Java, 372 bytes
Ungolfed
Notas
A.java
, compilar comjavac A.java
, executar comjava A
. Em seguida, insira a linha de entradas separada ou como duas entradas separadas no stdin.Saídas:
fonte
SQL (PostGreSQL 9.4), 305 bytes
Implementado como uma declaração preparada que usa 2 parâmetros de caracteres. Um parâmetro para cada linha de entrada.
É chamado da seguinte forma
e gera uma linha contendo uma coluna de caractere único para o resultado.
9999N 0E
fonte
Java, 308 bytes
Uma versão mais legível:
Golfe em Java é um tipo especial de diversão. As duas linhas de código a seguir fazem o mesmo, mas a primeira é mais curta:
O código lê 4 tokens da entrada padrão. Para cada token, a parte até o último caractere é convertida em
int
, e o último caractere inverte opcionalmente seu sinal.Em seguida, adiciona o valor lido duas iterações atrás. Java inicializa matrizes para 0, portanto, nas duas primeiras iterações, isso fará a coisa certa.
Em seguida, ele formatará os valores e os imprimirá. No entanto, nas duas primeiras iterações, ela imprime a sequência vazia (para que duas quebras de linha extras apareçam na saída).
Ele usa alguma aritmética descolada para que a variável de iteração (4,3,2 ou 1) e o sinal (-1 ou 1) possam ser combinados em um índice baseado em zero na string
"ENWS"
.fonte
Perl 6, 130 bytes
fonte
Ruby, 186 bytes
É muito curto, desculpe. Eu fiz o meu melhor.
fonte
Bytes C - 267
Eu acho que C seria longo ... poderia muito bem colocá-lo. ; _;
fonte
Befunge-93 , 240 bytes
Observe que o intérprete possui uma caixa de entrada de linha única. Colar o formato preferido substitui a nova linha por um espaço. A obtenção de valores inteiros
&
já consome espaços à esquerda e zeros, para que o formato preferido possa ser lido na pilha&~&~&~&~
sozinho. Adicionando etapas para colocar os valores em uma linha em branco para que se possa recuperar e comparar os vetores, uma coordenada por vez, o seguinte programa de 136 bytes (excluindo notas à direita da linha) pode ser usado:A captura: a saída força um espaço adicional após números inteiros, portanto, é impossível produzir no formato preferido . Por exemplo, a saída aparecerá como em
1000 N 9999 W
vez de1000N 9999W
. Para verificar e ignorar espaços antes da direção de cada coordenada na entrada, são necessários quatro loops adicionais (um para cada coordenada). Um único loop é mostrado abaixo:O programa resultante pode ter vários espaços em qualquer lugar da entrada (exceto entre dígitos).
Exemplo de entrada:
0001 N 4545 W 0999 N 5454 W
fonte
Lua,
333328 bytesPossui sistema de entrada inválida de alto nível e loop infinito absolutamente inovador para uso repetido.
Desfrutar ;)
Editar: salvou 5 bytes ao renomear
math.abs
comom
eprint
comop
fonte
PHP 291 bytes.
Não faz nada inteligente, apenas atravessa o problema.
As regras devem ter uma cláusula adicional dizendo que apenas o idioma com pelo menos 2 entradas pode vencer.
fonte
PHP, 169 bytes
Inspirado por @Paul Drewett:
demolir
PHP,
206197195 bytesliteralmente falando, "moste verbose" provavelmente seria Mathematica ou Mathlab?
Agora, como posso dobrar o tamanho disso ...
demolir
fonte
GolfScript - 111 bytes
Explicação
fonte
Python 2.7 -
232175 bytesFunciona para todos os casos de teste. Sempre insere N ou W por 0. Tenho certeza de que um jogador de golfe Python melhor do que eu poderia economizar mais alguns bytes.
EDITAR
Golpeei 57 poderosos bytes devido a algumas ótimas dicas do @ mbomb007 e do @Titus plus, identificando o fato de que eu poderia combinar as duas raw_inputs com um espaço e depois usar um .split () que se divide no espaço sem especificá-lo. O algoritmo é o mesmo, mas é muito melhor jogado.
fonte
...str(x)...
por...`x`...
; substitua("E" if q<0 else "W")
por"WE"[q<0]
"S" in i or "E" in i
certamente pode ser escritoi in "ES"
ou semelhante.