Herausforderung: Berechnung einer Delacorte-Zahl in einer beliebigen Sprache durchführen. Kürzester Code gewinnt.
Für eine gegebene quadratische Matrix von verschiedenen ganzen Zahlen 1..n² (mögliche Seitenlänge n mindestens zwischen 3 und 27) ist ihre Delacorte-Zahl die Summe der Produkte gcd (a, b) × distance² (a, b) für jedes einzelne ganzzahliges Paar {a, b}.
Das folgende Beispiel zeigt ein 3 × 3-Quadrat mit einer Delacorte-Zahl von 160.
3 2 9
4 1 8
5 6 7
In diesem Quadrat haben wir 36 verschiedene Paare zu berechnen, zum Beispiel das Paar 4 und 6: gcd (4, 6) × distance ² (4, 6) = 4
Ein weiteres Beispielquadrat zum Testen - es hat eine Delacorte-Nummer von 5957:
10 8 11 14 12
21 4 19 7 9
5 13 23 1 16
18 3 17 2 15
24 22 25 6 20
Die Delacorte-Nummern stammen aus diesem Programmierwettbewerb - siehe dort für weitere Details ... Der Wettbewerb endete im Januar 2015. Es hat großen Spaß gemacht!
Regeln:
Notwendige Zeilenumbrüche zählen als 1 Zeichen. Sie können Ihre Golf-Lösung mit Zeilenumbrüchen veröffentlichen, diese werden jedoch nur bei Bedarf in dieser Sprache gezählt.
Sie können wählen, wie Sie mit Ein- und Ausgaben umgehen möchten, und müssen nicht das erforderliche Framework für Ihre Sprache wie Standard-Includes oder Hauptfunktionsheader zählen. Es zählt nur der tatsächliche Code (einschließlich Verknüpfungen / Alias-Definitionen), wie in diesem C # -Beispiel:
namespace System
{
using Collections.Generic;
using I=Int32; //this complete line counts
class Delacorte
{
static I l(I[]a){return a.Length;} //of course this complete line counts
static void CalculateSquare(int[] a, out int r)
{
r=0;for(I i=l(a);i-->0;)r+=a[i]; //here only this line counts
}
static void Main()
{
int result;
CalculateSquare(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, out result);
Console.Write(result); //should output 140 for the example
Console.ReadKey();
}
}
}
Sie können das Quadrat auch als zweidimensionales Array oder über eine Eingabeaufforderung oder als Zeichenfolge oder einen Standardauflistungstyp eingeben. Ein zweidimensionales Array ist die einzige Möglichkeit, die Seitenlänge des Quadrats nicht selbst berechnen zu müssen.
Eine Unterfunktion für die eigentliche Arbeit ist nicht erforderlich, Sie können den Code auch direkt in Main () einfügen.
Noch mehr Vorbereitungen sind kostenlos möglich, wie hier:
using System;
unsafe class Delacorte
{
static void CalculateSquare(int* a, out int r)
{
r=0;while(*a>0)r+=*a++; //only this line counts
}
static void Main()
{
var input = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; //adding a terminator
int result;
fixed (int* a = &input[0]) //necessary in C#
CalculateSquare(a, out result);
Console.Write(result);
Console.ReadKey();
}
}
Wenn Sie nicht sicher sind, ob Ihre langwierige Vorbereitung im Sinne dieser Regeln ist oder als Betrug bezeichnet werden könnte, fragen Sie einfach :)
using
Beispiel - wenn es verwendet wird, um eine Bibliothek einzuschließen, weil Sie sonst keine Funktion aufrufen könnten, ist es kostenlos. Wenn Sie damit einen kurzen Alias für irgendetwas definieren, zählt die gesamte Anweisung.Antworten:
APL (38)
Dies ist eine Funktion, die eine Matrix als richtiges Argument verwendet:
Erläuterung:
⊂¨⍳⍴Z←⍵
: Speichern Sie die Matrix inZ
. Machen Sie eine Liste aller möglichen Koordinatenpaare inZ
.∘.{
...}⍨
: für jedes Koordinatenpaar, kombiniert mit jedem Koordinatenpaar:+/⊃×⍨⍺-⍵
: Berechnungdistance^2
: subtrahiere das erste Koordinatenpaar vom zweiten, multipliziere beide mit sich selbst und summiere das Ergebnis∨/Z[⍺⍵]
: Holen Sie sich die Nummer inZ
für beide Koordinatenpaare ein und suchen Sie die GCD×
: multiplizieren sie miteinander+/∊
: summiere die Elemente des Ergebnisses davon.5×
: mit 0,5 multiplizieren (da wir jedes Paar ungleich Null zweimal früher gezählt haben)quelle
Mathematica (
838279696766)Vorbereitung
Code
Wenn wir mit Unicode-Zeichen zählen: 62 :
quelle
->
benötigt 2 Zeichen und
1 Zeichen, jedoch->
2 Byte und
3 Byte in UTF-8. Je nach Metrik kann es also länger dauern.Python -
128 112 90 8988Vorbereitung:
Berechnung der Delacorte-Zahl (die Zeile, die zählt):
Ausgabe:
Ergebnis:
quelle
for
Schleifen zu einem einzigen Generator und zu einem einzigen zusammenfassensum
. Sie können auchP(R,R)
in einer Variablen speichern*x,=product(R,R)
, indem Sie die markierte Zuweisung verwenden, um eine Kopie zu erstellen. Noch besser, Sie können es zum vierfachen Produkt machenproduct(R,R,R,R)
und es einfach tunfor j,n,i,m in product(*[R]*4)
.*[R]*4
ist das, wonach ich selbst gesucht habe, aber nicht zur Arbeit kommen konnte.from fractions import gcd as g
das Speichern von Bytes in dem wichtigen Abschnitt tun ?Pyth 43
Diese Antwort könnte mit ziemlicher Sicherheit weiter verfolgt werden. Besonders die Entfernungsberechnung gefällt mir nicht.
Um dies einzurichten, speichern Sie das linearisierte Array in der Variablen J. Sie können dies tun, indem Sie Folgendes schreiben:
Probieren Sie es online aus .
Gibt einen Float aus. Ich halte das für legitim, bitte sag mir, wenn ich gegen eine Regel verstoßen habe :)
Erläuterung:
quelle
CJam, 55
Nimmt die Matrix als STDIN im folgenden Format:
Probieren Sie es hier online aus
quelle
{}
hartcodieren und verwenden , um einen Block zu erstellen , anstatt stdin zu verwenden. Speichern Sie die Matrix auch in einem eindimensionalen Array? Ich denke, Sie können die bereits formatierte Matrix nehmen, siehe die Beispiele des OP. (Ich kenne CJam nicht gut, also nimm das mit einem Körnchen Salz;))q~]
Teil. Das ist kürzer als wenn ich es hart codiere und einen Block benutze (ich denke)