Isso é inspirado em um problema do mundo real que eu tive. Estou curioso para ver se existe alguma maneira inteligente de fazer isso.
Você recebe duas matrizes não classificadas, A e B, cada uma contendo um número arbitrário de flutuadores. A e B não têm necessariamente os mesmos comprimentos. Escreva uma função que pegue os elementos de A sequencialmente e encontre o valor mais próximo na matriz B. O resultado deve estar contido em uma nova matriz.
Condição de vitória
O código mais curto vence (como de costume).
Respostas:
APL, 13
17(21 bytes em UTF-8)
Se você deseja lambda verdadeiro (A como argumento à esquerda e B como à direita):
Como funciona:
{...}¨A
chama a função lambda{...}
com todo valor A (em vez de chamar com A como matriz), reunindo resultados na matriz da mesma forma|⍵-B
calcula valores absolutos da diferença entre o argumento ⍵ e tudo em B (- é subtração, | é abs).↑⍋
pega o índice do menor elemento (⍋ classifica os índices que retornam a matriz, ↑ obtém o primeiro elemento)B[...]
está apenas buscando elemento (s) pelo (s) índice (s).A solução é bastante direta, embora use um recurso maravilhoso da função de classificação da APL retornando o vetor de permutação (índices do elemento classificado na matriz original) em vez da própria matriz classificada.
fonte
Mathematica - 17
Como funciona? Sim, admito que há um pouco de trapaça aqui porque o Mathematica possui a funcionalidade mais próxima . O resto é direto e se preocupa em organizar o resultado em uma matriz 1D. Parece feio apenas por causa do esforço extra para abreviá-lo.
fonte
C # -
1039787 bytesNão tenho certeza se entendi corretamente essa pergunta, mas aqui está minha solução.
Usei Listas em vez de matrizes, porque isso me permite escrever um código mais curto.Uma matriz inteira é menor que uma lista inteira.
Entrada:
Método:
Saída:
Se minha resposta não estiver correta, deixe um comentário abaixo.
EDIT: AS @grax apontou, a questão agora é sobre carros alegóricos. Portanto, eu gostaria de incluir sua resposta também.
95 bytes (resposta de Grax)
fonte
item
parai
e vocêfloat[] t(float[] a, float[] b) {return a.Select(d=>b.OrderBy(e=>Math.Abs(e-d)).First()).ToArray();}
R, 41 caracteres
Explicação:
outer(A,B,`-`)
calcula para cada elemento x de A a diferençax-B
e gera o resultado como uma matriz (do comprimento da cota (A) x comprimento (B)).which.min
escolhe o índice do número mínimo.apply(x, 1, f)
aplica a funçãof
em cada linha da matrizx
.Então,
apply(abs(outer(A,B,`-`)),1,which.min)
retorna os índices da diferença absoluta mínima entre cada elemento de A e os elementos do vetor B.Uso:
fonte
CJam - 14
O código principal está na segunda linha, o restante é para usar a entrada padrão e a saída bonita.
Experimente em http://cjam.aditsu.net/
Explicação:
q~
lê e avalia que a entradaf{...}
executa o bloco para cada elemento da primeira matriz e o próximo objeto (que é a segunda matriz), coletando os resultados em uma matriz{...}$
classifica a segunda matriz usando o bloco para calcular uma chave para cada item1$
copia a corrente o item da primeira matriz-z
subtrai, em seguida, pega o valor absoluto,0=
pega o primeiro valor da matriz classificada (aquele com a chave mínima)\;
descarta o item da primeira matriz,p
imprime a representação em seqüência do resultadoExemplos (inspirados em outras respostas):
Entrada:
[10.1 11.2 12.3 13.4 9.5] [10 12 14]
Saída:
[10 12 12 14 10]
Entrada:
[0 25 10 38] [3 22 15 49 2]
Saída:
[2 22 15 49]
fonte
Javascript (E6) 54
56 59Minimize a distância. Usando quadrado em vez de abs, apenas salve caracteres.
Editar álgebra ...
Editar corrigir atribuição inútil (o restante de um teste sem a definição de função)
Estava
F=(A,B)=>D=A.map(a=>B.sort((x,y)=>((x-=a,y-=a,x*x-y*y))[0])
Teste
Resultado:
[10, 12, 12, 14, 10]
fonte
D=
não é necessário, poismap
retorna uma nova matriz. Função de classificação alternativa (do mesmo tamanho):(x,y)=>(x-=a)*x-(y-=a)*y
Python 3.x - 55 caracteres
a
eb
são as matrizes de entrada e a matriz desejada é o resultado da expressão.fonte
Haskell, 55
No começo, pensei em usar
minimumBy
ecomparing
, mas como esses não estão no Prelude, foram necessários muitos caracteres para qualificá-los. Também roubou a ideia quadrática de algumas outras respostas para raspar um personagem.fonte
PowerShell - 44
Exemplo
Com
$a
e$b
definido como:Saída é
fonte
$a|%{$n=$_;($b|sort{($n-$_)*($n-$_)})[0]}
Ruby, 40
O mesmo que a resposta do Python, mas a quadratura é um pouco mais tensa do que qualquer maneira que eu possa pensar em ter valor absoluto.
fonte
Pitão -
1211 bytesNota: Pyth é muito mais jovem que esse desafio, portanto, esta resposta não é elegível para vencer.
Método simples, usa a
o
função de ordem para obter uma distância mínima em
aplicá-la na listaa
.Experimente online aqui .
fonte
TI-BASIC, 24
Não chega nem perto do APL, mas usa funções menos poderosas - isso não usa nenhuma função "classificada por" ou "índice do mínimo". A desvantagem do TI-BASIC aqui é a falta dessas funções e matrizes multidimensionais.
Ungolfed:
A função min (tem dois comportamentos: quando usada com números ou listas reais, fornece o menor valor; no entanto, quando usada com números ou listas complexos, fornece o valor com o menor valor absoluto. A adição
0i
ou multiplicação pori^2
causa do intérprete use o segundo comportamento, entãomin(1,-2)
retorna-2
enquantomin(1+0i,-2+0i)
retorna1
.fonte
Fortran 90: 88
Isso requer que ele seja
contain
editado em um programa completo:Os colchetes declaram uma matriz enquanto
(...,i=)
representam umdo
loop implícito ; Em seguida, retorno o valorb
para o qual o elementoa(i)-b
é minimizado.fonte
Matlab: 48
Assume que
A
eB
são matrizes 1D na área de trabalho, o resultado final estáC
na área de trabalho. Isso provavelmente também funcionaria no Octave. A indexação condicional torna isso bastante trivial.fonte
C 144
163Ok ... acho que esse pequeno código precisa de explicação.
No começo, tentei fazer o trabalho com dois níveis de loop for, encontrando a diferença mínima e defina o valor atual para min do valor de B. Isso é muito básico.
O mesmo pode ser alcançado com qsort e uma função comparadora. Eu faço o tipo B pela diferença em vez dos elementos de B. Muitas funções para um algoritmo tão pequeno. Portanto, a função q agora serve a dois propósitos. No início, é o próprio algoritmo, em segundo lugar (quando o qsort o chama) um comparador. Para a comunicação entre os dois estados, tive que declarar globais.
m significa se está no estado comparador ou no principal .
exemplo:
fonte
GolfScript, 49 bytes
Nota: esta é uma solução parcial. Estou trabalhando para torná-lo uma solução completa
Sim. O GolfScript suporta ponto flutuante. Experimente aqui . Exemplo:
Saída:
fonte
C # 262
O programa encontra diferenças mínimas e economiza o valor mais próximo da Matriz B. Vou trabalhar no golfe em breve.
Programa completo com código de teste
fonte
C #: 120
O Linq é incrível:
fonte