A função minmod é uma variante do familiar min , que aparece em esquemas de alta resolução com limitação de inclinação para equações diferenciais parciais. Dadas várias pistas, ela escolhe a inclinação mais plana, enquanto cuida dos sinais relativos entre as pistas.
A função aceita um número arbitrário de parâmetros. Então minmod (x 1 , x 2 , ..., x n ) é definido como:
- min (x 1 , x 2 , ..., x n ) , se todos os x i forem estritamente positivos
- max (x 1 , x 2 , ..., x n ) , se todos os x i forem estritamente negativos
- 0 , caso contrário.
Consideraremos apenas entradas inteiras, porque isso realmente não afeta a implementação e deve ser mais inclusivo para algumas linguagens (esotéricas).
Escreva um programa ou função que receba n números inteiros assinados (para n> 0 ) via STDIN, ARGV ou argumento de função (você pode usar uma matriz se isso for mais conveniente que uma função variável) e retorne ou imprima (para STDOUT) o resultado de minmod (a, b) .
Você não deve usar funções mínimas ou máximas embutidas (e, obviamente, nenhum minmod embutido também, se é que consegue encontrar isso). Além disso, você não deve usar nenhuma função de classificação interna, exceto para classificar um pequeno número fixo de itens (menor que 5).
Se seu idioma não possui tipos assinados, você pode usar um tipo não assinado e interpretá- lo como complemento de dois. Por exemplo, se o idioma só usa sem assinatura bytes, você pode usar 255
para substituir -1
e 128
para substituir -128
, etc.
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Casos de teste
Input Output
2 2
-3 -3
0 0
3 -5 0
2 4 1 1
0 1 2 0
-1 1 2 0
-4 -2 -3 -2 -2
-5 0 -1 0
1 0 -1 0
Classificação
O seguinte snippet de pilha gera uma tabela de classificação regular e uma visão geral dos vencedores por idioma. Portanto, mesmo que seu idioma de escolha não permita que você vença todo o desafio, por que não tentar conquistar um lugar na segunda lista?
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);i=i.replace("{{PLACE}}",t++ +".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=42079;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
Respostas:
GolfScript,
109 bytesAssume a entrada de stdin no formato
[-4 -2 -3 -2]
Isso usa a função de classificação interna
$
, mas toda vez que é chamada, ela está em uma matriz de 3 elementos, o que é permitido.Demonstração online
fonte
Mathematica, 19 bytes
Código e golfe graças a Martin Büttner.
Esta é uma função pura sem nome que recebe uma lista de números inteiros como entrada. Invoque-o como
ou salvo da mesma forma na variável.
O código primeiro corrige um zero entre cada dois elementos da lista de entrada, que insere
n-1
zeros entre osn
elementos. Em seguida, é necessária a mediana para produzir a resposta.Isso fornece o min-mod porque ele lida com cada caso:
Todos os números são positivos; nesse caso, os zeros estão abaixo deles e a mediana é o menor número positivo.
Todos os números são negativos; nesse caso, os zeros estão acima deles e a mediana é o número menos negativo.
Há um número positivo e um negativo e, portanto, o elemento do meio é um zero.
Se o Mathematica implementa sua mediana usando o algoritmo de seleção de tempo linear , então este também é O (n).
fonte
Haskell,
6261393837 bytesusando alguma mágica de comparação emprestada da resposta do @ Zgarb *, a saber
x*x<=x*y
,.x*x<=x*y
é verdadeiro somente quandox
ey
tem o mesmo sinal ey
o valor absoluto de é maior. note que quandox
é0
que é sempre verdade.determinamos que
x
é o resultado se ele estiver contidos
e que, para todosy
,s
x
tem o mesmo sinaly
e é menor em valor absoluto. se nenhum valors
satisfizer esta definição, então0
é o resultado.f
então trabalha pesquisandos
um elemento para satisfazer isso e usa0
como padrão.* embora ele não o tenha usado pelas razões pelas quais eu estou usando, e ele já se livrou
fonte
JavaScript (ES6), 39 bytes
fonte
Python 2, 53
A idéia é usar
reduce
para transformar o localizador min-mod de duas entradas em um local den
entrada. Eu vim com ele independentemente das outras respostas que o usam. Somente o Python 2 suportareduce
.A solução de duas entradas simplesmente encontra a mediana dos dois números e zero. Veja minha resposta do Mathematica para uma maneira mais direta de usar a mediana.
Menos golfe:
Um amálgama hipotético do Python 2 e Python 3 seria um caractere mais curto, com a atribuição estrelada do Python 3
input()
eprint
do Python 2.Código antigo, sem classificação:
fonte
Median
interno.Marbelous, 210 bytes
Existem três placas usadas aqui.
O
|
tabuleiro (Ab
na versão legível) assume o valor absoluto de um mármore (retornando o mármore passado ou zero menos o mármore passado, pois toda a aritmética em Marbelous é sem sinal).A
M
placa (Minabs
na versão legível) localiza e produz à esquerda o primeiro ou o segundo mármore passado (o que tiver um valor absoluto menor) e sair se outro mármore assinado for passado.O
M
tabuleiro também libera o mármore que segura para baixo, em vez de para a esquerda, quando o último personagem de STDIN é buscado.A
M
placa é usada na placa principal para armazenar o minmod de todos os valores verificados a qualquer momento, pois libera o valor a ser salvo para a esquerda, que é desviado novamente.Os caixotes do lixo (
\/
) foram colocados apenas em sincronizadores que, de outra forma, seriam impressos em STDIN.Entrada / Saída usa STDIN / STDOUT. Ambos lidam com valores de 8 bits (se você deseja passar + 0x30 e + 0x38, coloque
08
em STDIN).Bibliotecas e placas cilíndricas são necessárias. É recomendável visualizar a saída como números decimais (observe que isso exibe o valor não assinado do resultado minmod).
Teste aqui.
Nota: Para entradas / saídas mais amigáveis ao ser humano, adicione
Dp
sob a última linha da placa principal (antes:M
), substitua]]
porRd
e adicione o seguinte na parte inferior:Isso simplesmente altera a saída para 3 dígitos decimais. Da mesma forma, a entrada com essas alterações requer uma lista separada por espaços de 3 dígitos decimais por número.
Versão legível:
fonte
Haskell,
834039 bytesEsta provavelmente não é a solução mais curta possível da Haskell (e certamente não superará as outras aqui), mas é um começo. EDIT: Agora mais de 50% mais curto! EDIT2: um byte a menos ...
Este é apenas um simples dobrar (ou reduzir, como algumas linguagens chamam) pelo operador binário
#
, que calcula a mediana dea
,b
e0
. Embora as regras agora me permitam classificar pequenas listas, isso requer uma importação no Haskell e resulta em uma contagem de bytes mais alta ( 49 bytes, mas 31 sem a importação):fonte
\a-> (signum a,a)
é o mesmo quesignum>>=(,)
usar a função monad instance. (veja meu post em "dicas para jogar golfe em haskell")TIS-100,
696526 bytesEspera que a sequência seja finalizada por
-999
. O TIS-100 é mais recente que esta pergunta, mas não é como se aqui importasse de qualquer maneira.O nó 9 controla se somos todos positivos, todos negativos ou mistos. Os nós 5 e 6 trabalham para encontrar o mínimo do valor absoluto de todos os números de entrada. O nó 10 então seleciona o mínimo, o mínimo negado ou 0, dependendo do estado do nó 9.
fonte
CJam, 20 bytes (ou 10 bytes)
Usando a abordagem do @ xnor, reduza o cálculo do minmod de 2 números por vez a partir da matriz.
Isso teria sido 19 bytes se
:z
funcionasseUsando a nova regra de usar classificações em matrizes curtas:
o que é exatamente equivalente à resposta de @ Peter
26 bytes anteriores anteriores:
Isso pode ser jogado ainda mais ...
Entrada (via STDIN) é a matriz inteira como:
e output é o minmod da matriz de entrada
Experimente aqui
Se apenas
:g
e:z
funcionasse, isso teria sido 4 bytes mais curto.fonte
q~_{g}%_|:+\{z\za+_~>=}**
.Java, 84 bytes
Este é Java em toda a sua glória. Supera o GolfScript por um fator de pouco mais de 900%.
Embrulhado na aula:
Expandido com comentários:
Nota: Isso pode ser aprimorado usando o Java 8.
Nota: O esforço para melhorar no Java 8 falhou.
fonte
J,
2012 bytesFunção que toma a lista como argumento. Roubado do Golfscript / CJam / tanto faz.
O minmod de
x
ey
é a mediana (classifique/:~
e fique no meio1{
) da lista de três itens0,x,y
. Reduza a lista ( dobrando na linguagem J), levando esse minmod entre elementos adjacentes.Em uso no REPL. (J soletra seu sinal negativo
_
.)Lixo antigo, antes que eu notei que tipos curtos são permitidos:
0:`<.`>.@.(*@]*0<*))/
o minmod dex
ey
é 0 (0:
) se 0 for maior ou igual ao produto dex
ey
, caso contrário, é o min (<.
) ou o máximo (>.
) entrex
ey
dependendo do sinal . Dobre isso sobre a lista inteira.fonte
TI-BASIC, 19 bytes
Pressupõe entrada no formato
{-2,4,3}
.Funciona de maneira semelhante à resposta do xnor:
fonte
median(augment(Ans,0ΔList(Ans
com apenas oito bytes, falha nas listas da dimensão um.If variance(Ans:augment(Ans,0ΔList(Ans:median(Ans
é mais longo que o seu. Se ao menos o TI-BASIC suportasse listas vazias ... #Python 2,
8279716961 bytesIsso se baseia na minha resposta pyth, que foi inspirada na resposta de Mig .
Resposta antiga:
Esta é uma resposta muito longa.
Eu sinto que ter 2 variáveis é um desperdício ...?Eu tinha razão...? ish? ; pfonte
KDB / Q, 43 caracteres para definição do corpo da função
Graças a ótimas idéias de posts anteriores:
Digite um número único usando o alistamento
Tenho certeza de que algum guru Q pode inventar outros mais curtos.
fonte
{asc[0,x,y]1}/
?Pitão,
25222012Provavelmente não é novidade, mas é original: P
Pré-classificação permitida
Pyth
Experimente online.
A idéia de usar
reduce
e declarações ternárias foi descaradamente roubada da resposta de Mig , mas não tenho idéia se esses algoritmos são de outra forma semelhantes, pois não consigo ler declarações ternárias.Explicação:
fonte
tQ
.Q
também funcionará?
para uma*
...C #, 101 bytes
Minha primeira tentativa no código de golfe e em uma linguagem bastante hostil ao golfe. Baseado em reduzir (
Aggregate
em LINQ) e muito semelhante à resposta JavaScript de Mig . Pode ser executado como(new System.Linq.M()).m(new[] {1, 2, 3})
. Passa em todos os casos de teste, mas não lida com matrizes de entrada vazias.fonte
J, 12 bytes
A função reduz a lista (chamada dobrável (
/
) em J) com a expressão:(signum(x) == signum(y)) * [x,y][abs(x)>abs(y)]
Onde[x,y][abs(x)>abs(y)]
éy
seabs(x) > abs(y)
maisx
.Exemplo:
Experimente online aqui.
fonte
Linguagem do Game Maker, 489 bytes
Sobre o idioma do Game Maker
Discreta a matriz (zeros são anexados) e retorna a mediana (semelhante à minha outra resposta)
fonte
32000
é o tamanho máximo da matriz, conforme limitado pelo software.Java,
353304124 bytesJunte o pior idioma para o código de golfe ao pior jogador de golfe do mundo e ...
Ungolf-lo e você terá:
Essa é uma função (se não fosse óbvia) que recebe uma matriz de números e processa seus valores, retornando o valor minmod.
Meu velho benefício de solução também está incluído, que é um programa inteiro - como sempre.
Ungolf-lo e você terá:
Recebe números infinitos, para quando um valor não numérico é inserido, apresentando o valor Minmon.
fonte
1 2 3
. Você também parece ignorar que pode escrever uma função que processa seus argumentos, em vez de um programa que lê stdin.R, 20 caracteres
O R normalmente não é bom para o codegolf, mas eu o uso para o meu trabalho, então eu queria tentar. Antes de tentar, não sabia que R estava disposto a aceitar uma sintaxe tão suja! :-) 52 caracteres :
Depois procurei as outras respostas que experimentei o truque mediano genial do @ xnor, o que é ótimo!
fonte
summary
faz? Sãoq[1]
eq[6]
min e max, respectivamente? Nesse caso, isso não é válido, porque você não pode usar o mínimo / máximo interno.Python, 52
Eu ainda não pude deixar de sentir que é ruim ter dois
lambda
s. Essa função recebe uma lista e, em seguida, retorna uma lista de um elemento que contém o resultado.Felizmente, isso não fará com que uma quantidade enorme de ofensas tenha o resultado em uma lista de um elemento.
fonte
Matlab / Octave, 26
Isso é basicamente apenas uma tradução da resposta do Mathematica pelo xnor. Ele funciona anexando um zeros a menos que o comprimento do vetor de entrada. Observe que acrescentar mais um não funcionaria, pois o resultado seria 0 o tempo todo. Obrigado a MartinBüttner pelos -4 caracteres desta solução =)
fonte
@(x)median([0*x,x](2:end))
. Embora pareça que são os mesmos bytes que agora.Python,
7260 bytesEsta é a primeira solução que pensei e é bastante ingênua. A segunda metade é basicamente uma duplicata da primeira metade do código, mas eu não tinha certeza de como reduzi-lo. Gostaria de saber se pode ser encurtado usando
eval
...Edit: Alteradas lambdas para compreensões.
Experimente aqui
Isso tem apenas 4 caracteres a mais, mas ainda vale a pena observar, usando o TIP do Sp3000 .
fonte
Javascript, 63
Uma versão mais legível:
fonte