Sumário executivo
Dada a entrada que representa dois vetores e seus respectivos "pesos", produza saída que também represente a soma ponderada desses vetores.
Desafio
A entrada consistirá em uma ou mais linhas dos seguintes caracteres:
- exatamente uma ocorrência do dígito 0, que representa a origem em um plano bidimensional;
- exatamente dois outros dígitos (1-9; podem ou não ser o mesmo dígito), cujas posições em relação à origem representam vetores e cujos valores representam os pesos associados a esses vetores;
- algum número de "caracteres de fundo". O solucionador pode escolher um caractere de plano de fundo específico; por exemplo, vou escolher "." (principalmente para legibilidade humana). Como alternativa, os caracteres de segundo plano podem ser qualquer coisa que pareça com espaço em branco.
(O solucionador pode escolher se a entrada é uma única sequência de múltiplas linhas ou uma matriz de seqüências de uma linha.)
Por exemplo, a entrada
....2
.0...
...3.
representa um vetor nas coordenadas (3,1) com peso 2 e um vetor nas coordenadas (2, -1) com peso 3.
A saída deve ser quase a mesma que a entrada, com as seguintes alterações:
- um "caractere de resultado", escolhido pelo solucionador, a ser adicionado na posição especificada pela soma ponderada dos vetores de entrada (equivalentemente, na posição que é a combinação linear apropriada dos vetores de entrada);
- quantos caracteres de plano de fundo forem necessários para ajustar a origem, os dois vetores de entrada e o vetor de saída na mesma imagem. Caracteres extras de fundo podem ser incluídos, se desejado; a única restrição é que, se o caractere de segundo plano for um caractere visível, toda a saída deverá ter uma forma retangular e todo caractere que não represente um vetor deverá ser o caractere de segundo plano. (Se o espaço em branco for usado como caracteres de segundo plano, essas restrições não precisarão ser impostas.)
(Em geral, se tivermos um vetor (v, w) com peso a e o segundo vetor (x, y) com peso b, sua soma ponderada é a (v, w) + b (x, y) = (av + bx, aw + por).)
No exemplo anterior, a combinação linear apropriada é 2 * (3,1) + 3 * (2, -1) = (12, -1). Se usarmos "X" como o caractere de resultado, a saída poderá parecer
....2.........
.0............
...3.........X
ou
................
...2............
0...............
..3.........X...
................
................
Pontuação usual de código-golfe : a resposta mais curta, em bytes, vence.
Exemplo de entrada e saída
Se espaço em branco for usado, a entrada acima seria semelhante
2
0
3
e a saída pareceria
2
0
3 X
Caracteres / linhas em branco à esquerda / à esquerda são irrelevantes; se eles são invisíveis para o leitor, tudo bem. (Dito isto, no restante dos exemplos, voltarei a usar "." Para o caractere de segundo plano, para facilitar a leitura.)
Se ambos os vetores tiverem peso 1, o resultado será semelhante a um paralelogramo: a entrada
.1.
...
1.0
leva à saída
X.1.
....
.1.0
Observe que esse paralelogramo pode ser degenerado se os vetores de entrada forem colineares: a entrada
0.1..1
leva à saída
0.1..1.X
É possível que o vetor de resultado seja igual a um dos vetores de entrada ou à origem; neste caso, simplesmente substitui o caractere de entrada. Por exemplo, a entrada
..2.0.1...
produz a saída
..X.0.1...
(onde na entrada e / ou saída, os períodos inicial e final podem ser excluídos). A entrada
.....3
......
...0..
......
......
2.....
produz a saída
.....3
......
...X..
......
......
2.....
Finalmente, a entrada
90
.8
produz a saída
........90
.........8
..........
..........
..........
..........
..........
..........
X.........
Respostas:
MATL , 48 bytes
O caractere de plano de fundo é o espaço. Entrada é uma matriz de caracteres 2D com linhas separadas por ponto e vírgula. Portanto, os casos de teste têm entradas respectivas:
A saída inclui uma quantidade significativa de espaço em branco do preenchimento.
Experimente online!
fonte
Python 3,
374355 bytesSolução python não muito refinada que é muito generosa com o preenchimento (usa a distância máxima do tabuleiro de xadrez). Entrada é uma única linha em que as linhas são separadas por tubos | (embora o algoritmo possa usar com facilidade qualquer coisa não alfanumérica que não seja uma nova linha ou um EOF). Qualquer coisa não alfanumérica ou | funciona para preenchimento de entrada, o preenchimento de saída usa períodos. Comentários e melhorias de jogadores experientes em python são apreciados.
Edit: Algumas melhorias graças ao @TheBikingViking. Também adicionei ainda mais margens, já que eu não era suficientemente generoso com o preenchimento.
fonte
[a,b][condition]
vez dab if condition else c
linha 2.sorted
usa qualquer iterador, incluindo uma instrução de gerador, para que você possa descartar o par externo de colchetes. 3.zip(p)
deve funcionar em vez dep[0] for p in P
.P+=[stuff]
vez daP.append([stuff])
linha 7. 5. Faça em["."]
vez delist(".")
. (3. deveria ter sidozip(p)[0]
).P
emzip
.S=[stuff]*2*L
na linha 10.index
(erro em nada encontrado). Vai trabalhar comfind
embora. [Ré. classificado] Obrigado, perdi a remoção deles ao adicionar osorted
. [3] zip (* P) [0] não funciona no python 3 (o objeto zip não é indexável). [4] P + = [coisas] não funcionará, embora P + = [[coisas]] funcione. [5] Obrigado. [os outros 5] não funcionam. Preciso de novas listas, não de referências.JavaScript,
534528502 bytesObserve que o preenchimento é ideal. Este programa assume que i contém a cadeia bruta, com as linhas separadas por
\n
caracteres. O preenchimento é feito com espaços e o caractere resultado é minúsculox
.Esta é a minha primeira tentativa no código de golfe.
Coisas técnicas: - O tamanho do programa praticamente dobrou (e sua complexidade aumentou dramaticamente) para apenas levar em consideração o caractere do resultado, principalmente porque as strings do JavaScript são imutáveis.
Linha por linha explicação:
Eu uso muito isso, então armazená-los em strings me salvou um pouco de espaço. Você pode ver abaixo que, para a
split
função, eu simplesmente criei um alias; isso é porque eu só precisava de um argumento, o outro sendo constante. ParaindexOf
ejoin
, no entanto, teria sido mais longo.Nada complicado aqui, estou lendo a largura e a altura da matriz inicial. Observe o uso de
i[n]
para acessarindexOf
, enquantosplit
é tratado de maneira diferente.Isso está ficando interessante. Essa função basicamente cria concatena J-1 vezes a string X e a retorna. Isso é usado para gerar cadeias de espaços para o preenchimento.
Essa matriz conterá o número de linhas e colunas adicionadas pelo preenchimento (desativado por um fator h no primeiro caso). A última célula é não solicitada e me impede de ter um argumento adicional na função abaixo.
Esta função sozinha lida com o preenchimento (linhas e colunas); determina, com base em uma coordenada do vetor de resultado (X), e o número de linhas / colunas para gerar (E), se é necessário criar um. o
X+E+1+T
é apenas um truque para poupar algum espaço,U
é a seqüência de enchimento (um espaço de colunas e uma linha inteira de linhas), e nós vamos voltarR
. Esta função basicamente retorna, no caso de uma linha, o preenchimento necessário no início ou no final da referida linha e, no caso de uma coluna, retorna as linhas de preenchimento necessárias antes ou depois das linhas originais.Aqui lemos a posição da origem e recuperamos suas coordenadas. L é uma função para converter um índice em um número de linha.
Adicionei alguns espaços em branco para facilitar a leitura. O que acontece aqui é que, para cada número possível, continuamos procurando na string original. O
~
truque é relativamente comum em Javascript; é o operador NOT bit a bit, mas tudo o que importa aqui é o que~-1==0
me permite testar o final do loop. Em seguida, apago o caractere na string (e foi por isso que fiz uma cópia), o que me permitiu continuar a pesquisa pelo tempo necessário. Em seguida, adiciono as coordenadas do vetor a(x, y)
, usando uma subtração simples.Aqui, divido a sequência original em linhas e, para cada linha, chamo
G
que gerará o preenchimento antes e depois das linhas. Ol-w+2
e assim por diante vêm de um cálculo simples de índice que permite testar se preciso adicionar preenchimento ou não. Por exemplo, sex>0
ex+l-w+1>0
,(x+l-w+1)+1
espaços devem ser adicionados após a linha. O+x
está sendo removido por ser o primeiro parâmetro e oX+E+1+T
usado na definição deG
.Uma coisa semelhante é feita para os primeiros caracteres e depois para as colunas. Há muita fatoração aqui, permitindo que eu use apenas uma função. Observe o último parâmetro; no primeiro caso, quero escrever para
C[0]
saber depois quantas colunas adicionei no início de cada linha; isso me permite recuperar a posição final do caractere resultado. No entanto, não me importo com as colunas adicionadas após a linha original, e é por isso que a segunda chamada paraG
gravações na célula indesejadaC[2]
não é utilizada.Aqui, simplesmente leio o novo comprimento das linhas e crio uma linha de espaços a partir dele. Isso será usado para criar o preenchimento vertical.
É exatamente o mesmo que as duas linhas acima. A única diferença é escrever até
C[1]
agora e usar os separadoresN+O
eO+N
. Lembre-se de queO
é uma nova linha eN
é uma linha de espaços. AplicoB
o resultado para dividi-lo novamente (preciso recuperar a linha que contém o caractere de resultado para editá-lo).Este é o índice vertical do caractere resultante.
Aqui sou forçado a modificar
O
para poder dividir a linha apropriada em uma matriz de caracteres. Isso ocorre porque as strings JavaScript são imutáveis; a única maneira de editar uma string é convertê-la em uma matriz (que é o que estou fazendo aqui), editar na posição correta e unir a string novamente. Observe também oh
fator, porque aG
função foi chamada uma vez por linha inicial.Finalmente substituo a nova string na matriz e associo-a novamente a uma string. Woohoo!
fonte