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 255para reemplazar -1y 128reemplazar -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 Nestá 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-1ceros entrenelementos. 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*yes cierto solo cuandoxyytiene el mismo signo yyel valor absoluto es mayor. en cuenta que cuandoxes0que siempre es cierto.determinamos que
xes el resultado si y sólo si está contenido ens, y que para todosyensxcuenta el mismo signo queyy es más pequeño en valor absoluto. Si ningún valor enssatisface esta definición, entonces0es el resultado.fluego funciona buscandosun elemento para satisfacer esto, y lo usa0por 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
reducepara convertir el buscador min-mod de dos entradas ennuno 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()yprintde Python 2.Código antiguo, sin ordenar:
fuente
Medianembargo, Mathematica tiene una función incorporada .Maravilloso, 210 bytes
Hay tres tableros utilizados aquí.
El
|tablero (Aben 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
Mtablero (Minabsen 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
Mtablero 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
Mtablero 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
08en 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
Dpdebajo de la última línea de la placa principal (antes:M), reemplace]]conRdy 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,by0. 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
:zfuncionadoUsando 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
:gy:ztrabajado, 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
xyyes 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 dexyyes 0 (0:) si 0 es mayor o igual que el producto dexyy, de lo contrario, es el min (<.) o el max (>.) entrexyydependiendo 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(Anssolo en ocho bytes, falla en las listas de dimensión uno.If variance(Ans:augment(Ans,0ΔList(Ans:median(AnsEs 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
reducey 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.Qtambié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 (
Aggregateen 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)]esysiabs(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
32000es 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
summaryhacer? ¿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
lambdasegundos. 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