La función minmod es una variante del min familiar , que aparece en esquemas de alta resolución con limitación de pendiente para ecuaciones diferenciales parciales. Dadas una serie de pendientes, selecciona la pendiente más plana, mientras se ocupa de los signos relativos entre las pendientes.
La función toma un número arbitrario de parámetros. Entonces minmod (x 1 , x 2 , ..., x n ) se define como:
- min (x 1 , x 2 , ..., x n ) , si todo x i es estrictamente positivo
- max (x 1 , x 2 , ..., x n ) , si todo x i es estrictamente negativo
- 0 , de lo contrario.
Solo consideraremos entradas enteras, porque eso realmente no afecta la implementación y debería ser más inclusivo para algunos lenguajes (esotéricos).
Escriba un programa o función, que tome n enteros con signo (para n> 0 ) a través de STDIN, ARGV o argumento de función (puede usar una matriz si es más conveniente que una función variable), y devuelve o imprime (a STDOUT) el resultado de minmod (a, b) .
No debe utilizar incorporada min o max funciones (y, obviamente, hay una función de MINMOD o bien, si en realidad se puede encontrar que). Además, no debe usar ninguna función de clasificación incorporada, excepto para ordenar un pequeño número fijo de elementos (menos de 5).
Si su idioma no tiene tipos con signo, puede usar un tipo sin signo e interpretarlo como complemento de dos. Por ejemplo, si su idioma solo usa bytes sin firmar, puede usar 255
para reemplazar -1
y 128
reemplazar -128
, etc.
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Casos de prueba
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
Tablas de clasificación
El siguiente fragmento de pila genera una tabla de clasificación regular y una descripción general de los ganadores por idioma. Entonces, incluso si su idioma de elección no le permite ganar el desafío completo, ¿por qué no tratar de obtener un lugar en la segunda lista?
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# 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>
Respuestas:
GolfScript,
109 bytesAsume la entrada de stdin en el formato
[-4 -2 -3 -2]
Esto utiliza la función de ordenamiento incorporada
$
, pero cada vez que se invoca está en una matriz de 3 elementos, lo cual está permitido.Demostración en línea
fuente
Mathematica, 19 bytes
Código y golf gracias a Martin Büttner.
Esta es una función pura sin nombre que toma una lista de enteros como entrada. Invocarlo como
o similarmente guardado en variable.
El código primero rifla un cero entre cada dos elementos de la lista de entrada, que inserta
n-1
ceros entren
elementos. Luego, se necesita la mediana para producir la respuesta.Esto proporciona min-mod porque maneja cada caso:
Todos los números son positivos, en cuyo caso los ceros están por debajo de ellos y la mediana es el número positivo más bajo.
Todos los números son negativos, en cuyo caso los ceros están por encima de ellos y la mediana es el número menos negativo.
Hay un número positivo y un número negativo, por lo que el elemento del medio es un cero.
Si Mathematica implementa su mediana usando el algoritmo de selección de tiempo lineal , entonces esto también es O (n).
fuente
Haskell,
6261393837 bytesel uso de un poco de magia comparación tomada de @ Zgarb de respuesta *, a saber,
x*x<=x*y
.x*x<=x*y
es cierto solo cuandox
yy
tiene el mismo signo yy
el valor absoluto es mayor. en cuenta que cuandox
es0
que siempre es cierto.determinamos que
x
es el resultado si y sólo si está contenido ens
, y que para todosy
ens
x
cuenta el mismo signo quey
y es más pequeño en valor absoluto. Si ningún valor ens
satisface esta definición, entonces0
es el resultado.f
luego funciona buscandos
un elemento para satisfacer esto, y lo usa0
por defecto.* aunque él no lo usó por las razones por las que lo estoy usando, y de hecho ya lo ha eliminado
fuente
JavaScript (ES6), 39 bytes
fuente
Pitón 2, 53
La idea es utilizar
reduce
para convertir el buscador min-mod de dos entradas enn
uno de entrada. Se me ocurrió independientemente de las otras respuestas que lo usan. Solo Python 2 es compatiblereduce
.La solución de dos entradas simplemente encuentra la mediana de los dos números y cero. Vea mi respuesta de Mathematica para una forma más directa de usar la mediana.
Menos golfizado:
Una amalgama hipotético de Python 2 y Python 3 sería un carácter más corto, con la asignación estrellado de Python 3 y
input()
yprint
de Python 2.Código antiguo, sin ordenar:
fuente
Median
embargo, Mathematica tiene una función incorporada .Maravilloso, 210 bytes
Hay tres tableros utilizados aquí.
El
|
tablero (Ab
en la versión legible) toma el valor absoluto de una canica (ya sea devolviendo la canica pasada o cero menos la canica pasada, ya que toda la aritmética en Marbelous no está firmada).El
M
tablero (Minabs
en la versión legible) encuentra y emite a la izquierda la primera o segunda canica pasada (la que tenga un valor absoluto más pequeño), y saliendo si se pasa una canica firmada diferente.El
M
tablero también libera la canica que sostiene hacia abajo en lugar de hacia la izquierda una vez que se obtiene el último personaje de STDIN.El
M
tablero se usa en el tablero principal para almacenar el minmod de todos los valores marcados en cualquier momento dado, ya que libera el valor que se guardará hacia la izquierda, que luego se desvía de nuevo.Los cubos de basura (
\/
) solo se colocaron bajo sincronizadores que, de lo contrario, se imprimirían en STDIN.Entrada / Salida usa STDIN / STDOUT. Ambos tratan con valores de 8 bits (si desea pasar + 0x30 y + 0x38, colóquelo
08
en STDIN).Se requieren bibliotecas y tableros cilíndricos. Se recomienda ver la salida como números decimales (tenga en cuenta que esto muestra el valor sin signo del resultado minmod).
Pruébalo aquí.
Nota: Para una entrada / salida más amigable para los humanos, agregue
Dp
debajo de la última línea de la placa principal (antes:M
), reemplace]]
conRd
y agregue lo siguiente en la parte inferior:Esto simplemente cambia la salida a 3 dígitos decimales. Del mismo modo, la entrada con estos cambios requiere una lista separada por espacios de 3 dígitos decimales por número.
Versión legible:
fuente
Haskell,
834039 bytesProbablemente esta no sea la solución Haskell más corta posible (y ciertamente no superará a las demás aquí), pero es un comienzo. EDITAR: ¡ Ahora más del 50% más corto! EDIT2: Un byte menos ...
Esto es solo un pliegue directo (o reducido, como lo llaman algunos idiomas) por el operador binario
#
, que calcula la mediana dea
,b
y0
. Aunque las reglas ahora me permitirían ordenar listas pequeñas, esto requiere una importación en Haskell y da como resultado un recuento de bytes más alto ( 49 bytes, pero 31 sin la importación):fuente
\a-> (signum a,a)
es lo mismo quesignum>>=(,)
usar la función monad instance. (vea mi publicación en "consejos para jugar al golf en Haskell")TIS-100,
696526 bytesEspera que la secuencia sea terminada por
-999
. TIS-100 es más nuevo que esta pregunta, pero no es que eso importe aquí de todos modos.El nodo 9 realiza un seguimiento de si todos somos positivos, todos negativos o mixtos. Los nodos 5 y 6 trabajan para encontrar el mínimo del valor absoluto de todos los números de entrada. El nodo 10 luego selecciona el mínimo, el mínimo negado o 0 dependiendo del estado del nodo 9.
fuente
CJam, 20 bytes (o 10 bytes)
Usando el enfoque de @ xnor, reduzca el cálculo de minmod de 2 números a la vez desde la matriz.
Esto hubiera sido 19 bytes si hubiera
:z
funcionadoUsando la nueva regla de usar ordenaciones en matrices cortas:
que es exactamente equivalente a la respuesta de @ Peter
Respuesta anterior de 26 bytes:
Esto se puede jugar más golf ...
La entrada (a través de STDIN) es la matriz de enteros como:
y la salida es el minmod de la matriz de entrada
Pruébalo aquí
Si solamente
:g
y:z
trabajado, esto habría sido 4 bytes más corto.fuente
q~_{g}%_|:+\{z\za+_~>=}**
.Java, 84 bytes
Esto es Java en todo su esplendor. Supera a GolfScript en un factor ligeramente superior al 900%.
Envuelto en clase:
Ampliado con comentarios:
Nota: Esto se puede mejorar con Java 8.
Nota: El esfuerzo para mejorar en Java 8 falló.
fuente
J,
2012 bytesFunción tomando la lista como argumento. Robado del Golfscript / CJam / lo que sea.
El minmod de
x
yy
es la mediana (ordenar/:~
y tomar el medio1{
) de la lista de tres elementos0,x,y
. Reducir la lista ( plegable en lenguaje J) tomando este minmod entre elementos adyacentes.En uso en el REPL. (J deletrea su signo negativo
_
).0:`<.`>.@.(*@]*0<*))/
Basura vieja, antes de notar que se permiten tipos cortos: el minmod dex
yy
es 0 (0:
) si 0 es mayor o igual que el producto dex
yy
, de lo contrario, es el min (<.
) o el max (>.
) entrex
yy
dependiendo del signo . Dobla esto sobre toda la lista.fuente
TI-BASIC, 19 bytes
Asume la entrada en el formato
{-2,4,3}
.Funciona de manera similar a la respuesta de xnor:
fuente
median(augment(Ans,0ΔList(Ans
solo en ocho bytes, falla en las listas de dimensión uno.If variance(Ans:augment(Ans,0ΔList(Ans:median(Ans
Es más largo que el tuyo. Si solo TI-BASICPython 2,
8279716961 bytesEsto se basa en mi respuesta pyth, que se inspiró en la respuesta de Mig .
Vieja respuesta:
Esta es una respuesta muy larga.
Siento que tener 2 variables es un desperdicio ...?Yo tenía razón...? ish? ;pagsfuente
KDB / Q, 43 caracteres para la definición del cuerpo de la función
Gracias a las grandes ideas de publicaciones anteriores:
Ingrese un número único usando enlist
Estoy seguro de que algunos gurús de Q pueden tener otros más cortos.
fuente
{asc[0,x,y]1}/
?Pyth,
25222012Probablemente no novela, sino original: P
Pre-clasificación permitida
Pyth
Pruébalo en línea.
La idea de usar
reduce
y declaraciones ternarias fue robada descaradamente de la respuesta de Mig , pero no tengo idea de si estos algoritmos son incluso similares, ya que no puedo leer las declaraciones ternarias.Explicación:
fuente
tQ
.Q
también funcionará?
por un*
...C #, 101 bytes
Mi primer intento en el código de golf y en un lenguaje hostil de golf bonito. Basado en reduce (
Aggregate
en LINQ) y muy similar a la respuesta de JavaScript de Mig . Se puede ejecutar como(new System.Linq.M()).m(new[] {1, 2, 3})
. Pasa todos los casos de prueba, pero no maneja matrices de entrada vacías.fuente
J, 12 bytes
La función reduce la lista (llamada plegable (
/
) en J) con la expresión:(signum(x) == signum(y)) * [x,y][abs(x)>abs(y)]
dónde[x,y][abs(x)>abs(y)]
esy
siabs(x) > abs(y)
másx
.Ejemplo:
Pruébelo en línea aquí.
fuente
Lenguaje Game Maker, 489 bytes
Sobre Game Maker Language
Agita la matriz (se agregan ceros) y devuelve la mediana (similar a mi otra respuesta)
fuente
32000
es el tamaño máximo de la matriz según lo limitado por el software.Java,
353304124 bytesReúna el peor lenguaje para el golf de código con el peor golfista del mundo y obtendrá ...
Elimínelo y obtendrá:
Esta es una función (si no fuera bastante obvio) que recibe una serie de números y procesa sus valores, devolviendo el valor minmod.
También se incluye mi antiguo beneficio de una solución, que es un programa completo, como siempre.
Elimínelo y obtendrá:
Recibe números infinitos, se detiene cuando se ingresa un valor no numérico, presentando el valor Minmon.
fuente
1 2 3
. También parece pasar por alto que puede escribir una función que procesa sus argumentos en lugar de un programa que lee desde stdin.R, 20 caracteres
R generalmente no es bueno para codegolf, pero lo uso para mi trabajo, así que quería probar. Antes de intentarlo, ¡no sabía que R está dispuesto a aceptar una sintaxis tan sucia! :-) 52 caracteres :
Luego miré las otras respuestas que probé con el genial truco mediano de @ xnor, ¡que es genial!
fuente
summary
hacer? ¿Sonq[1]
yq[6]
min y max, respectivamente? En ese caso, eso no es válido, porque no puede usar min / max incorporado.Python, 52
Todavía no pude evitar sentir que es malo tener dos
lambda
segundos. Esta función toma una lista y luego devuelve una lista de un elemento que contiene el resultado.Con suerte, no causará una gran cantidad de ofensas tener el resultado en una lista de un elemento.
fuente
Matlab / Octave, 26
Esto es básicamente una traducción de la respuesta de Mathematica por xnor. Funciona agregando uno ceros menos que la longitud del vector de entrada. Tenga en cuenta que agregar uno más no funcionaría, ya que el resultado sería 0 todo el tiempo. Gracias a MartinBüttner por los -4 caracteres de esta solución =)
fuente
@(x)median([0*x,x](2:end))
. Aunque parece que son los mismos bytes que ahora.Python,
7260 bytesEsta es la primera solución que pensé, y es bastante ingenua. La segunda mitad es básicamente un duplicado de la primera mitad del código, pero no estaba seguro de cómo reducirlo. Me pregunto si se puede acortar usando
eval
...Editar: Cambiamos lambdas a comprensiones.
Pruébalos aquí
Esto es solo 4 caracteres más, pero aún vale la pena mirarlo, usando el TIP de Sp3000 .
fuente
Javascript, 63
Una versión más legible:
fuente