Definition
Ein Vektor a enthaltend n Elemente werden gesagt, majorize oder dominate eine Vektor b mit n Elementen iff für alle Werte k , so dass 1 ≤ k ≤ n , wobei die Summe des ersten Elements von einer ↓ durch die k - te Element von einer ↓ größer ist als oder gleich der Summe der ersten bis k- ten Elemente von b ↓ , wobei v ↓ den in absteigender Reihenfolge sortierten Vektor v darstellt .
Das ist,
a_1 >= b_1
a_1 + a_2 >= b_1 + b_2
a_1 + a_2 + a_3 >= b_1 + b_2 + b_3
...
a_1 + a_2 + ... + a_n-1 >= b_1 + b_2 + ... + b_n-1
a_1 + a_2 + ... + a_n-1 + a_n >= b_1 + b_2 + ... + b_n-1 + b_n
Dabei werden a und b in absteigender Reihenfolge sortiert.
Für diese Herausforderung verwenden wir eine leichte Verallgemeinerung der Majorisierung: Wir werden sagen, dass eine Liste eine unsortierte Majorisierung einer anderen ist, wenn alle oben genannten Ungleichungen wahr sind, ohne a und b zu sortieren . (Dies ist natürlich mathematisch nutzlos, macht die Herausforderung jedoch interessanter.)
Herausforderung
Bei einer Eingabe von zwei unterschiedlichen Listen a und b von ganzen Zahlen im Bereich von 0 bis 255 (einschließlich) geben beide Listen der Länge n ≥ 1 aus, ob die erste Liste die zweite unsortiert ( a > b ), die zweite unsortiert Majorisiert die erste ( b > a ) oder keine.
Optional können Sie die Länge der beiden Listen als Eingabe festlegen. Die Ausgabe muss immer einer von drei unterschiedlichen Werten sein, aber die Werte selbst können beliebig sein (bitte geben Sie an, welche Werte für a > b , b > a und keine in Ihrer Antwort stehen).
Testfälle für a > b :
[255] [254]
[3,2,1] [3,1,2]
[6,1,5,2,7] [2,5,4,3,7]
Testfälle für b > a :
[9,1] [10,0]
[6,5,4] [7,6,5]
[0,1,1,2,1,2] [0,1,2,1,2,1]
Testfälle ohne Majorisierung:
[200,100] [150,250]
[3,1,4] [2,3,3]
[9,9,9,9,9,0] [8,8,8,8,8,9]
quelle
Antworten:
Jelly ,
1086 Bytes2 Bytes dank @orlp.
2 Bytes dank @Dennis.
Probieren Sie es online!
1
füra>b
,-1
füra<b
,0
für keine Majorisierung.Wenn beide waren
1
und-1
vorhanden (einige kumulativen Summen sind größer, manche kleiner), dann wäre der letzte Schritt erzeugen0
.quelle
ngn / apl, 11 Bytes
Basierend auf der Methode in der Antwort von @Leaky Nun .
Gegeben seien zwei Listen A und B , finden die Differenz zwischen jedem Wert element, oder lassen C = A - B . Dann finden Sie die kumulativen Summen von C und nehmen Sie das Vorzeichen von jedem. Die Summe der eindeutigen Vorzeichenwerte ist das Ergebnis. Wenn A > B ist , ist das Ergebnis 1, wenn A < B ist das Ergebnis -1, und wenn es keine Mehrheit gibt, ist das Ergebnis 0.
Probieren Sie es online aus.
quelle
Julia, 30 Bytes
4 Bytes gespart dank @Dennis!
quelle
a^b=sum(sign(cumsum(a-b))∪0)
spart ein paar Bytes.Python 3.5, 85 Bytes:
Eine anonyme Lambda-Funktion. Gibt zurück,
[True,False]
oba>b
,[False,True]
obb>a
oder[False,False]
ob keines davon wahr ist. Ich hoffe das ist okay.Probieren Sie es online! (Ideone)
quelle
Cheddar ,
118114 BytesGrundsätzlich eine Portierung meiner Gelee-Antwort .
Die Tatsache, dass der Gültigkeitsbereich innerhalb der Funktion unterbrochen ist und die Variable innerhalb der Funktion nicht definiert werden kann, bedeutet, dass ich dies
[xxx].map(i->yyy)[0]
anstelle von tun müsstevar a=xxx;yyy
.Übernimmt das transponierte Array als Eingabe.
quelle
Python 2, 73 Bytes
Teste es auf Ideone .
quelle
Rubin,
7259 BytesGibt
1
füra>b
,-1
füra<b
,0
für keines von beiden zurück.-13 Bytes aus dem Summentrick von @Dennis in ihrer Python-Antwort
Probieren Sie es online!
quelle
Python 2, 59 Bytes
Ausgänge:
1
zuma>b
2
zumb>a
3
für wederDurchläuft die Liste und verfolgt die laufende Summe
t
der Unterschiede. Die Zahl gibt ans
, welche Zeichen als Zwei-Bit-Zahl angesehen wurdenr
: Positive im rechten Bit und negative im linken Bit. Dies geschieht übercmp(t,0)%3
, was gibtt>0
→+1
→ 1t==0
→0
→ 0t<0
→-1
→ 2Wenn Sie
or
dies und den aktuellen Wert von nehmen, werdenr
die 2 Bits mit aktualisiertor
, wobei Nullwerte keine Wirkung haben.quelle
Javascript (mit externer Bibliothek-Enumerable) (123 Bytes)
Link zu lib: https://github.com/mvegh1/Enumerable
Codeerklärung: Vektor a und b übergeben, globale Funktion z erzeugen. z erstellt zunächst ein Array von Ganzzahlen aus 1 für eine Anzahl von a.length. .All überprüft, ob das Prädikat für jedes Mitglied von a wahr ist. Dieses Prädikat besagt, dass Sie a als eine Aufzählung laden, eine Zählung dieser Aufzählung vornehmen müssen, die dem aktuellen Iterationswert des von uns erstellten Bereichs entspricht, und diese zusammenfassen müssen. Überprüfen Sie, ob das> = dieselbe Logik aus Array "b" ist. Also rufen wir z in der Reihenfolge von (a, b) auf und vergleichen dies mit der Reihenfolge von (b, a) ... wenn gleich, geben wir 0 zurück, um anzuzeigen, dass es keinen Major gibt. Andernfalls geben wir 1 zurück, wenn (a, b) wahr ist, andernfalls -1
quelle