Die minmod- Funktion ist eine Variante der bekannten min , die in hangbegrenzenden hochauflösenden Schemata für partielle Differentialgleichungen vorkommt. Bei einer bestimmten Anzahl von Pisten wird die flachste Piste ausgewählt, wobei auf die relativen Zeichen zwischen den Pisten geachtet wird.
Die Funktion akzeptiert eine beliebige Anzahl von Parametern. Dann ist minmod (x 1 , x 2 , ..., x n ) definiert als:
- min (x 1 , x 2 , ..., x n ) , wenn alle x i streng positiv sind
- max (x 1 , x 2 , ..., x n ) , wenn alle x i streng negativ sind
- 0 , sonst.
Wir werden nur Integer-Eingaben berücksichtigen, da dies die Implementierung nicht wirklich beeinflusst und für einige (esoterische) Sprachen umfassender sein sollte.
Schreiben Sie ein Programm oder eine Funktion, die n vorzeichenbehaftete Ganzzahlen (für n> 0 ) über STDIN, ARGV oder Funktionsargument (Sie können ein Array verwenden, wenn dies praktischer als eine variable Funktion ist) akzeptiert und das Ergebnis zurückgibt oder ausgibt (an STDOUT) von minmod (a, b) .
Sie müssen nicht eingebaut in Gebrauch min oder max - Funktionen (und offensichtlich keine eingebaute in minmod entweder, wenn man das tatsächlich finden kann). Darüber hinaus dürfen Sie keine integrierten Sortierfunktionen verwenden, außer zum Sortieren einer festgelegten kleinen Anzahl von Elementen (weniger als 5).
Wenn Ihre Sprache keine vorzeichenbehafteten Typen hat, können Sie einen vorzeichenlosen Typ verwenden und ihn als Zweierkomplement interpretieren . Wenn Ihre Sprache beispielsweise nur vorzeichenlose Bytes verwendet, können Sie 255
für -1
und 128
für -128
usw. einstehen .
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Testfälle
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
Bestenlisten
Das folgende Stack-Snippet generiert sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache. Also, auch wenn Sie mit Ihrer Sprache nicht die gesamte Herausforderung gewinnen können, warum nicht versuchen, einen Platz auf der zweiten Liste zu ergattern?
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# 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>
Antworten:
GolfScript,
109 BytesÜbernimmt die Eingabe von stdin im Format
[-4 -2 -3 -2]
Dies verwendet die eingebaute Sortierfunktion
$
, aber jedes Mal, wenn es aufgerufen wird, ist es auf einem Array von 3 Elementen, was erlaubt ist.Online-Demo
quelle
Mathematica, 19 Bytes
Code und Golfen dank Martin Büttner.
Dies ist eine unbenannte reine Funktion, die eine Liste von Ganzzahlen als Eingabe aufnimmt. Rufe es so auf
oder in ähnlicher Weise als Variable gespeichert.
Der Code riffelt zuerst alle zwei Elemente der Eingabeliste mit einer Null, wodurch
n-1
Nullen zwischen denn
Elementen eingefügt werden. Dann wird der Median benötigt, um die Antwort zu erhalten.Dies gibt min-mod, weil es jeden Fall behandelt:
Alle Zahlen sind positiv, in diesem Fall liegen die Nullen darunter und der Median ist die niedrigste positive Zahl.
Alle Zahlen sind negativ. In diesem Fall liegen die Nullen darüber und der Median ist die am wenigsten negative Zahl.
Es gibt sowohl eine positive als auch eine negative Zahl, und daher ist das mittlere Element eine Null.
Wenn Mathematica seinen Median mit dem linearen Zeitauswahlalgorithmus implementiert , ist dies auch O (n).
quelle
Haskell,
6261393837 Bytesunter Verwendung von Vergleichszauber, der aus @ Zgarbs Antwort * entlehnt wurde, nämlich
x*x<=x*y
.x*x<=x*y
ist nur wahr, wennx
undy
haben das gleiche Vorzeichen undy
der absolute Wert ist größer. beachten Sie, dass , wennx
ist0
es immer wahr ist.Wir stellen fest, dass dies
x
das Ergebnis ist, wenn es in enthalten ists
, und dass für alley
ins
x
dasselbe Vorzeichen wiey
und im absoluten Wert kleiner ist. Wenn kein Werts
diese Definition erfüllt,0
ist das Ergebnis.f
Dann wird nachs
einem Element gesucht , um dies zu erfüllen, und es wird0
als Standard verwendet.* obwohl er es aus den Gründen, aus denen ich es benutze, nicht benutzt hat und es mittlerweile tatsächlich losgeworden ist
quelle
JavaScript (ES6), 39 Byte
quelle
Python 2, 53
Die Idee ist,
reduce
den Min-Mod-Finder mit zwei Eingängen in einenn
-Eingangs -Finder zu verwandeln. Ich habe es unabhängig von den anderen Antworten gefunden, die es verwenden. Nur Python 2 unterstütztreduce
.Die Lösung mit zwei Eingängen ermittelt einfach den Median der beiden Zahlen und Null. In meiner Mathematica-Antwort finden Sie eine direktere Möglichkeit, den Median zu verwenden.
Weniger golfen:
Ein hypothetisches Amalgam von Python 2 und Python 3 wäre ein Zeichen kürzer, mit dem mit Stern gekennzeichneten Zuordnung von Python und 3 sein
input()
undprint
aus Python 2.Alter Code ohne Sortierung:
quelle
Median
.Marbelous, 210 Bytes
Hier werden drei Boards verwendet.
Die
|
Tafel (Ab
in der lesbaren Version) nimmt den absoluten Wert einer Murmel (entweder durch Rückgabe der übergebenen Murmel oder Null minus der übergebenen Murmel, da alle Arithmetik in Marbelous ohne Vorzeichen ist).Die
M
Tafel (Minabs
in der lesbaren Version) findet den ersten oder den zweiten übergebenen Marmor und gibt ihn links aus (je nachdem, welcher Wert einen geringeren absoluten Wert hat).Das
M
Board gibt auch die Murmel frei, die es nach unten statt nach links hält, sobald das letzte Zeichen von STDIN abgerufen wurde.Die
M
Karte wird auf der Hauptkarte verwendet, um die minmod aller überprüften Werte zu einem bestimmten Zeitpunkt zu speichern, da sie den zu speichernden Wert nach links freigibt, der dann wieder in die Karte umgelenkt wird.Mülleimer (
\/
) wurden nur unter Synchronisierern platziert, die andernfalls zu STDIN drucken würden.Eingabe / Ausgabe verwendet STDIN / STDOUT. Beide behandeln 8-Bit-Werte (wenn Sie + 0x30 und + 0x38 übergeben wollten, platzieren Sie diese
08
in STDIN).Bibliotheken und zylindrische Tafeln sind erforderlich. Es wird empfohlen, die Ausgabe als Dezimalzahl anzuzeigen (beachten Sie, dass der vorzeichenlose Wert des minmod-Ergebnisses angezeigt wird).
Teste es hier.
Hinweis: Für weitere menschenfreundliche Eingabe / Ausgabe, fügen Sie
Dp
unter der letzten Zeile der Hauptplatine (vor:M
), ersetzen Sie]]
mitRd
und fügen Sie die folgende an der Unterseite:Dies ändert einfach die Ausgabe auf 3 Dezimalstellen. Ebenso erfordert die Eingabe mit diesen Änderungen eine durch Leerzeichen getrennte Liste mit 3 Dezimalstellen pro Zahl.
Lesbare Version:
quelle
Haskell,
834039 BytesDies ist wahrscheinlich nicht die kürzest mögliche Haskell-Lösung (und wird die anderen hier sicherlich nicht schlagen), aber es ist ein Anfang. EDIT: Jetzt über 50% kürzer! EDIT2: Ein Byte weniger ...
Dies ist nur eine einfache Falte (oder zu reduzieren, da einige Sprachen es nennen) durch den binären Operator
#
, der den Median berechneta
,b
und0
. Obwohl die Regeln es mir jetzt erlauben würden, kleine Listen zu sortieren, erfordert dies einen Import in Haskell und führt zu einer höheren Byteanzahl ( 49 Bytes, aber 31 ohne den Import):quelle
\a-> (signum a,a)
Entspricht dersignum>>=(,)
Verwendung der Funktion monad instance. (siehe meinen Beitrag in "Tipps zum Golfen in Haskell")TIS-100,
696526 BytesErwartet, dass die Sequenz von beendet wird
-999
. TIS-100 ist neuer als diese Frage, aber das ist hier sowieso nicht wichtig.Knoten 9 verfolgt, ob wir alle positiv, alle negativ oder gemischt sind. Die Knoten 5 und 6 ermitteln das Minimum des Absolutwerts aller eingegebenen Zahlen. Der Knoten 10 wählt dann das Minimum, das Minimum negiert oder 0, abhängig vom Zustand des Knotens 9.
quelle
CJam, 20 Bytes (oder 10 Bytes)
Reduzieren Sie bei Verwendung des @ xnor-Ansatzes die Berechnung von minmod von 2 Zahlen gleichzeitig aus dem Array.
Dies wären 19 Bytes gewesen, wenn
:z
gearbeitet hätteVerwenden der neuen Regel zur Verwendung von Sortierungen für kurze Arrays:
Das entspricht genau der Antwort von @ Peter
Vorherige 26 Bytes als Antwort:
Dies kann weiter golfen werden ...
Eingabe (über STDIN) ist das Integer-Array wie folgt:
und output ist das minmod des input-Arrays
Probieren Sie es hier aus
Wenn nur
:g
und:z
funktioniert hätte, wäre dies 4 Bytes kürzer gewesen.quelle
q~_{g}%_|:+\{z\za+_~>=}**
.Java, 84 Bytes
Das ist Java in seiner ganzen Pracht. Schlägt GolfScript um etwas mehr als 900%.
In der Klasse eingewickelt:
Mit Kommentaren erweitert:
Hinweis: Dies kann mit Java 8 verbessert werden.
Hinweis: Die Verbesserung in Java 8 ist fehlgeschlagen.
quelle
J,
2012 BytesFunktion, die die Liste als Argument verwendet. Aus dem Golfscript / CJam / was auch immer gestohlen.
Das minmod von
x
undy
ist der Median (sortiere/:~
und nimm die Mitte1{
) der Liste der drei Elemente0,x,y
. Reduzieren Sie die Liste ( Folding in J-Sprache), indem Sie dieses Minmod zwischen benachbarten Elementen nehmen.Im Einsatz bei der REPL. (J buchstabiert sein negatives Vorzeichen
_
.)Alter Müll, bevor ich bemerkte, dass kurze Sortierungen erlaubt sind:
0:`<.`>.@.(*@]*0<*))/
Das minmod vonx
undy
ist 0 (0:
), wenn 0 größer oder gleich dem Produkt vonx
und isty
, sonst ist es das min (<.
) oder das max (>.
) zwischenx
undy
abhängig vom Vorzeichen . Falten Sie dies über die gesamte Liste.quelle
TI-BASIC, 19 Bytes
Übernimmt die Eingabe im Format
{-2,4,3}
.Funktioniert ähnlich wie die Antwort von xnor:
quelle
median(augment(Ans,0ΔList(Ans
nur acht Bytes schlagen in Listen der Dimension eins fehl.If variance(Ans:augment(Ans,0ΔList(Ans:median(Ans
ist länger als deins. Wenn nur TI-BASIC leere Listen unterstützt ...Python 2,
8279716961 BytesDieses basiert weg von meiner pyth Antwort, die inspiriert wurde Migs Antwort.
Alte Antwort:
Das ist eine sehr lange Antwort.
Ich habe das Gefühl, 2 Variablen zu haben, ist eine Verschwendung ...?Ich lag richtig...? ish? ; pquelle
KDB / Q, 43 Zeichen für die Definition des Funktionskörpers
Dank großartiger Ideen aus früheren Beiträgen:
Geben Sie eine einzelne Nummer mit Enlist ein
Ich bin sicher, dass einige Q-Guru mit kürzeren kommen können.
quelle
{asc[0,x,y]1}/
?Pyth,
25,22,20,12Wahrscheinlich nicht neu, aber original: P
Vorsortierung erlaubt
Pyth
Probieren Sie es online aus.
Die Idee,
reduce
ternäre Aussagen zu verwenden, wurde Migs Antwort schamlos gestohlen , aber ich habe keine Ahnung, ob diese Algorithmen ansonsten sogar ähnlich sind, da ich ternäre Aussagen nicht lesen kann.Erläuterung:
quelle
tQ
.Q
wird auch funktionieren?
für ein*
...C #, 101 Bytes
Mein erster Versuch, Code-Golf zu spielen und in einer ziemlich golffeindlichen Sprache. Basiert auf Reduce (
Aggregate
in LINQ) und ist der JavaScript-Antwort von Mig sehr ähnlich . Kann wie gelaufen werden(new System.Linq.M()).m(new[] {1, 2, 3})
. Besteht alle Testfälle, verarbeitet jedoch keine leeren Eingabearrays.quelle
J, 12 Bytes
Die Funktion reduziert die Liste (genannt folding (
/
) in J) mit dem Ausdruck:(signum(x) == signum(y)) * [x,y][abs(x)>abs(y)]
woher[x,y][abs(x)>abs(y)]
isty
wennabs(x) > abs(y)
sonstx
.Beispiel:
Probieren Sie es hier online aus.
quelle
Game Maker Language, 489 Byte
Über Game Maker Language
Riffelt das Array (Nullen werden angehängt) und gibt den Median zurück (ähnlich wie bei meiner anderen Antwort)
quelle
32000
ist die maximale Größe des Arrays, die von der Software begrenzt wird.Java,
353304124 BytesStellen Sie die schlechteste Sprache für Codegolf mit dem schlechtesten Golfer der Welt zusammen und Sie erhalten ...
Ungolf es und du bekommst:
Dies ist eine Funktion (wenn es nicht ganz offensichtlich war), die ein Array von Zahlen empfängt, deren Werte verarbeitet und den minmod-Wert zurückgibt.
Mein alter Benemoth von einer Sollution ist auch dabei, was - wie immer - ein ganzes Programm ist.
Ungolf es und du bekommst:
Erhält unendlich viele Zahlen, stoppt, wenn ein Wert eingegeben wird, der keine Zahl ist, und zeigt den Minmon-Wert an.
quelle
1 2 3
. Sie scheinen auch zu übersehen, dass Sie eine Funktion schreiben können, die ihre Argumente verarbeitet, anstatt ein Programm, das aus stdin liest.R, 20 Zeichen
R ist normalerweise nicht gut für Codegolf, aber ich benutze es für meine Arbeit, also wollte ich es versuchen. Bevor ich es versuchte, wusste ich nicht, dass R bereit ist, solch eine unsaubere Syntax zu akzeptieren! :-) 52 Zeichen :
Dann habe ich mir die anderen Antworten angesehen, die ich bei xnors genialem Median-Trick ausprobiert habe, was großartig ist!
quelle
summary
das? Sindq[1]
undq[6]
min und max? In diesem Fall ist dies nicht gültig, da Sie das integrierte Minimum / Maximum nicht verwenden können.Python, 52
Ich konnte immer noch nicht anders, als das Gefühl zu haben, dass es schlecht ist, zwei zu haben
lambda
. Diese Funktion nimmt eine Liste auf und gibt dann eine Liste mit einem Element zurück, die das Ergebnis enthält.Es wird hoffentlich keine enorme Beleidigung hervorrufen, das Ergebnis in einer Liste mit einem Element zu haben.
quelle
Matlab / Octave, 26
Dies ist im Grunde nur eine Übersetzung der Mathematica-Antwort von xnor. Es funktioniert, indem eine Null weniger als die Länge des Eingabevektors angehängt wird. Beachten Sie, dass das Anhängen eines weiteren nicht funktioniert, da das Ergebnis die ganze Zeit 0 ist. Danke an MartinBüttner für die -4 Zeichen dieser Lösung =)
quelle
@(x)median([0*x,x](2:end))
. Obwohl es so aussieht, sind es die gleichen Bytes wie jetzt.Python,
72-60BytesDies ist die erste Lösung, an die ich gedacht habe, und sie ist ziemlich naiv. Die zweite Hälfte ist im Grunde ein Duplikat der ersten Hälfte des Codes, aber ich war mir nicht sicher, wie ich ihn verkleinern sollte. Ich frage mich, ob es gekürzt werden kann mit
eval
...Edit: Lambdas zu Verständnis geändert.
Probieren Sie sie hier aus
Dies ist nur 4 Zeichen länger, aber mit dem TIP von Sp3000 immer noch einen Blick wert .
quelle
Javascript, 63
Eine lesbarere Version:
quelle