La fonction minmod est une variante du min familier , qui apparaît dans les schémas haute résolution limitant la pente pour les équations différentielles partielles. Étant donné un certain nombre de pentes, il sélectionne la pente la plus plate, tout en prenant soin des signes relatifs entre les pentes.
La fonction prend un nombre arbitraire de paramètres. Alors minmod (x 1 , x 2 , ..., x n ) est défini comme:
- min (x 1 , x 2 , ..., x n ) , si tous les x i sont strictement positifs
- max (x 1 , x 2 , ..., x n ) , si tous les x i sont strictement négatifs
- 0 sinon.
Nous ne considérerons que les entrées entières, car cela n'affecte pas vraiment l'implémentation et devrait être plus inclusif pour certaines langues (ésotériques).
Écrire un programme ou une fonction, qui prend n entiers signés (pour n> 0 ) via STDIN, ARGV ou argument de fonction (vous pouvez utiliser un tableau si cela est plus pratique qu'une fonction variadique), et retourne ou imprime (à STDOUT) le résultat de minmod (a, b) .
Vous ne devez pas utiliser les fonctions min ou max intégrées (et évidemment, pas de minmod intégré non plus, si vous pouvez réellement le trouver). De plus, vous ne devez utiliser aucune fonction de tri intégrée, sauf pour trier un petit nombre fixe d'éléments (moins de 5).
Si votre langue n'a pas de types signés, vous pouvez utiliser un type non signé et l' interpréter comme un complément à deux. Par exemple, si votre langue n'utilise que des octets non signés, vous pouvez utiliser 255
pour remplacer -1
et 128
pour remplacer -128
, etc.
Il s'agit du code golf, donc la réponse la plus courte (en octets) l'emporte.
Cas de test
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
Classements
L'extrait de pile suivant génère à la fois un classement régulier et un aperçu des gagnants par langue. Donc, même si la langue de votre choix ne vous permet pas de remporter l'intégralité du défi, pourquoi ne pas essayer de vous arracher une place sur la deuxième liste?
Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:
# 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>
Réponses:
GolfScript,
109 octetsSuppose l'entrée de stdin au format
[-4 -2 -3 -2]
Cela utilise la fonction de tri intégrée
$
, mais chaque fois qu'il est invoqué, c'est sur un tableau de 3 éléments, ce qui est autorisé.Démo en ligne
la source
Mathematica, 19 octets
Code et golf grâce à Martin Büttner.
Il s'agit d'une fonction pure sans nom qui prend en entrée une liste d'entiers. Invoquez-le comme
ou enregistré de manière similaire dans une variable.
Le code diffuse d'abord un zéro entre tous les deux éléments de la liste d'entrée, ce qui insère des
n-1
zéros entre lesn
éléments. Ensuite, il faut la médiane pour produire la réponse.Cela donne min-mod car il gère chaque cas:
Tous les nombres sont positifs, auquel cas les zéros sont en dessous d'eux et la médiane est le nombre positif le plus bas.
Tous les nombres sont négatifs, auquel cas les zéros sont au-dessus d'eux et la médiane est le nombre le moins négatif.
Il y a à la fois un nombre positif et négatif, et donc l'élément du milieu est un zéro.
Si Mathematica implémente sa médiane en utilisant l' algorithme de sélection en temps linéaire , alors c'est aussi O (n).
la source
Haskell,
6261393837 octetsen utilisant la magie de comparaison empruntée @ réponse Zgarb de *, à savoir
x*x<=x*y
.x*x<=x*y
n'est vrai que lorsquex
ety
ont le même signe et quey
la valeur absolue est plus grande. noter que quandx
est0
il est toujours vrai.nous estimons que
x
est le résultat IFF est contenu danss
, et que pour tousy
ens
x
a le même signe quey
et est plus petite en valeur absolue. si aucune valeur nes
satisfait à cette définition, alors0
le résultat est.f
fonctionne ensuite en recherchants
un élément pour y répondre et l'utilise0
par défaut.* bien qu'il ne l'ait pas utilisé pour les raisons pour lesquelles je l'utilise, et il s'en est déjà débarrassé
la source
JavaScript (ES6), 39 octets
la source
Python 2, 53
L'idée est d'utiliser
reduce
pour transformer le chercheur de min-mod à deux entrées en un chercheur àn
-entrée. Je l'ai trouvé indépendamment des autres réponses qui l'utilisent. Seul Python 2 prend en chargereduce
.La solution à deux entrées trouve simplement la médiane des deux nombres et zéro. Voir mon réponse Mathematica pour une façon plus directe d'utiliser la médiane.
Moins golfé:
Un amalgame hypothétique de Python 2 et Python 3 serait un caractère plus court, avec l'affectation étoilée de Python 3
input()
etprint
de Python 2.Ancien code, sans tri:
la source
Median
.Marbelous, 210 octets
Il y a trois planches utilisées ici.
Le
|
conseil d'administration (Ab
dans la version lisible) prend la valeur absolue d'un marbre (soit en retournant le marbre passé, soit zéro moins le marbre passé, car toute l'arithmétique de Marbelous n'est pas signée).Le
M
conseil d'administration (Minabs
dans la version lisible) trouve et sort à gauche la première ou la seconde bille passée (selon celle qui a une valeur absolue la plus petite), et se ferme si une bille signée différente est passée.Le
M
plateau libère également la bille qu'il tient vers le bas au lieu de la gauche une fois que le dernier personnage de STDIN est récupéré.La
M
carte est utilisée dans la carte principale pour stocker le minmod de toutes les valeurs vérifiées à un moment donné, car elle libère la valeur à enregistrer vers la gauche, qui est ensuite renvoyée.Les poubelles (
\/
) ont été placées uniquement sous des synchroniseurs qui autrement s'imprimeraient sur STDIN.L'entrée / sortie utilise STDIN / STDOUT. Les deux traitent des valeurs 8 bits (si vous voulez passer + 0x30 et + 0x38, placez-les
08
dans STDIN).Des bibliothèques et des planches cylindriques sont nécessaires. Il est recommandé de visualiser la sortie sous forme de nombres décimaux (notez que cela affiche la valeur non signée du résultat minmod).
Testez-le ici.
Remarque: pour une entrée / sortie plus conviviale, ajoutez
Dp
sous la dernière ligne de la carte principale (avant:M
), remplacez]]
parRd
et ajoutez ce qui suit en bas:Cela change simplement la sortie à 3 chiffres décimaux. De même, la saisie avec ces modifications nécessite une liste séparée par des espaces de 3 chiffres décimaux par numéro.
Version lisible:
la source
Haskell,
834039 octetsCe n'est probablement pas la solution Haskell la plus courte possible (et ne battra certainement pas les autres ici), mais c'est un début. EDIT: Maintenant plus de 50% plus court! EDIT2: Un octet de moins ...
C'est juste un pli simple (ou réduit, comme certains langages l'appellent) par l'opérateur binaire
#
, qui calcule la médiane dea
,b
et0
. Même si les règles me permettraient désormais de trier de petites listes, cela nécessite une importation dans Haskell et entraîne un nombre d'octets plus élevé ( 49 octets, mais 31 sans l'importation):la source
\a-> (signum a,a)
revient àsignum>>=(,)
utiliser l'instance de fonction monad. (voir mon article dans "conseils pour jouer au golf à haskell")TIS-100,
696526 octetsAttend que la séquence soit terminée par
-999
. TIS-100 est plus récent que cette question, mais ce n'est pas comme si cela importait de toute façon.Le nœud 9 permet de savoir si nous sommes tous positifs, tous négatifs ou mélangés. Les nœuds 5 et 6 fonctionnent pour trouver le minimum de la valeur absolue de tous les nombres d'entrée. Le nœud 10 sélectionne ensuite le minimum, le minimum annulé ou 0 selon l'état du nœud 9.
la source
CJam, 20 octets (ou 10 octets)
En utilisant l'approche @ xnor, réduisez le calcul du minmod de 2 nombres à la fois à partir du tableau.
Cela aurait été de 19 octets si
:z
travailléUtilisation de la nouvelle règle d'utilisation des tris sur des tableaux courts:
ce qui est exactement équivalent à la réponse de @ Peter
Réponse précédente de 26 octets:
Cela peut être joué plus loin ...
L'entrée (via STDIN) est le tableau entier comme:
et la sortie est le minmod du tableau d'entrée
Essayez-le ici
Si seulement
:g
et:z
fonctionnait, cela aurait été de 4 octets plus court.la source
q~_{g}%_|:+\{z\za+_~>=}**
.Java, 84 octets
C'est Java dans toute sa splendeur. Beats GolfScript d'un facteur légèrement supérieur à 900%.
Enveloppé en classe:
Développé avec des commentaires:
Remarque: Cela peut être amélioré à l'aide de Java 8.
Remarque: les efforts d'amélioration dans Java 8 ont échoué.
la source
J,
2012 octetsFonction prenant la liste en argument. Volé au Golfscript / CJam / peu importe.
Le minmod de
x
ety
est la médiane (trier/:~
et prendre le milieu1{
) de la liste des trois éléments0,x,y
. Réduisez la liste ( pliage en J) en prenant ce minmod entre les éléments adjacents.Utilisé au REPL. (J épelle son signe négatif
_
.)Les vieilles ordures, avant de remarquer que les tris courts sont autorisés:
0:`<.`>.@.(*@]*0<*))/
Le minmod dex
ety
est 0 (0:
) si 0 est supérieur ou égal au produit dex
ety
, sinon c'est le min (<.
) ou le max (>.
) entrex
ety
selon le signe . Pliez cela sur toute la liste.la source
TI-BASIC, 19 octets
Suppose une entrée au format
{-2,4,3}
.Fonctionne de manière similaire à la réponse de xnor:
la source
median(augment(Ans,0ΔList(Ans
seulement huit octets, échoue sur les listes de dimension un.If variance(Ans:augment(Ans,0ΔList(Ans:median(Ans
est plus longue que la vôtre. Si seulement TI-BASIC supportait les listes vides ...Python 2,
8279716961 octetsCeci est basé sur ma réponse pyth, qui a été inspirée par la réponse de Mig .
Ancienne réponse:
C'est une réponse très longue.
J'ai l'impression que 2 variables sont un gaspillage ...?J'avais raison...? hein? ; pla source
KDB / Q, 43 caractères pour la définition du corps de la fonction
Merci aux bonnes idées des articles précédents:
Entrez un numéro unique à l'aide de l'enrôlement
Je suis sûr que certains gourous Q peuvent en proposer de plus courts.
la source
{asc[0,x,y]1}/
?Pyth,
25222012Probablement pas nouveau, mais original: P
Pré-tri autorisé
Pyth
Essayez-le en ligne.
L'idée d'utiliser
reduce
et des déclarations ternaires a été impudemment volée dans la réponse de Mig , mais je n'ai aucune idée si ces algorithmes sont par ailleurs même similaires, car je ne peux pas lire les déclarations ternaires.Explication:
la source
tQ
.Q
fonctionnera également?
pour un*
...C #, 101 octets
Mon premier essai au golf à code et dans un joli langage hostile au golf. Basé sur réduire (
Aggregate
dans LINQ) et très similaire à la réponse JavaScript de Mig . Peut être exécuté comme(new System.Linq.M()).m(new[] {1, 2, 3})
. Réussit tous les cas de test, mais ne gère pas les tableaux d'entrée vides.la source
J, 12 octets
La fonction réduit la liste (appelée pliage (
/
) en J) avec l'expression:(signum(x) == signum(y)) * [x,y][abs(x)>abs(y)]
où[x,y][abs(x)>abs(y)]
esty
siabs(x) > abs(y)
autrex
.Exemple:
Essayez-le en ligne ici.
la source
Langue de Game Maker, 489 octets
À propos de la langue de Game Maker
Riffle le tableau (des zéros sont ajoutés) et renvoie la médiane (similaire à mon autre réponse)
la source
32000
la taille maximale de la baie telle que limitée par le logiciel.Java,
353304124 octetsRassemblez le pire langage pour le golf de code avec le pire golfeur du monde et vous obtenez ...
Dégagez-le et vous obtenez:
C'est une fonction (si ce n'était pas sacrément évident) qui reçoit un tableau de nombres et traite ses valeurs, renvoyant la valeur minmod.
Mon vieux benemoth d'une sollution est également inclus, ce qui est un programme entier - comme toujours.
Dégagez-le et vous obtenez:
Reçoit des nombres infinis, s'arrête lorsqu'une valeur non numérique est entrée, présentant la valeur Minmon.
la source
1 2 3
. Vous semblez également ignorer que vous pouvez écrire une fonction qui traite ses arguments plutôt qu'un programme qui lit à partir de stdin.R, 20 caractères
R n'est généralement pas bon pour codegolf, mais je l'utilise pour mon travail, donc je voulais essayer. Avant d'essayer, je ne savais pas que R acceptait une syntaxe aussi sale! :-) 52 caractères :
Ensuite, j'ai regardé les autres réponses que j'ai essayées.
la source
summary
-il? Areq[1]
etq[6]
min et max, respectivement? Dans ce cas, ce n'est pas valide, car vous ne pouvez pas utiliser min / max intégré.Python, 52
Je ne pouvais toujours pas m'empêcher de penser que c'était mauvais d'avoir deux
lambda
s. Cette fonction prend une liste, puis retourne une liste à un élément contenant le résultat.Espérons que cela n'entraînera pas une énorme quantité d'infractions ayant pour résultat une liste à un élément.
la source
Matlab / Octave, 26
Il s'agit essentiellement d'une traduction de la réponse Mathematica par xnor. Il fonctionne en ajoutant un zéro de moins que la longueur du vecteur d'entrée. Notez que l'ajout d'un autre ne fonctionnerait pas, car le résultat serait toujours 0. Merci à MartinBüttner pour les -4 caractères de cette solution =)
la source
@(x)median([0*x,x](2:end))
. Bien qu'il semble que ce soit les mêmes octets que maintenant.Python,
7260 octetsC'est la première solution à laquelle j'ai pensé, et c'est assez naïf. La seconde moitié est essentiellement un double de la première moitié du code, mais je ne savais pas comment l'amincir. Je me demande si cela peut être raccourci en utilisant
eval
...Edit: changé les lambdas en compréhensions.
Essayez-les ici
Cela ne fait que 4 caractères de plus, mais vaut la peine d'être examiné, en utilisant le TIP du Sp3000 .
la source
Javascript, 63
Une version plus lisible:
la source