Für eine weitere Herausforderung, die ich schreibe, muss ich überprüfen, ob Testfälle mit begrenzten ganzen Zahlen lösbar sind. Insbesondere muss ich Folgendes für ein nicht leeres Array von Ganzzahlen A
und eine ganzzahlige Bitbreite überprüfen n
:
- Alle Ganzzahlen
a
inA
erfüllen-2**(n-1) <= a < 2**(n-1)
(darstellbar mitn
-bit zwei Komplement-Ganzzahlen). - Die Länge von
A
ist weniger als2**n
. - Die Summe von
A
erfüllt-2**(n-1) <= sum(A) < 2**(n-1)
. - Alle Kombinationen von Elementen
A
erfüllen alle obigen Bedingungen.
Natürlich habe ich beschlossen, dieses Problem an Sie auszulagern!
Vergewissern Sie sich bei einem gegebenen Array von Ganzzahlen A
und einer positiven Ganzzahlbitbreite n
, dass A
die obigen Bedingungen erfüllt sind.
Testfälle
[0, 0, 0], 2: True
[0, 0, 0, 0], 2: False (violates #2)
[1, 2, 3, 4, 5], 8: True
[1, 2, 3, 4, 5], 2: False (violates all conditions)
[1, 2, 3, 4, 5], 5: True
[-3, 4, 1], 4: True
[10, 0, -10], 4: False (violates #1 and #4)
[27, -59, 20, 6, 10, 53, -21, 16], 8: False (violates #4)
[-34, 56, 41, -4, -14, -54, 30, 38], 16: True
[-38, -1, -11, 127, -35, -47, 28, 89, -8, -12, 77, 55, 75, 75, -80, -22], 7: False (violates #4)
[-123, -85, 6, 121, -5, 12, 52, 31, 64, 0, 6, 101, 128, -72, -123, 12], 12: True
Referenzimplementierung (Python 3)
#!/usr/bin/env python3
from itertools import combinations
from ast import literal_eval
def check_sum(L, n):
return -2**(n-1) <= sum(L) < 2**(n-1)
def check_len(L, n):
return len(L) < 2**n
def check_elems(L, n):
return all(-2**(n-1) <= a < 2**(n-1) for a in L)
A = literal_eval(input())
n = int(input())
OUTPUT_STR = "{}, {}: {}".format(A, n, "{}")
if not (check_elems(A, n) and check_len(A, n) and check_sum(A, n)):
print(OUTPUT_STR.format(False))
exit()
for k in range(1, len(A)):
for b in combinations(A, k):
if not check_sum(b, n):
print(OUTPUT_STR.format(False))
exit()
print(OUTPUT_STR.format(True))
Antworten:
Wolfram Language (Mathematica) , 40 Byte
Probieren Sie es online!
Bedingung 1 wird impliziert, indem Bedingung 3 für alle Teilmengen, einschließlich der Ein-Element-Teilmengen, überprüft wird. Also nehmen wir das Maximum aus
und überprüfe, ob das weniger ist als
2^#2
(wo#2
ist die Bitbreiteneingabe).Auf Kosten von nur 6 mehr Bytes, können wir ersetzen
Subsets@#
mitGatherBy[#,Arg]
, was viel effizienter ist , weil es nur die beiden schlimmsten Fall Teilmengen berechnet: die Teilmenge aller nicht - negative Werte und die Teilmenge aller negativen Werte. (Das funktioniert, weilArg
es einen Wert für0
das erstere undπ
das letztere hat.)quelle
Jelly , 19 Bytes
Probieren Sie es online!
Es genügt zu prüfen, ob
mapped sum of powerset + length of set
der gewünschte Bereich erreicht ist.quelle
ÆẸ
statt2*$
(ungetestet)05AB1E ,
131211 Bytes1 Byte gespart dank Mr. Xcoder
Probieren Sie es online!
Erläuterung
quelle
±
)JavaScript (ES6),
756358 ByteDie Summe aller Teilmengen
a
liegt zwischen den Summen der negativen und der nichtnegativen Elemente. Die Überprüfung der beiden Summen ist also für alle Elemente mit Ausnahme von Fall 2 ausreichend. Bearbeiten: Dank @Arnauld12 bis17 Byte gespeichert.quelle
[-2, -2], 3
das wahr sein sollte, nein?Jelly ,
21 bis20 BytesProbieren Sie es online!
Lineare Zeitkomplexitätslösung. Es stellte sich heraus, dass ich die zeitliche Komplexität überschätzt habe
denn jetzt ist mir klar, dass das Sortieren des Arrays völlig unnötig ist.
Erläuterung:
quelle
~2¦
so;~
. EDIT: Fertig.;~$
wird es funktionieren.JavaScript (ES6), 114 Byte
Übernimmt Eingaben in der Currying-Syntax
(A)(n)
. Gibt einen Booleschen Wert zurück.Testfälle
Code-Snippet anzeigen
quelle
Pyth , 20 Bytes
Probieren Sie es hier aus!
quelle
Clojure,
121117 BytesNun, das war ein bisschen doof. Das Aufteilen in positive und negative Werte ist viel besser als das Sortieren. Originell, aber überraschenderweise nicht mehr lange:
Dies funktioniert, indem die Präfixsummen der Sequenz in aufsteigender und absteigender Reihenfolge überprüft werden. Ich denke, es ist nicht erforderlich, alle Kombinationen von Elementen in zu generieren
A
.(into () S)
ist in der Tat dasselbe wie(reverse S)
, wenn Listen aus dem Kopf wachsen. Ich konnte keinen Weg finden,cons
stattconcat
zwei Listencons
zu verwenden. : /quelle
Gelee , 15 Bytes
Probieren Sie es online!
Erläuterung
1 Byte gespart dank Caird Coinheringaahing (Lesen der zweiten Eingabe von STDIN anstelle von CLA).
quelle
Schale , 14 Bytes
Gehen Sie mit brachialer Gewalt vor, indem Sie alle Unterlisten durchlaufen, da die Aufteilung in positive und negative Teile mehr Bytes erfordert. Probieren Sie es online!
Erläuterung
quelle
Python 2 ,
727170 BytesDie Ausgabe erfolgt über das Vorhandensein / Fehlen eines Fehlers .
Probieren Sie es online!
quelle