Ähnliche Figuren
Zwei Rechtecke sind ähnlich, wenn die Seitenverhältnisse gleich sind.
Betrachten Sie diese beiden Rechtecke. Ein Rechteck mit 5 Zeilen Höhe und 11 Zeichen Breite:
===========
===========
===========
===========
===========
und ein 10 Zeilen großes und 22 Zeichen breites Rechteck:
======================
======================
======================
======================
======================
======================
======================
======================
======================
======================
Diese Formen sind ähnlich, weil die Seitenverhältnisse gleich sind. Formal ausgedrückt (wobei die kürzeste und die längste Seite ist):
Sie können auch tun:
Die Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die ein "Haupt" -Rechteck und einige "andere" Rechtecke verwendet und druckt, welche der "anderen" ähnlich wie "Haupt" sind.
Die Eingabe
Eine Form und eine Liste von Formen. Jede Form besteht aus 2 positiven Ganzzahlen ungleich Null, die die Breite und Höhe des Rechtecks angeben. Zum Beispiel das:
(4,2), (3,9)
bezeichnet zwei Rechtecke, ein 4x2 und ein 3x9. Das genaue Format der Eingabe kann beliebig sein.
Die Ausgabe
Die Indizes der "anderen" Formen, die "main" ähnlich sind. Sie können wählen, ob die Indizes 0- oder 1-basiert sind, sowie das genaue Format und die Reihenfolge der Ausgabe.
Beispielprogramm
In Python:
main = eval(raw_input()) # The main rectangle.
rects = eval(raw_input()) # The list of rectangles.
similar = set()
for i, rect in enumerate(rects):
if max(main)*min(rect) == min(main)*max(rect): # Cross-multiply
# They are similar.
similar.add(i)
print similar
Sample Ein- und Ausgabe
Eingang:
(1, 2)
[(1, 2), (2, 4)]
Ausgabe:
set([0, 1])
Eingang:
(1, 2)
[(1, 9), (2, 5), (16, 8)]
Ausgabe:
set([2])
Gewinnen
Dies ist Code-Golf, also gewinnt die kürzeste Einsendung.
Anmerkungen
- Dies sollte selbstverständlich sein, aber Standardlücken sind verboten .
- Es dürfen keine Builtins zum Auffinden ähnlicher Figuren verwendet werden. (Ich weiß nicht einmal, ob das existiert, aber ich wäre nicht überrascht!)
quelle
[1.0 2.0]
ein akzeptables Eingabeformat?[(1,2), (2,4), (1,9), (2,5), (16,8)]
, ist nur[0,1,4]
und[1,2,5]
erlaubt, oder könnten wir auch ausgeben[1,1,0,0,1]
oder[(1,2), (2,4), (16,8)]
?Antworten:
Pyth, 15 Bytes
quelle
Python, 61 Bytes
Ja, ich verwende 9 Zeichen zum Schreiben
enumerate
. Nimmt Eingaben wie1, 2, [(1, 9), (3,6), (2, 5), (16, 8)]
. Für Python 2 müssen Eingabewerte als Float geschrieben werden.Ein Zeichen länger (62) in Python 3:
quelle
i
als Index und(x,y)
als Punkt entpackt . Anschließend wird geprüft, ob der Wertx/y
entweder dem Quotienten (a/b
) der ersten beiden Zahlen oder dem Kehrwert (b/a
) entspricht. Wenn er einem dieser Werte entspricht, wird der Wert voni
zur Liste hinzugefügt, andernfalls wird er verworfen.CJam,
222019 BytesBei der obigen Funktion handelt es sich um eine anonyme Funktion, die ein einzelnes Array von Gleitkomma-Paaren (erstes Paar ist needle) aus dem Stapel entfernt und das Array von 1-basierten Indizes zurückgibt.
Versuchen Sie es online in dem CJam Dolmetscher .
Wie es funktioniert
quelle
Haskell , 48 Bytes
Probieren Sie es online!
Nennen Sie das wie
(!) 1 2 [(1, 9), (3,6), (2, 5), (16, 8)]
.Ein Near-Port meiner Python-Antwort . Der Ausdruck
zip[0..]l
zählt die Liste mit ihren Indizes auf.Der Ausdruck
x/y+y/x==a/b+b/a
überprüft, ob das Verhältnisx/y
entwedera/b
oderb/a
, da die Funktionf(z) = z + 1/z
hatf(z) = f(1/z)
und keine weiteren Kollisionen.quelle
h
einen Operator vielleicht drei Argumente annehmen? Das würde ein Byte sparen und ich denke, es würde innerhalb der Regeln bleiben.Schneemann 1.0.2 , 61 Zeichen
Pures Kauderwelsch (es sei denn, Sie kennen Snowman), auch bekannt als genau das gestalterische Ziel der Sprache, so verwirrend wie möglich zu sein.
Das Eingabeformat ist das gleiche wie im Beitrag, das Ausgabeformat ist auch das gleiche Minus
set(
und)
.Ungolfed (oder wirklich nicht abgeschlossen):
Ich bin ziemlich stolz auf einige der Tricks, die ich in diesem verwendet habe:
Ich habe das gleiche Eingabeformat wie im Beitrag verwendet. Aber anstatt zu versuchen, es irgendwie zu analysieren, was wirklich chaotisch werden würde, habe ich einfach die beiden Zeilen verkettet und dann mit einem regulären Ausdruck alle Zahlen in ein großes Array extrahiert (mit dem ich dann
2aG
jede Gruppe von 2 erhalten habe).:nD;aF
ist ziemlich schick. Es nimmt einfach ein Array von zwei Elementen und teilt das erste durch das zweite. Das scheint ziemlich einfach zu sein, aber auf intuitive Weise (a[0]/a[1]
) wäre in Snowman weitaus länger0aa`NiN`aA|,nD
(und das unter der Annahme, dass wir uns nicht um das Durcheinander mit anderen vorhandenen Variablen kümmern müssen). Stattdessen habe ich die Methode "fold" mit dem Prädikat "divide" verwendet, mit der für ein Array von zwei Elementen dasselbe erreicht wird.0AAgaA
Es sieht harmlos aus, aber tatsächlich speichert es a0
in den Variablen und nimmt dann alle Variablen mit einem größeren Index (also alle Variablen mit Ausnahme der ersten). Aber der Trick ist,AaG
dass ich anstatt (was das ursprüngliche Array und das Array loswerden würde0
)AAg
beides verwendet habe. Jetzt benutze ichaA
, at-Index, mit dem gleichen0
das erste Element des Arrays-weiterhin zu erhalten, ist dies in konsumieren-Modus (aA
stattaa
), so dass es dem loswerden wird0
zu und Original - Array, das sind jetzt Müll für uns.Ach,
0AAgaA*|
tut im Wesentlichen die gleiche Sache , dass GolfScript in einem Zeichen tut:(
. Trotzdem finde ich es für Schneemann-Verhältnisse ziemlich nett. :)quelle
Mathematica, 41 Bytes
Verwendung:
quelle
Pyth - 14 Bytes
Filtert nach Quotienten und ordnet sie zu
indexOf
.Test Suite .
quelle
1,2
und[(1, 2), (2, 4), (1, 2)]
gibt[0, 1, 0]
eher als das richtige aus[0, 1, 2]
.APL (Dyalog Unicode) ,
16 bis13 Byte SBCSProbieren Sie es online!
-3 danke an @ngn!
Erläuterung:
Das Ausgabeformat ist ein binärer Vektor,
1 1 0 0 1
von dem "anderes" Rechteck ein Aussehen hat.APL (Dyalog Extended) , 11 Byte SBCS
Probieren Sie es online!
Erläuterung:
Das Ausgabeformat ist dasselbe wie die Hauptantwort von Dyalog.
Vielen Dank an Adám für die Hilfe Golf + Extended.
quelle
(=.×∘⌽∨=.×)⍤1
Julia, 62 Bytes
Die
find
Funktion findet wahre Elemente in einem Booleschen Vektor..*
Führt eine elementweise Multiplikation von Vektoren durch.Ungolfed:
Verwendung:
quelle
K5, 19 Bytes
Ich denke, das wird den Trick machen:
Nimmt eine Liste von Paaren auf, wobei das erste das "Haupt" ist. Berechnet das Verhältnis durch Teilen der sortierten Dimensionen jedes Paares. Gibt eine Liste der 0-indizierten Positionen der übereinstimmenden Paare zurück. (Möglicherweise bewirkt
1+
das von mir gewählte Eingabeformat, dass diese Angabe -1 indiziert wird, wenn dies als ungültiger Ansatz an einem Anfang betrachtet wird, und fügt der Größe meines Programms zwei Zeichen hinzu.)Anwendungsbeispiel:
Dies läuft in OK - beachten Sie, dass ich implizit von der Division abhängig bin, die immer Gleitkommaergebnisse liefert. In Kona würde es funktionieren, wenn Sie allen Zahlen in der Eingabe ein Dezimalzeichen und nach dem ein Leerzeichen hinzufügen
_
.quelle
Oktave / Matlab, 44 Bytes
Verwenden einer anonymen Funktion:
Das Ergebnis ist eine 1-basierte Indizierung.
Um es zu benutzen, definieren Sie die Funktion
und rufen Sie es mit dem folgenden Format auf
Sie können es online ausprobieren .
Wenn das Ergebnis eine logische Indizierung sein kann (
0
zeigt nicht ähnlich an,1
zeigt ähnlich an): 38 Bytes :Gleiches Beispiel wie oben:
quelle
Brachylog , 14 Bytes
Probieren Sie es online!
Nimmt die Eingabe als Liste mit einer Liste, die das Hauptrechteck und die Liste der anderen Rechtecke enthält (Testfall 1 ist also
[[[1,2]],[[1,2],[2,4]]]
), und gibt eine Liste von 0-basierten Indizes über die Ausgabevariable aus.Wenn diese Art von seltsamer und spezifischer Eingabe-Formatierung schummelt, ist es etwas länger ...
Brachylog , 18 Bytes
Probieren Sie es online!
Übernimmt die Eingabe als Liste mit dem Hauptrechteck und der Liste der anderen Rechtecke (Testfall 1 ist also offensichtlicher
[[1,2],[[1,2],[2,4]]]
) und gibt eine Liste von 0-basierten Indizes über die Ausgabevariable aus.Um festzustellen, ob zwei Breite-Höhe-Paare ähnliche Rechtecke darstellen, werden nur die vier Bytes
pᵐ/ᵛ
(die das gemeinsame Verhältnis oder dessen Kehrwert ausgeben) benötigt. Der Rest besteht darin, die mehreren zu vergleichenden Rechtecke und die Ausgabe als Indizes zu behandeln.quelle
dzaima / APL , 7 Bytes
Probieren Sie es online!
8 Bytes, die eine Liste von Indizes anstelle eines Booleschen Vektors ausgeben
quelle
[0,1,4]
oder ergeben[1,2,5]
(nicht sicher, ob Ihre Sprache 0- oder 1-indiziert ist). Es wäre imho eine bessere Herausforderung gewesen, wenn alle drei Ausgabeformate erlaubt wären: Indizes; filtern, um die wahren Werte zu erhalten; Liste der wahrheitsgemäßen / falschen Werte (wie Sie es jetzt getan haben), anstatt nur zulässige Indizes.[0,1,4]
,[1,2,5]
,4\n0\n1
,5 2 1
, etc. etc., da es nach wie vor angegeben Indizes . Aber ich habe OP gebeten zu klären (ob sie antworten, da es eine 4 Jahre alte Herausforderung ist). In meiner 05AB1E-Antwort würde dies 14 Bytes bedeuten, wenn die Indizes obligatorisch sind, im Gegensatz zu 8 Bytes, wenn eine der beiden anderen Optionen zulässig ist. Unabhängig davon habe ich Ihre Antwort positiv bewertet. :)Haskell, 75 Bytes
quelle
PowerShell , 57 Byte
Probieren Sie es online!
Indizes sind 1-basiert.
quelle
Power Shell ,
5856 Byte-2 Bytes dank mazzy x2
Probieren Sie es online!
Dies missbraucht leicht die
input may be however you desire
Klausel , da die Komponenten der ersten Form separat geliefert werden, um 3 Byte zu sparen.Power ,
6159 BytesProbieren Sie es online!
Verwendet die bedingte Indizierung, um zwischen dem aktuellen nullbasierten Index und null zu wechseln, je nachdem, ob die Verhältnisse aufeinander abgestimmt sind oder nicht. Zum Glück wird in diesem Fall
$i
unabhängig davon, ob gedruckt wird oder nicht , inkrementiert.quelle
-
stattdessen verwenden-ne
.Javascript (ES6), 75
Alternativ auch 75
Die Eingabe wird als JSON-Objekt und als Array von JSON-Objekten verwendet
quelle
05AB1E ,
1514 BytesProbieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Die
J
Oins sind da, weil 05AB1E die Indizes für mehrdimensionale Listen afaik nicht bestimmen kannWenn Sie die wahrheitsgemäßen Breiten- / Höhenpaare ausgeben oder eine Liste von wahrheitsgemäßen / falschen Werten basierend auf der Eingabeliste ausgeben, könnten es stattdessen 8 Bytes sein :
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
quelle