Herausforderung
Schreiben Sie eine Funktion oder ein Programm mit einer positiven Dezimalzahl, nennen Sie es A und geben Sie zwei positive Zahlen, B und C , aus, so dass:
- A == B bitxor C
- B und C dürfen in ihrer Dezimaldarstellung keine der Ziffern 0, 3 oder 7 enthalten.
Beispiele
>>> decompose(3)
1, 2
>>> decompose(7)
1, 6
>>> decompose(718)
121, 695
>>> decompose(99997)
2, 99999
>>> decompose(4294967296)
4294968218, 922
>>> decompose(5296080632396965608312971217160142474083606142654386510789497504098664630388377556711796340247136376)
6291484486961499292662848846261496489294168969458648464915998254691295448225881546425551225669515922,
1191982455588299219648819556299554251659915414942295896926425126251962564256469862862114191986258666
Da die Zerlegung nicht eindeutig ist, muss Ihre Funktion / Ihr Programm nicht genau die gleichen Ergebnisse ausgeben wie diese Beispiele.
Sehr detaillierte Regeln
Die Einreichung sollte in Form einer vollständigen Funktion oder eines vollständigen Programms erfolgen .
import
Aussagen noch auf die Endnote zählen.Sie können davon ausgehen, dass der Eingang A immer mindestens eine Ziffer von 0, 3 oder 7 enthält.
Sie können davon ausgehen, dass eine Zerlegung immer existiert.
Sie können BigInt verwenden, wenn sie Teil der Standardbibliotheken der Sprache sind oder über den De-Jure- Paketmanager der Sprache installiert werden können .
Die Funktion sollte schnell sein. Es sollte nicht länger als 20 Sekunden dauern , um auf einem einigermaßen modernen Computer ausgeführt zu werden, wenn eine 100-stellige Zahl eingegeben wird, und nicht länger als 2 Sekunden, wenn eine 10-stellige Zahl eingegeben wird.
Die Funktion / das Programm sollte die Eingabe von mindestens 100 Stellen unterstützen .
- Wenn die Funktion / das Programm nur Ganzzahlen mit bis zu N <100 Stellen unterstützt, wird der Endpunktzahl eine Strafe von + 10 × (100 / N - 1) Bytes auferlegt. Dies soll Golfer ermutigen, einen größeren Zahlenbereich zu unterstützen, auch wenn der Import ausführlich ist.
Die Darstellung von Ein- / Ausgängen unterliegt keiner Einschränkung, solange sie eindeutig dezimal dargestellt werden.
- Die Funktion kann Strings / BigInts ein- und ausgeben, wenn die integrierten Integer-Typen nicht ausreichen.
- Die Eingabe kann vom Funktionsparameter, Befehlszeilenargument oder STDIN stammen.
- Die Funktion kann das Ergebnis zurückgeben oder das Ergebnis direkt an STDOUT ausgeben.
- Ein vorzeichenbehafteter Überlauf in den Ein- / Ausgängen ist jedoch nicht zulässig.
- Ungefähre Antworten werden nicht toleriert, die Ein- / Ausgaben müssen genau sein.
Wertung
Dies ist ein Code-Golf . Kürzeste Lösung in Bytes gewinnen.
Es gibt eine Strafe, wenn das Programm nur Nummern mit weniger als 100 Stellen unterstützt:
- 64-Bit-Ganzzahlen (19 Stellen) = +42 Byte
- 63-Bit-Ganzzahlen (18 Stellen) = +45 Bytes
- 53-Bit-Ganzzahlen (15 Stellen) = +56 Byte
- 31/32-Bit-Ganzzahlen (9 Stellen) = +101 Byte
Antworten:
CJam, 70 Bytes
Probieren Sie es online aus.
Wählt nach dem Zufallsprinzip ganze Zahlen aus, bis eine Übereinstimmung gefunden wird. Dies entspricht kaum der Beschränkung von 20 Sekunden für 64-Bit-Ganzzahlen (unter Verwendung des Java-Interpreters), daher habe ich der tatsächlichen Byteanzahl 42 hinzugefügt.
Beispiellauf
quelle
Common Lisp,
240224183173169 BytesCommon Lisp ist ein bisschen wortreich zum Golfen. Dadurch werden jedoch 100-stellige Zahlen in weniger als einer Sekunde und 200-stellige Ganzzahlen in weniger als zehn Sekunden zerlegt, sodass keine Strafen erforderlich sind. Der Algorithmus ist deterministisch.
Der Zeilenvorschub zwischen den Funktionen dient nur typografischen Zwecken. Testlauf mit der 100-stelligen Referenzeingabe:
Als Bonus füge ich eine Version des Codes hinzu, mit der die Lösung schrittweise von oben nach unten erstellt wird. Es kann eine 1000-stellige Zahl in weniger als zehn Sekunden verwalten, kann aber aufgrund des zusätzlichen Codes nicht im Golfsport mithalten.
quelle
Python 2, 103 + 42 = 145 Bytes
Python unterstützt Bigints von Haus aus, aber dieses Programm überschreitet 20 Sekunden für eine 100-stellige Zahl bei weitem. Es zerlegt jedoch 64-Bit-Ganzzahlen in etwa 2 Sekunden.
quelle
while
Schleife, um weiterhin zufällige Werte auszuprobieren. Sie können die Funktion einfach erneut aufrufen. Ohne die Notwendigkeit einer Steuerstruktur, können Sie dann kollabieren die Funktion einlambda
und ein ternäres:from random import* d=lambda a,b=0:set(`b`+`a^b`)&set(\'037\')and d(a,randint(1,a))or(b,a^b)
. Obwohl Sie vielleicht besser dran sind, wenn Sie keine Funktion verwenden.Python 3 (132 Bytes)
(Dies ist nur zur Anregung besserer Lösungen. Dies ist meine Lösung beim Lösen des ursprünglichen Problems in ASCII-Filmen.)
Obwohl das Verhalten von bitweisem xor im Dezimalsystem ziemlich kompliziert ist, gibt es eine wichtige Beobachtung: Das Ändern der niedrigen Stellen hat keine Auswirkungen auf die hohen Stellen . Daher können wir von oben nach unten arbeiten: Versuchen Sie, die oberen Ziffern von 0, 3, 7 freizumachen, und arbeiten Sie dann an der nächsten Ziffer, bis die ganze Zahl berechnet ist. Dies ermöglicht es uns, in linearer Zeit zu arbeiten. Die Verarbeitung einer tausendstelligen Zahl kann dann in weniger als 1 Sekunde abgeschlossen sein. (Die Common Lisp-Lösung verwendet auch die gleiche Technik, die ich glaube.)
quelle
997^8 == 1005
. Ich denke, dass es hier einen Kern einer Idee gibt, aber es ist nicht offensichtlich.{1,2,4,5,6,8,9}
, gibt es einige davon, die die hohen Stellen nicht beeinflussen. (zB997^2 == 999
). Die innerewhile
Schleife macht die Erschöpfung, um die Wahl zu finden, die die hohen Ziffern gültig hält.