Einführung
Ich möchte eine Leiter bauen. Dafür habe ich zwei lange Bretter mit Löchern aus dem Schrottplatz geputzt, und ich möchte die Stufen in diese Löcher legen. Die Löcher sind jedoch nicht gleichmäßig platziert, so dass die Stufen ein wenig wackelig werden und ich es schwierig finde, die Menge an Ruten abzuschätzen, die ich für sie benötige. Ihre Aufgabe ist es, die Berechnungen für mich zu machen.
Eingang
Ihre Eingabe besteht aus zwei Bitvektoren, die als Arrays von Ganzzahlen angegeben werden und die zwei Karten darstellen. A 0
repräsentiert ein Segment von einem Aud ( willkürliche Entfernungseinheit ) ohne ein Loch, und a 1
repräsentiert ein Segment von einem Aud mit einem einzelnen Loch. Die Arrays können unterschiedlich lang sein und eine unterschiedliche Anzahl von 1
s enthalten, sie sind jedoch nicht leer.
Ich werde meine Leiter wie folgt aufbauen. Zuerst platziere ich die beiden Platinen genau einen Aud auseinander und richte ihre linken Enden aus. Für jeden Index messe i
ich den Abstand zwischen dem i
Loch der ersten Platte und dem i
Loch der zweiten Platte, schneide ein Stück Stab ab und befestige es zwischen den beiden Löchern. Ich höre auf, sobald mir die Löcher in einem der Bretter ausgehen.
Ausgabe
Ihre Ausgabe ist die Gesamtmenge der Stange, die ich für die Schritte benötige, gemessen in Audits. Die Ausgabe sollte auf mindestens sechs Stellen genau sein.
Beispiel
Betrachten Sie die Eingänge [0,1,1,0,1,1,1,1,0,0]
und [1,0,0,1,1,1,0,0,1]
. Die resultierende Leiter sieht folgendermaßen aus:
Die Gesamtlänge der Stange in dieser Leiter beträgt 7.06449510224598
auds.
Regeln
Sie können entweder eine Funktion oder ein vollständiges Programm schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Testfälle
[0] [0] -> 0.0
[0] [1,0] -> 0.0
[1,0,0] [1,1,1,1,1] -> 1.0
[0,1,0,1] [1,0,0,1] -> 2.414213562373095
[0,1,1,0,1,1,1,1,0,0] [1,0,0,1,1,1,0,0,1] -> 7.06449510224598
[1,1,1,1,1] [0,0,1,1,0,1,0,0,1] -> 12.733433128760744
[0,0,0,1,0,1,1,0,0,0,1,1,1,0,0,1,0,1,1,0,0,0,1,0] [0,0,1,1,0,1,1,1,0,0,0,0,0,1,1,0,1,1,0,0,0,1] -> 20.38177416534678
Antworten:
J, 20 Bytes
Es nutzt den Trick in MickyT Antwort in R .
(<0 1)|:
Gibt die Diagonale einer Matrix an. Für die Erklärungen der anderen Teile siehe die Antwort von FUZxxl .quelle
J, 22 Zeichen
Nicht durch die Antwort von Randomra inspiriert. Der
I.
Teil ist gleich, da dies der unmittelbar offensichtliche Weg ist, die Löcher zu finden.I. y
- Alle Indizes von werdeny
so oft wiederholt wie der entsprechende Punkt vony
. Wenny
übrigens ein Vektor von Booleschen Werten ist,I. y
enthält er die Indizes, bei deneny
ist1
. Zum Beispiel,I. 1 0 0 1 1 1 0 0 1
Erträge0 3 4 5 8
.x u&v y
- das gleiche wie(v x) u (v y)
. Angewandt alsx u&I. y
bekommen wir(I. x) u (I. y)
. Fahren wir mit der transformierten Eingabe fort.x <.&# y
- die geringere der Längen vonx
undy
.x -/@,: y
- die Differenz der Posten vonx
undy
. Wenn ein Vektor länger ist, wird er mit Nullen aufgefüllt.x $ y
-y
in die von angegebene Form gebrachtx
. Insbesondere wennx
es sich um einen Skalar handelt, werdenx
Elemente aus entnommeny
. Stellen Sie bei dieser Verwendungx (<.&# $ -/@,:) y
sicher, dass nachgestellte Löcher ignoriert werden.4 o. y
- die Funktion%: 1 + *: y
, das heißt, sqrt (1 + y ²). Übrigens bildet diese Funktion vom Lochabstand zur Länge der Stangen ab.+/ y
- die Summe der Elemente vony
.quelle
Python, 85
Dies stellte sich ähnlich wie bei der Mac-Lösung heraus . Konvertieren Sie die Listen der Nullen und Einsen in geordnete Listen der Ein-Indizes und addieren Sie dann den Abstand zwischen den jeweiligen Elementen.
quelle
J
3228 BytesDas Verb
I.
gibt die Positionen von1
s in einer Binärzeichenfolge zurück, was eine große Hilfe darstellt.Für eine bessere J-Lösung überprüfen Sie die Antwort von FUZxxl .
quelle
R 67
Verwendet Outer, um einen Unterschied für indizierte Löcher zu machen. Diag gibt die erforderlichen Differenzen zurück. Summieren Sie dann die berechneten Entfernungen
Probelauf in R Fiddle. Ich habe es in einen Druck eingewickelt, um zu zeigen, dass die Rücksendung den Spezifikationen entspricht.
quelle
a==1
kanna>0
oder sein!!a
.Haskell,
7773 BytesVerwendung:
[0,1,0,1] # [1,0,0,1]
welche Ausgänge2.414213562373095
So funktioniert es: Die Funktion
r
liefert eine Liste der Positionen der Löcher einer Platine, zBr [0,1,0,1]
->[2,4]
.#
Zippt zwei dieser Listen und wandelt sie in eine Liste mit Abständen zwischen den entsprechenden Löchern um und summiert sie schließlich.quelle
CJam,
3633 BytesSehr naiver Ansatz ... es erwartet die Eingabe als Arrays im CJam-Stil auf STDIN
Hier ist ein Testkabelbaum für alle Beispieleingaben. Die Ergebnisse im Eingabefeld werden verwendet, bevor der eigentliche Code aufgerufen wird. Sie können sie entfernen, wenn Sie mir nicht vertrauen. ;)
Erläuterung
quelle
Python, 86
Eine einfache und naive rekursive Lösung ohne Listensuche.
Die Eingabelisten sind
a
undb
. Wenn eine leer ist, kehre zurück0
.Andernfalls lassen Sie
x
undy
seien Sie ihre ersten Elemente (der Code weist diese nicht tatsächlich zu, weil Sie Zuweisungen in a nicht ausführen könnenlambda
, aber es erleichtert das Erklären). Wenn beide 1 sind, dh ihr Produkt 1 ist, tragen sie zum Stababstand bei. Wir verfolgen die Entfernung in der komplexen Zahli
, so dass die Entfernung der absolute Wert ist. Tatsächlich berechnen wir es unabhängig davon und multiplizieren es dann mitx*y
.Dann rekursieren wir. Die Idee ist, beide Listen um einen Schritt zu verschieben, es sei denn, eine Liste beginnt mit einer 0 und die andere mit einer Eins. In diesem Fall verschieben wir nur die 0-Liste. Auf diese Weise werden Einsen immer paarweise konsumiert. Wir könnten diese Bedingungen mit
x<y
und überprüfeny<x
, aber es ist kürzer, den Listenvergleich als zu nutzena[:1]<=b
. Schließlich passen wir die komplexe Verschiebung zwischen den aktuellen Elementen um anx-y
.quelle
a>[]<b
zua>0<b
. Es funktioniert seit beidem[]
und0
ist falsch, also sind sie gleichwertig.a:
?([] > []) != ([] > 0)
und in python3 handelt es sich um einen Fehler (nicht sortierbare Typen).a:
ist ein Teil der Scheibe[b[:1]<=a:]
.Python,
105102100 BytesZiemlich einfach, konvertiert einfach die Eingabelisten in Listen mit Lochindizes und berechnet dann den Abstand zwischen jedem Paar solcher Indizes.
Testfall:
Wir danken @FryAmTheEggman für ein paar Vorschläge zum Speichern von Bytes. Es hat sich herausgestellt, dass dies weiter verbessert werden kann, wie in der Antwort von xnor gezeigt .
quelle
enumerate(l)
und nach0.5
(die gerade .5 sein könnten) entfernen .l=lambda*a:sum(((a-b)**2+1)**.5for a,b in zip(*map(i,a)))
Pyth, 30 Bytes
Probieren Sie es online mit der Eingabe
[0,1,1,0,1,1,1,1,0,0], [1,0,0,1,1,1,0,0,1]
.Erläuterung:
Ich konvertiere die Listen in Listen von Indizes
[2, 3, 5, 6, 7, 8]
und[1, 4, 5, 6, 9]
und zip sie zusammen[(2,1), (3,4), (5,5), (6,6), (7,9)]
. Dann subtrahiere ich die Werte, quadriere sie, addiere 1 und summiere über alle Quadratwurzeln.Schade, dass
sum
für leere Listen nicht funktioniert.quelle
Python,
116115 BytesDies ist eine rekursive Lösung.
Es wurde ziemlich ärgerlich, als ich herausfand, dass
index()
nur ein Fehler ausgegeben wird, wenn kein Wert gefunden wird, aber ich habe dafür gesorgt, dass es funktioniert. Leider kann ich kein Lambda verwenden. Es hat mich auch geärgert, dasslist.remove()
die Liste nicht zurückgegeben wird, sondern zurückgegeben wirdNone
.Hier online ausführen: http://repl.it/c5L/2
quelle
Clip 3 ,
55 4738Für die Liste mit den weniger Löchern durchläuft das Programm sie und verbindet jedes Loch mit dem entsprechenden Loch der anderen Liste. Die Größen werden berechnet und summiert.
Erläuterung
Wenn wir das Eingabeformat sehr liberal finden, können wir es durch Entfernen auf 36 Byte reduzieren
k
. Dies setzt voraus, dass die Eingabe eine Zeichenfolge aus den Steuerzeichen\0
und ist\1
.quelle
ECMAScript 6, 86 Bytes
Dies begann ursprünglich mit der Verwendung von Reduce (ich wollte sehen, ob es in einer Schleife im Gegensatz zu @ edc65 Antwort durchgeführt werden kann).
Aber mit @ edc65 für
map
und&&t
um den Wert zurückzugeben, konnte ich ihn ziemlich verkürzen.quelle
reduce
macht semantisch mehr Sinn, aber ansonsten ist es tatsächlich etwas umständlich zu bedienen. Natürlich, seit wann beschäftigen sich Codegolfer mit der Semantik.Java, 151
Dies geht nur auf der
a
Suche nach denen und geht dann weiter,b
wenn es eine findet. Wenn diefloat
Genauigkeit akzeptabel ist, könnte ich ein paar Bytes einsparen, aber ich habedouble
die Testausgabe angepasst.Mit Leerzeichen:
quelle
JavaScript (ES6) 108
Der Hauptpunkt ist die f-Funktion, die die Eingangs-0..1-Arrays in Arrays von Lochpositionen abbildet. Dann werden die Arrays gescannt, wobei eine Gesamtlänge der Stäbe unter Verwendung des pythagoreischen Theorems berechnet wird. Das
|0
Ende wird benötigt, um NaNs zu konvertieren, die entstehen können, wenn das Treiberarray (das erste) länger als das zweite ist.Test In der Firefox / FireBug-Konsole
quelle
Octave,
605942quelle
Perl 98
Lesbar:
Testen:
quelle
APL,
3528 BytesVerwendet einen ähnlichen Algorithmus wie die J-Lösung, APL verfügt jedoch über weniger integrierte Funktionen.
Beispiel Eingabe:
quelle