Diese Funktion sollte vier ganzzahligen Eingänge nehmen ( a
, b
, c
, d
) und zurück ein binäres Wort basierend auf welchen Wert das Maximum der vier betragen.
Der Rückgabewert liegt zwischen 1
und 0xF
.
Beispielsweise:
a = 6, b = 77, c = 1, d = 4
Rückgabe 2
(binär 0010
; nur das zweitniedrigste Bit wird entsprechend b
dem einzigen Maximalwert gesetzt)
a = 4, b = 5, c = 10, d = 10
Rückgabe 0xC
(binär 1100
; 3. und 4. niedrigstwertige Bits, die dem Maximalwert entsprechen c
und diesem entsprechen d
)
a = 1, b = 1, c = 1, d = 1
Rückgabe 0xF
(binär 1111
; alle vier Bits gesetzt, da alle Werte gleich dem Maximum sind)
Hier ist eine einfache Implementierung:
int getWord(int a, int b, int c, int d)
{
int max = a;
int word = 1;
if (b > max)
{
max = b;
word = 2;
}
else if (b == max)
{
word |= 2;
}
if (c > max)
{
max = c;
word = 4;
}
else if (c == max)
{
word |= 4;
}
if (d > max)
{
word = 8;
}
else if (d == max)
{
word |= 8;
}
return word;
}
Der Rückgabewert kann eine Zeichenfolge aus Nullen und Einsen, ein Bool / Bit-Vektor oder eine Ganzzahl sein
Antworten:
Gelee , 2 Bytes
Nimmt Eingabe als
[d,c,b,a]
. Gibt eine Liste von Booleschen Werten zurück.Probieren Sie es online aus!
Ṁ
M aximum=
gleich (impliziert, dass das andere Argument das ursprüngliche Argument ist; vektorisiert)quelle
R , 17 Bytes
Probieren Sie es online aus!
Gibt einen Vektor von Booleschen Werten zurück. Da diese Ausgabe bestätigt wurde, ist dies der numerischen Ausgabe vorzuziehen, da diese fast doppelt so lang ist:
R , 33 Bytes
Probieren Sie es online aus!
quelle
APL (Dyalog Unicode) , 4 Byte SBCS
Anonyme stillschweigende Präfixfunktion. Nimmt
[a,b,c,d]
als Argument. Gibt ein bit-boolesches Array zurück. *Probieren Sie es online aus!
⌈/
Macht das Maximum des Arguments=
gleich (vektorisiert)⌽
das Gegenteil des Arguments?* Beachten Sie, dass APL Arrays von Booleschen Werten mit einem Bit pro Wert speichert, sodass dies trotz der Anzeigeform tatsächlich ein 4-Bit-Wort zurückgibt
0 0 1 0
.quelle
Haskell ,
2018 Bytes2 Bytes dank stolzem Haskeller gespart
Probieren Sie es online aus!
quelle
map
statt(<$>)
wäre zwei Bytes kürzer!Perl 6 , 12 Bytes
Probieren Sie es online aus!
Anonymer Codeblock, der eine Liste von Ganzzahlen verwendet und eine Liste von Booleschen Werten zurückgibt. Wenn wir als Zahl zurückkehren müssen, sind es +4 Bytes, mit denen das Innere des Codeblocks umbrochen wird
2:[...]
.Erläuterung:
quelle
Japt, 5
Versuch es!
-4 Bytes dank @Oliver!
-2 Bytes dank @Shaggy!
Die Eingabe ist ein 4-Element-Array im folgenden Format:
Die Ausgabe ist ein Array von Bits.
quelle
rw
Konvertierungen zur("w")
einer Reduzierung führen, indem wiederholt das Maximum erreicht wird. Gleiches gilt fürm¶
die Umstellung aufU.m("===", ...)
. Auf jeden Fall danke für die Tipps!x86-Maschinencode (MMX / SSE1), 26 Byte (4x int16_t)
x86-Maschinencode (SSE4.1), 28 Byte (4x int32_t oder uint32_t)
x86-Maschinencode (SSE2), 24 Byte (4x float32) oder 27B an cvt int32
(Die letzte Version, die int32 in float konvertiert, ist für große Ganzzahlen, die auf denselben float runden, nicht genau. Bei float-Eingaben ist das Runden das Problem des Aufrufers, und diese Funktion funktioniert ordnungsgemäß, wenn keine NaNs vorhanden sind, und identifiziert Floats, die == vergleichen bis zum Maximum. Die Ganzzahlversionen funktionieren für alle Eingaben und behandeln sie als vorzeichenbehaftete 2er-Ergänzung.)
Alle diese Funktionen arbeiten im 16/32/64-Bit-Modus mit demselben Maschinencode.
Eine Stack-Args-Aufrufkonvention würde es ermöglichen, die Args zweimal zu durchlaufen (max zu finden und dann zu vergleichen), was uns möglicherweise eine kleinere Implementierung geben würde, aber ich habe diesen Ansatz nicht ausprobiert.
x86 SIMD hat eine Vektor-> Ganzzahl-Bitmap als einzelnen Befehl (
pmovmskb
odermovmskps
oder pd), daher war dies natürlich, obwohl MMX / SSE-Befehle mindestens 3 Byte lang sind. SSSE3- und spätere Anweisungen sind länger als SSE2, und MMX / SSE1-Anweisungen sind die kürzesten. Verschiedene Versionen vonpmax*
(gepacktes ganzzahliges vertikales Maximum) wurden zu unterschiedlichen Zeiten eingeführt, wobei SSE1 (für mmx-Regs) und SSE2 (für xmm-Regs) nur vorzeichenbehaftete Wörter (16 Bit) und vorzeichenlose Bytes enthielten.(
pshufw
undpmaxsw
auf MMX-Registern sind Katmai Pentium III neu, daher benötigen sie wirklich SSE1, nicht nur das MMX-CPU-Funktionsbit.)Dies kann von C aus aufgerufen werden, wie
unsigned max4_mmx(__m64)
beim i386 System V ABI, der ein__m64
Argument übergibtmm0
. (Nicht x86-64 System V, das geht__m64
inxmm0
!)Wenn es ein
pmovmskw
gäbe, was hätte daspacksswb
und dasand
(3 + 2 Bytes) gespeichert . Wir brauchen nicht,and eax, 0x0f
weilpmovmskb
in einem MMX-Register die oberen Bytes bereits Nullen sind. MMX-Register sind nur 8 Byte breit, sodass 8-Bit-AL alle möglichen Nicht-Null-Bits abdeckt.Wenn wir wüssten, dass unsere Eingaben nicht negativ sind, könnten wir
packsswb mm1, mm0
nicht negativ vorzeichenbehaftete Bytes in den oberen 4 Bytes von erzeugenmm1
, wodurch die Notwendigkeit vonand
After vermieden wirdpmovmskb
. Also 24 Bytes.Das x86-Paket mit vorzeichenbehafteter Sättigung behandelt die Ein- und Ausgabe als vorzeichenbehaftet, sodass das Vorzeichenbit immer erhalten bleibt. ( https://www.felixcloutier.com/x86/packsswb:packssdw ). Unterhaltsame Tatsache: Das x86-Paket mit vorzeichenloser Sättigung behandelt die Eingabe weiterhin als signiert. Dies könnte der Grund sein, warum
PACKUSDW
erst SSE4.1 eingeführt wurde, während die anderen 3 Kombinationen von Größe und Signatur seit MMX / SSE2 existierten.Oder mit 32-Bit-Ganzzahlen in einem XMM-Register (und
pshufd
anstelle vonpshufw
) würde jeder Befehl ein weiteres Präfixbyte benötigen, außer zummovmskps
Ersetzen des Pakets / und. Aberpmaxsd
ichpmaxud
brauche ein zusätzliches Byte ...aufrufbare von C als
unsigned max4_sse4(__m128i);
mit x86-64 System V oder MSVC vectorcall (-Gv
), die beide passieren__m128i
/__m128d
/__m128
args in XMM regs abxmm0
.Wenn wir Eingaben als akzeptieren
float
, können wir SSE1-Anweisungen verwenden. Dasfloat
Format kann einen weiten Bereich von ganzzahligen Werten darstellen ...Oder wenn Sie der Meinung sind, dass dies die Regeln zu weit biegt, beginnen Sie mit einem 3-Byte-
0F 5B C0 cvtdq2ps xmm0, xmm0
Konvertierungsprogramm, das eine 27-Byte-Funktion erstellt, die für alle Ganzzahlen funktioniert, die genau als IEEE-Binär32 dargestellt werden könnenfloat
, sowie für viele Kombinationen von Eingaben, bei denen einige der Eingaben erhalten werden gerundet auf ein Vielfaches von 2, 4, 8 oder was auch immer während der Konvertierung. (Es ist also 1 Byte kleiner als die SSE4.1-Version und funktioniert auf jedem x86-64 mit nur SSE2.)Wenn einer der Float-Eingänge NaN ist, beachten Sie, dass
maxps a,b
genau implementiert(a<b) ? a : b
wird und das Element aus dem 2. Operanden ungeordnet bleibt . Es kann also möglich sein, dass dies mit einer Bitmap ungleich Null zurückkehrt, selbst wenn die Eingabe etwas NaN enthält, je nachdem, wo sie sich befinden.unsigned max4_sse2(__m128);
Kopieren und Mischen mit
pshufd
ist immer noch unsere beste Wahl:shufps dst,src,imm8
Liest die Eingabe für die untere Hälfte vondst
vondst
. Und wir brauchen beide Male ein zerstörungsfreies Kopieren und Mischen, also sind 3-Bytemovhlps
undunpckhps
/ pd beide aus. Wenn wir uns auf ein skalares Maximum beschränken würden, könnten wir diese verwenden, aber es kostet eine weitere Anweisung, vor dem Vergleich zu senden, wenn wir das Maximum nicht in allen Elementen bereits haben.Verwandte: SSE4.1
phminposuw
kann die Position und den Wert des Minimumsuint16_t
in einem XMM-Register finden. Ich denke nicht, dass es ein Gewinn ist, von 65535 zu subtrahieren, um es für max zu verwenden, aber siehe eine SO-Antwort über die Verwendung für max von Bytes oder vorzeichenbehafteten ganzen Zahlen.quelle
Python 3.8 (Vorabversion) , 67 Bytes
Die Lambda-Funktion, die 4 Ganzzahlen akzeptiert, verschiebt das boolesche Ergebnis ihres Vergleichs mit Hilfe des neuen Zuweisungsoperators von Python 3.8 auf den Maximalwert und gibt das bitweise ODER der Ergebnisse zurück
Probieren Sie es online aus!
quelle
Java (JDK) , 78 Byte
Probieren Sie es online aus!
[a,b,c,d]
.quelle
05AB1E ,
32 BytesEingabe als Liste von
[d,c,b,a]
, Ausgabe als Liste von Booleschen Werten.Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
JavaScript (ES6), 30 Byte
Nimmt Eingabe als
([d,c,b,a])
. Gibt 4 Boolesche Werte zurück.Probieren Sie es online aus!
quelle
Ruby ,
3422 BytesNimmt die Eingabe als Array
[d, c, b, a]
und gibt ein Array mit 1s und 0s zurück.Probieren Sie es online aus!
quelle
Python 3 ,
59 Bytes66 BytesProbieren Sie es online aus!
Nimmt die Eingabe als
[a,b,c,d]
und gibt eine Liste von Booleschen Werten aus.Bearbeitet, um eine ordnungsgemäße Funktion zu sein, und dann 2 Byte gespeichert, indem Klammern um die Bedingung entfernt werden.
quelle
1. Python 3.5, 90 Bytes
Nimmt die Folge von Zahlen als Parameter. Gibt "binäre" Zeichenfolge zurück
Beispiel:
Erläuterung
quelle
C # (Visual C # Interactive Compiler) , 26 Byte
Probieren Sie es online aus!
Nimmt Eingaben im Format vor
[d,c,b,a]
. Alle anderen unten nehmen Eingaben als[a,b,c,d]
C # (Visual C # Interactive Compiler) , 35 Byte
Gibt ein zurück
IEnumerable<bool>
.Probieren Sie es online aus!
C # (Visual C # Interactive Compiler) , 39 Byte
Gibt ein zurück
IEnumerable<int>
, das Bits darstellt.Probieren Sie es online aus!
C # (Visual C # Interactive Compiler) , 49 Byte
Druckt eine Binärzeichenfolge nach STDOUT.
Probieren Sie es online aus!
quelle
IEnumerable<bool>
ist akzeptabel.PHP, 54 Bytes
oder
Nehmen Sie Eingaben von Befehlszeilenargumenten entgegen. Laufen Sie mit
-nr
oder probieren Sie sie online aus .quelle
Hier ist eine JS-Version, die als Binärdatei ausgegeben wird
Update: Kürzer mit Join und ohne Lookup:
JavaScript (Node.js) , 42 Byte
Probieren Sie es online aus!
Vorherige, mit Nachschlagen, 49 Bytes
Probieren Sie es online aus!
Zurück, mit reduzieren, 52 Bytes:
Probieren Sie es online aus!
quelle
[0,1][...]
C # (Visual C # Interactive Compiler) , 51 Byte
Probieren Sie es online aus!
Oben ist eine anonyme Funktion, die durch Ändern eines Arguments ausgegeben wird . Die Ausgabe ist ein Array von Einsen und Nullen.
Unten finden Sie eine rekursive Funktion, die eine Ganzzahl ausgibt.
C # (Visual C # Interactive Compiler) , 60 Byte
Probieren Sie es online aus!
Beide Funktionen werden als 4-Element-Array eingegeben.
quelle
Python 2 , 35 Bytes
Probieren Sie es online aus!
Nimmt Eingaben im Format [d, c, b, a] wie bei der akzeptierten Antwort von Adám vor, also denke ich, dass es in Ordnung ist.
Alternative für 41, wenn es nicht ...
Python 2 , 41 Bytes
Probieren Sie es online aus!
quelle
Python 3 , 42 Bytes
Gibt einfach eine Liste zurück, ob das Element das Maximum für jedes Element in der Eingabe ist. -2 Bytes, wenn Sie die
f=
Zuordnung nicht zählen .Probieren Sie es online aus!
quelle
f=
zählt nur in rekursiven FunktionenStapel, 92 Bytes
Nimmt Argumente als Befehlszeilenparameter in umgekehrter Reihenfolge. Funktioniert durch arithmetisches Berechnen des Maximums der Parameter, indem diese reduziert und nur positive Unterschiede zum laufenden Maximum addiert werden. Anschließend wird jeder Parameter erneut zugeordnet und diesmal mit dem Maximum verglichen. Praktischerweise
cmd/cset/a
wird keine neue Zeile ausgegeben, sodass die Ergebnisse automatisch miteinander verknüpft werden. Das%f%
spart einfach 5 Bytes bei einem wiederholten Konstrukt.quelle