Sie erhalten den Namen eines der 20 größten Objekte im Sonnensystem. Ihre Aufgabe ist es, eine Annäherung des Radius in Kilometern zurückzugeben.
Dies ist eine Code-Herausforderung, bei der Ihre Punktzahl aus der Länge Ihres Codes (in Bytes) multipliziert mit einem Strafmaß , basierend auf Ihrer schlechtesten Annäherung, besteht. Daher gewinnt die niedrigste Punktzahl .
"As we travel the universe" ist die letzte Zeile des Songs Planet Caravan von Black Sabbath , der später auch von Pantera gedeckt wurde .
Das Sonnensystem Objekte
Quelle: Wikipedia
NB: Der Rang wird nur zu Informationszwecken angegeben. Die Eingabe ist der Name des Objekts.
n | Object | Radius (km)
----+----------+-------------
1 | Sun | 696342
2 | Jupiter | 69911
3 | Saturn | 58232
4 | Uranus | 25362
5 | Neptune | 24622
6 | Earth | 6371
7 | Venus | 6052
8 | Mars | 3390
9 | Ganymede | 2634
10 | Titan | 2575
11 | Mercury | 2440
12 | Callisto | 2410
13 | Io | 1822
14 | Moon | 1737
15 | Europa | 1561
16 | Triton | 1353
17 | Pluto | 1186
18 | Eris | 1163
19 | Haumea | 816
20 | Titania | 788
Oder als Copy-Paste-Friendly-Listen:
'Sun', 'Jupiter', 'Saturn', 'Uranus', 'Neptune', 'Earth', 'Venus', 'Mars', 'Ganymede', 'Titan', 'Mercury', 'Callisto', 'Io', 'Moon', 'Europa', 'Triton', 'Pluto', 'Eris', 'Haumea', 'Titania'
696342, 69911, 58232, 25362, 24622, 6371, 6052, 3390, 2634, 2575, 2440, 2410, 1822, 1737, 1561, 1353, 1186, 1163, 816, 788
Ihr Ergebnis
Sei der erwartete Radius des -Objekts und sei die Antwort Ihres Programms für dieses Objekt.
Dann ist Ihre Punktzahl definiert als:
Wobei die Länge Ihres Codes in Bytes ist.
Beispiel:
Wenn die Größe Ihres Codes Bytes beträgt und Ihre schlechteste Annäherung auf dem Mond mit einem geschätzten Radius von km anstelle von km erfolgt, lautet Ihre Punktzahl:
Je niedriger, desto besser.
Empfohlener Header für Ihre Antwort:
Language, 100 bytes, score = 302
Mit diesem Skript können Sie Ihre Punktzahl berechnen (erste Zeile = Codelänge, nächste 20 Zeilen = Ihre Ausgaben, von Sun bis Titania).
Regeln
- Sie können den Namen des Objekts entweder in Kleinbuchstaben, in Großbuchstaben oder genau wie oben beschrieben (Titelbuchstaben) eingeben. Andere Mischfälle sind nicht zulässig.
- Die Eingabe ist garantiert einer der 20 möglichen Namen.
- Sie können entweder Ganzzahlen oder Gleitkommazahlen zurückgeben. In beiden Fällen muss die Strafe direkt mit diesen Werten berechnet werden (nicht gerundete Werte bei Floats).
- Sie müssen positive Werte zurückgeben.
- Leere Programme sind nicht erlaubt.
quelle
7512
für alle Testfälle. Ich werde sehen, ob ich bald eine MathGolf-Lösung entwickeln werde, aber es wird schwer sein, 05AB1E zu schlagen.Antworten:
PowerShell , 3 Bytes, Punktzahl 3637
Probieren Sie es online!
Sehr naiv, langweilig, Umsetzung; Gibt einfach zurück,
20000
unabhängig von der Eingabe. Experimente mit Dingen wie der speziellen Verschalung der Sonne oder der Verwendung von Gleitkommawerten2
führten zu schlechteren Ergebnissen, da die Codelänge so lang wurde, dass etwaige Zuwächse im Größenvergleich ausgeglichen wurden.quelle
Jelly , 34 Bytes, Score = 37
Die Eingabe erfolgt in Großbuchstaben, die Ausgabe ist die Potenz von 1,1 mit dem geringsten Fehler.
Probieren Sie es online!
Wie es funktioniert
quelle
Java (JDK) , 90 Bytes, Score = 97
Probieren Sie es online!
Credits
String
anstatt sie in einem explizitenint
Array fest zu codieren .quelle
(...-7)
: Das nicht druckbare Zeichen(char)0
ist leer, also musste ich etwas hinzufügen. I zuerst versucht9
und8
einstelligen Bereich zu sein, aber9
habe natürlich auch Tabs, die mehr\t
(2 Bytes jeweils) und8
gab eine Fehlermeldung über ein unescaped Zeichen verwendet.*100-700
die Werte als Zeichenfolge und diese beiden Zahlen ausdehnte und mit ihnen spielte. Dies sind jedoch die besten Werte. Einige Werte können das Byte verringern zählen, aber dann bleibt die Punktzahl gleich. Also machte zufälliges Aufspüren (eines von) den besten Fall;)Wolfram-Sprache
114 103 97 88 8682 Bytes. Ergebnis =114 103 97 89 8783 PunkteMindestens 6 Punkte gespart dank
Dennis
, mehrere danklirtosiast
und 6 dankuser202729
.Obwohl Mathematica Sonnensystemdaten (sowie viele zusätzliche astronomische Daten) abrufen kann, sind einige geringfügige Änderungen erforderlich, wie unten erläutert.
Interpreter[#,"AstronomicalObject"]&
Gibt die Entität (dh das rechnergesteuerte Objekt) zurück, die dem durch dargestellten Begriff zugeordnet ist#
.EntityValue[AstronomicalObject[],"Radius"]
Gibt den Radius des Objekts in Meilen zurück. Im Fall von "Haumea" wird der Wert 816,27 (dh 507 * 1,61) zurückgegeben.Multiplikation des Radius durch
1.61
Umrechnung von Meilen in km. Dezimalwerte und nicht ganze Zahlen sind selbst im extremsten Fall für einen Fehler von weniger als 1% verantwortlich.[[1]]
Gibt die Größe ohne die Einheit zurück, km. Dies wurde später geändert#&@@
und ergab das gleiche Ergebnis.quelle
Python 3 , Punktzahl 95, 95 Bytes
Probieren Sie es online!
Python 3 , Punktzahl 133, 133 Bytes
Probieren Sie es online!
quelle
Powershell,
150141 Bytes,163153 PunkteProbieren Sie es online!
Testskript:
Ausgabe:
Erläuterung:
end of line mode
ist nur LF.Beispiel:
Powershell, 178 Bytes, 178 Punkte
quelle
05AB1E , Ergebnis
1006660 (1006156 Bytes )Port von @ OlivierGrégoires Java-Antwort . Wenn Ihnen diese erste Antwort gefällt, sollten Sie ihn ebenfalls bewerten!
Eingabe in Titelzeile.
Überprüfen Sie alle Testfälle.
05AB1E , 100 Punkte (100 Bytes )
Eingabe in Kleinbuchstaben. Gibt den genauen Radius aus, sodass keine Strafe hinzugefügt wird.
Überprüfen Sie alle Testfälle.
Erläuterung:
Sehen Sie sich meinen Tipp 05AB1E an (Abschnitte So komprimieren Sie große Ganzzahlen? Und So komprimieren Sie Zeichenfolgen, die nicht Teil des Wörterbuchs sind? ) , Um zu verstehen, wie die verwendete Komprimierung funktioniert.
Ich habe eine 70-Byte-Alternative erstellt, auf die die Sonne600,000
abgebildet wird. [Jupiter, Saturn] zu60,000
; [Uranus, Neptun] zu30,000
; [Erde, Venus] zu6,000
; [Mars, Ganymed, Titan, Quecksilber, Callisto] zu3,000
; [io, Mond, Europa, Triton, Pluto, Eris] zu1,500
; und [haumea; titania] zu750
. Leider hat das eine Punktzahl von 117. Ich werde später sehen, ob ich mit einem alternativen Ansatz unter 100 kommen kann.quelle
Mathematica, 57 Bytes, Score =
6258-4 Bytes / Score dank Lirtosiast !
Führt einfach eine Wolfram Alpha-Suche für den mittleren Radius durch.
quelle
WolframAlpha
Funktion verwendet wurde , um mindestens vier mal ...Jelly , 28 Bytes, Score = 31
Hierfür wird ein konfigurierbares Hashing verwendet, das ich auf Vorschlag von @ lirtosiast zu Jelly hinzugefügt habe.
Die Eingabe erfolgt in der Titelzeile, die Ausgabe ist die Potenz von 1,1 mit dem geringsten Fehler.
Probieren Sie es online!
Wie es funktioniert
Diese Antwort besteht nur aus zwei Teilen.
“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘ḥ
verwendet das neue integrierte in jedem der 20 möglichen Eingaben zu 15 verschiedene ganze Zahlen abzubilden.1.1*
hebt 1.1 auf die berechnete Leistung.“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘
ist ein wörtliches; Jedes nicht in Anführungszeichen gesetzte Zeichen wird in Jellys Codepage durch einen 0-basierten Index ersetzt. Dies ergibt .Das integrierte Hashing[95,95,169,55,242] 1 376510639244
ḥ
ordnet zunächst einer Ganzzahl zu, indem es jede Zahl inkrementiert, das Ergebnis dann als Ganzzahl auf der Basis der bijektiven 250-stelligen Zahl behandelt und addiert . Dies ergibt .Indem Sie diese Ganzzahl halbieren und auf , erhalten Sie die Sequenz mit den Vorwärtsdifferenzen .0 [376510639244,188255319622,94127659811,47063829905,…,5,2,1,0] [188255319622,94127659811,47063829906,…,3,1,1]
Als Nächstes generieren wir 64 64-Bit-Ganzzahlen, indem wir SHAKE256-4096 auf die Zeichenfolgendarstellung der internen Darstellung des
ḥ
rechten Arguments anwenden und dann die resultierenden 4096 Bits in 64 64-Bit- Blöcke zerlegen .ḥ
Berechnet nun das Skalarprodukt der 39 Differenzen und der ersten 39 generierten 64-Bit-Ganzzahlen, Modulo . Dies ergibt eine ganze Zahl in .Die Liste hat die Länge 15, also multiplizieren wir die generierte Ganzzahl mit 15 und nehmen die 64 höher Bits des Ergebnisses. Dies ergibt eine ganze Zahl in , mit der wir die Liste indizieren.[82,85,117,141,78,77,92,115,79,83,74,106,91,70,76] [0,15)
Um die passende Hash-Konfiguration zu finden, habe ich in C einen Brute-Forcer verwendet, der Teil des Jelly Repo ist .
quelle
Python 2 , 155 Bytes, Score = 155
Probieren Sie es online!
Überraschend gut für diese faule Lösung ... wird sich auch um die Verbesserung kümmern. ;-)
quelle
Japt , 86 Bytes, Score = 94
Probieren Sie es für alle Eingaben aus , berechnen Sie die Punktzahl oder überprüfen Sie den höchsten Fehler
Sehr ähnlich zu Oliviers ursprünglicher Antwort. Die Eingabe erfolgt in Kleinbuchstaben.
Nach verschiedenen Verbesserungen der Ausgangswerte liegt der derzeit höchste Fehler bei Venus mit etwas mehr als 4%.
Erklärung jetzt, da die Dinge ein bisschen stabiler sind:
Die Zeichenfolge für die Namen wird
sujusaurneeavemagatimecaiomoeutrplerha
mithilfe der in Japt integrierten Komprimierung komprimiert. Die Zahlen, die die Radien darstellen, werden wie folgt berechnet:quelle
Japt,
777675 Bytes, Score = 75Erstmal vorbei; Ich wollte eine 0-Straflösung ausprobieren, um mir eine Ausgangsbasis für die Abarbeitung zu geben. Werde morgen darauf zurückkommen, um zu sehen, welche Verbesserungen vorgenommen werden können, hoffentlich noch für 0 Strafpunkte.
Bei der Eingabe wird die Groß- und Kleinschreibung nicht berücksichtigt.
Probieren Sie es aus oder testen Sie alle Eingaben
Das
"..."
stellt eine Zeichenfolge dar, die viele nicht druckbare Elemente enthält. Die Codepunkte sind:Eine kurze Erklärung: Die Zeichenfolge wird in Stücke von 2 Zeichen aufgeteilt. Anschließend indizieren wir dieses Array mit einem Teil der ovs-Formel plus Indexumbruch und ordnen die beiden Zeichen ihren Codepunkten zu.
54 Bytes, Score = 58
Ein Port von Oliviers Lösung .
Testen Sie alle Eingänge
quelle
%24
Ruby , 105 Bytes, Ergebnis 109
Probieren Sie es online!
Wenn wir 700000 durch die Radien dividieren, erhalten wir eine Sequenz, die einigermaßen linear (wenn auch ziemlich unregelmäßig) ansteigt. Die Inkremente in der folgenden Tabelle können durch die ASCII-Werte von Zeichen angenähert werden. Das Problem bei diesem Ansatz ist, dass die Eingabe auf einen Wert dekodiert werden muss, der die verschiedenen Namen nach Größe sortiert.
Ein kleines Problem ist, dass der Unterschied zwischen Eris und Haumea ziemlich groß ist. Drei Zeichen
~~d
sind erforderlich, um dieses Inkrement nur im ASCII-Format zu codieren. Die Planet-zu-Index-Zeichenfolge enthält zwei "Geisterplaneten" -Lücken, um den Index aufzufüllen.quelle
T-SQL,
203 202 201196 Bytes, Score =217 216 212208Zeilenumbrüche dienen nur der Lesbarkeit.
Die Eingabe erfolgt über bereits vorhandene Tabelle entnommen i mit Varchar - Spalte v , je unseren IO - Standards .
Verbindet die Eingabetabelle mit einer In-Memory-Tabelle für die ersten beiden Zeichen und gibt die verbleibenden Stellen x100 zurück.
Behandelt "Titan" als Sonderfall mit
IIF
.BEARBEITEN : 1 Byte (und 1 Punkt) wurde gespeichert, indem
STUFF
die ersten beiden Zeichen anstelle von gelöscht wurdenSUBSTRING
. Danke, t-clausen.dk!EDIT 2 : Ich wollte sehen, was passieren würde, wenn ich versuchen würde, ein weiteres Byte zu speichern, indem ich jeden Suchwert mit 99 anstatt mit 100 multipliziere, und stellte zu meiner Überraschung fest, dass dies tatsächlich die Genauigkeit (der ungenauesten Schätzung) erhöht !
Dies führte mich zu einigen Testversuchen und einigen ausgefallenen Excel-Was-wäre-wenn-Datentabellen, in denen ich mit einem Multiplikator von 89 (der natürlich alle meine gespeicherten Werte änderte) eine optimale Lösung fand .
Das spart mir zwar nur ein Byte, verbessert aber meine Punktzahl gegenüber meiner vorherigen Lösung um 4,6 .
EDIT 3 : Suche höher statt niedriger und finde einen noch besseren Multiplikationsfaktor, 198 . Die Werte bleiben ziemlich genau, während die gespeicherte Zeichenfolge um einige Zeichen gekürzt wird, was meine Punktzahl verbessert.
quelle
PowerShell , 203 Byte, Punktzahl 203
Probieren Sie es online!
Sehr ähnlich zu Oliviers Antwort, jetzt, da ich es sehe, aber unabhängig entwickelt.
quelle
Kohle , 101 Bytes, Score = 101
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Nehmen Sie das 1. und 11. Zeichen (zyklisch) der Eingabezeichenfolge und verketten Sie sie.
Schlagen Sie sie in der Zeichenfolge nach,
SuJiSrUuNtEEVVMrGnTTMcClIIMoEpToPPEiHeTa
die in Zeichenpaare aufgeteilt ist.Teilen Sie die Zeichenfolge
m.w'fv&J|\"l|\"e1 c& _c Ca ;e ;* 9a 9C 31 2; 0I .7 ,N ,7 (X (<
in Gruppen von drei Zeichen und nehmen Sie die entsprechende Gruppe.Dekodieren Sie das Ergebnis als Basis-95-Zahl unter Verwendung des druckbaren ASCII-Zeichensatzes als Ziffern. Beispiel:
Io
Das 11. Zeichen von istI
, also schauen wir nachII
und finden, dass es das 13. größte Objekt ist und seine Größe31
der Abbildung entspricht19 * 95 + 17 = 1822
.quelle
Swift 4 , 225 Bytes, Score = 241
Wahrscheinlich ein paar mehr Golf (vielleicht im "Ga-Me-Ca" -Bereich?), Aber Swift wird nicht oft verwendet (vielleicht aus einem Grund.)
und ungolfed
Probieren Sie es online!
Ich habe verschiedene "Schlüsselgrößen" für die Karte ausprobiert, aber natürlich hat 1 viele Konflikte und die Verwendung von drei Zeichen ergibt keine
i=="Titan" ?2575:
17 Zeichen für mich , da es "Io" zum Verwalten gibt (und mehr als 3 Zeichen benötigt werden, Ich denke).quelle
JavaScript (ES6), 152 Byte, Score = 163
Nun, es ist eine hübsche Standardlösung, aber ich habe die Herausforderung trotzdem genossen!
Meine Punktzahl:
Probieren Sie es online!
quelle
FALSE , 152 Bytes, Score = 563
Faule Antwort mit Wortlängen und Anfangsbuchstaben, aber meine Entschuldigung ist, dass ich eine seltsame Sprache verwende
Probieren Sie es online! (Kopieren, Code einfügen, Show drücken und dann ausführen)
Meine Ergebnisse:
quelle
C (gcc) , 118 Bytes, Score = 135
Probieren Sie es online!
Wertung
Heruntergewirtschaftet
Der Objektname wird durch den umständlichen Vorgang in einen einstelligen Hash umgewandelt
deren Aufblähung auf "Titan" / "Titania" als Haupttäter hindeutet. Das Einbeziehen des letzten Zeichens in den Hash wurde berücksichtigt, dies erfordert jedoch weiterhin ein
strlen()
in C. Das erste Vorkommen des Hashzeichens wird in der Hash- / Datenzeichenfolge gesucht. Wenn es gefunden wird, wird das nächste Zeichen verwendet, um den Radius des betreffenden Objekts zu approximieren.Das Datenzeichen enthält den verschobenen, skalierten natürlichen Logarithmus des Radius. So generiert:
Die Skala wurde durch hochgradig wissenschaftliches Ausprobieren und Verschieben des Werts innerhalb des druckbaren ASCII-Bereichs unter Vermeidung von Backslashes ausgewählt. Einige Neuanordnungen der Objekte in der Zeichenfolge waren aufgrund einiger Hash- / Datenkollisionen erforderlich.
quelle
Python 2 , 89 Bytes, Score = 234
Probieren Sie es online!
Die meisten Antworten scheinen eine "Kodierungs- / Dekodierungs" -Strategie verwendet zu haben. Ich fragte mich, wie gut ich den Durchmesser von Himmelskörpern mit einer einfachen Gleichung abschätzen könnte. Es war eine unterhaltsame Übung, aber die moderaten Byteeinsparungen werden durch die Genauigkeitsstrafe mehr als wettgemacht.
Der Kern dieser Lösung ist die Schätzgleichung:
Dabei ist x die doppelte Rangordnung des Radius des Körpers.
Ich generiere den Wert von x basierend auf der Eingabezeichenfolge mit einer Modifikation der Python 2-Lösung von @Erik the Outgolfer. Ich habe ein paar Bytes in seinem Code gespart, indem ich meine Gleichungen neu formuliert habe, um mit [2..40] anstatt mit [1..20] zu arbeiten.
Der Code zum Erzeugen von Rangfolgen belegt mehr als 2/3 der Bytes der gesamten Lösung. Wenn jemand eine kompaktere Art der Ranggenerierung hat, könnte diese Lösung weiter verkürzt werden. Aufgrund des Genauigkeitsnachteils (ca. 2,6) würde sich die Punktzahl erheblich verbessern.
Die Gleichung erzeugen
Ich habe statistische Methoden verwendet, um nach einfachen Gleichungen zu suchen, um die Größe jedes Körpers basierend auf seinem Rang zu schätzen. Zum Teil verfolgte ich die Erkenntnisse in der Ruby-Lösung von @Level River St. und verallgemeinerte sie.
In R verwendete ich lineare Modelle für das Protokoll der Radien, um anfängliche Schätzungen zu erstellen, und verwendete dann die nichtlineare Optimierung, wobei die Optimierung mit den Ergebnissen der linearen Modelle verknüpft wurde, um nach Lösungen zu suchen, die die in der angegebenen Straffunktion minimierten Problem.
Der geschätzte Wert von A in der obigen Gleichung ist siebenstellig, daher habe ich nach einem einfachen Ausdruck gesucht, um ein paar Bytes zu sparen. Ich habe nach Ausdrücken der Form gesucht
für zweistellige x- und 1-stellige y-Werte (für insgesamt fünf Bytes, wobei zwei Bytes oder etwa fünf Punkte unter Berücksichtigung der Strafe gespart wurden), die sich nicht zu stark vom optimalen Wert von A unterschieden und die Strafe nicht sehr aufblähten, und endeten up with the (sonst unerklärlich):
quelle
TI-BASIC (TI-84), 285 Bytes, Score = 285
Ein einfaches Programm "Index in String to List". Kann weiter golfen werden.
Die Eingabe erfolgt in
Ans
Großbuchstaben und ist einer der Namen der Objekte.Die Ausgabe erfolgt in
Ans
und wird automatisch ausgedruckt.Beispiel:
Erläuterung:
(Radienliste und Namenszeichenfolge wurden der Kürze halber gekürzt. Wird
...
verwendet, um den Rest der Liste / Zeichenfolge anzugeben.)Visuelles Modell:
quelle