Einführung
In dieser Herausforderung erhalten Sie als Eingabe die ASCII-Darstellung des Netzes (entfaltete Oberfläche) eines rechteckigen Quaders (3D-Box). Das Format ist folgendes:
....+--+.......
....|##|.......
....|##|.......
....|##|.......
+---+--+---+--+
|###|##|###|##|
+---+--+---+--+
....|##|.......
....|##|.......
....|##|.......
....+--+.......
Jede Fläche des Quaders ist ein #
von +-|
-Zeichen umgebenes Rechteck aus s . Die Außenseite des Netzes ist mit .
s gefüllt . Das Netz hat immer die gleiche Ausrichtung: Es gibt eine Mittelfläche, die von den vier benachbarten Flächen umgeben ist, und das Gegenstück der Mittelfläche befindet sich am rechten Rand der Eingabe. Die Eingabe wird mit .
s zu einer rechteckigen Form aufgefüllt und enthält keine zusätzlichen Zeilen oder Spalten mit .
s.
Die Aufgabe
Ihre Aufgabe ist es, als Eingabe ein Diagramm wie oben zu nehmen und das Volumen des Quaders zu berechnen, das es darstellt, das nur das Produkt seiner Höhe, Breite und Tiefe ist. Sie können die Eingabe als durch Zeilenumbrüche getrennte Zeichenfolge oder als Array von Zeichenfolgen verwenden.
Die Länge jeder Kante ist der Abstand zwischen den +
Zeichen an den beiden Enden. Beispielsweise hat die horizontale Kante +--+
die Länge 3 und die vertikale Kante
+
|
|
|
+
hat die Länge 4. Die minimale Länge einer Kante ist 1. Der obige Beispielquader hat das Volumen 2 * 3 * 4 = 24.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben, und die niedrigste Byteanzahl gewinnt.
Testfälle
.++..
+++++
+++++
.++..
1
...++....
...||....
...||....
+--++--++
+--++--++
...||....
...||....
...++....
3
..+-+....
..|#|....
+-+-+-+-+
|#|#|#|#|
|#|#|#|#|
+-+-+-+-+
..|#|....
..+-+....
12
.+---+.....
++---++---+
||###||###|
||###||###|
||###||###|
++---++---+
.+---+.....
16
....++.....
....||.....
....||.....
....||.....
+---++---++
|###||###||
|###||###||
|###||###||
+---++---++
....||.....
....||.....
....||.....
....++.....
16
...+--+......
...|##|......
...|##|......
+--+--+--+--+
|##|##|##|##|
+--+--+--+--+
...|##|......
...|##|......
...+--+......
18
....+--+.......
....|##|.......
....|##|.......
....|##|.......
+---+--+---+--+
|###|##|###|##|
+---+--+---+--+
....|##|.......
....|##|.......
....|##|.......
....+--+.......
24
....+-----+..........
....|#####|..........
....|#####|..........
....|#####|..........
+---+-----+---+-----+
|###|#####|###|#####|
|###|#####|###|#####|
|###|#####|###|#####|
|###|#####|###|#####|
+---+-----+---+-----+
....|#####|..........
....|#####|..........
....|#####|..........
....+-----+..........
120
Antworten:
Retina ,
2928 BytesProbieren Sie es online!
In der Netzhaut gibt es viele Möglichkeiten, sich dem anzunähern, je nachdem, welchen Bereich Sie mit welcher Seite multiplizieren möchten. Daher bin ich mir nicht sicher, wie optimal dies ist, aber es ist tatsächlich schon viel kürzer, als ich gedacht hätte.
Ich habe derzeit zwei andere Lösungen mit der gleichen Byteanzahl, die ein bisschen besser zu sein scheinen als der obige Ansatz:
In diesen könnte ich zwar jeweils ein Byte speichern, wenn ich davon ausgehe, dass die Eingabe mit einem nachgestellten Zeilenvorschub endet, aber ich würde mich lieber nicht darauf verlassen müssen.
Und noch eine mit 28 Bytes (diese multipliziert drei Seiten, anstatt einen Bereich mit einer Seite zu multiplizieren):
Erläuterung
Die Hauptidee besteht darin, den oberen Bereich der Fläche mit der Länge der vertikalen Seite zu multiplizieren, die den Längenrand der Eingabe berührt.
Ich werde die folgende Eingabe als Beispiel verwenden (sie hat die Seitenlängen 2, 3 und 4, also eine Fläche von 24):
Stufe 1: Transliterieren
Der reguläre Ausdruck
\G\..+¶
stimmt mit einer Zeile überein, die mit.
der vorherigen Zeile beginnt und unmittelbar an diese angrenzt. Dies entspricht also allen Linien, die die Oberseite enthalten. Die Bühne selbst wird.
zux
und alle anderen Charaktere (von|+-#
) zuy
. Dies ergibt folgendes Ergebnis:Dies hat eine Spalte mehr,
y
als wir brauchen, um den Bereich der Oberseite darzustellen. Wir beheben dies mit der nächsten Stufe.Stufe 2: Ersetzen
Also stimmen wir mit a überein, dem ein
y
vorangestellt istx
(das ist genau einer von ihnen pro Zeile) und entfernen beide aus der Zeichenfolge. Wir bekommen das:Jetzt haben wir den Bereich der Oberseite, der durch die Anzahl von
y
s dargestellt wird.Stufe 3: Ersetzen
Unser Ziel hier ist es, diesen Bereich
A
mit der fehlenden Seitenlänge zu multiplizieren , die der Zahl|
am Anfang einer Zeile plus 1 entspricht. Es ist jedoch tatsächlich einfacher, mit einer Zahl zu multiplizieren,n+1
da wir bereits eine Kopie vonA
in der Zeichenfolge haben . Wenn wirn
Dinge durch ersetzenA
, erhalten wirn+1
Kopien vonA
. Das macht es uns viel leichter.Also ersetzen wir einfach jeden
|
sofort nach einem Zeilenvorschub mit allem, was vor dem Spiel steht. Dies zerfleischt die Saite ziemlich und macht sie ein bisschen größer als wir brauchen, aber die Anzahl dery
s ist das Ergebnis, das wir suchen:Stufe 4: Match
Jetzt müssen Sie nur noch die Anzahl
y
s zählen, die am Ende als Dezimalzahl ausgegeben wird.quelle
Python 2, 57 Bytes
Eine Funktion, die eine Liste von Zeichenfolgen aufnimmt.
Legt die 3 Dimensionen separat fest:
l[0].find('+')
Der Index des Ersten
+
in der ersten Zeile.-~l[0].count('-')
Die Anzahl der
-
Zeichen in der ersten Reihe.~`l`.count("'|")
Die Anzahl der Zeilen, die mit dem
|
Symbol beginnen, über die Zeichenfolgendarstellung der Liste, vor der ein Anführungszeichen steht.62 Bytes:
Eine Funktion, die eine Liste von Zeichenfolgen aufnimmt und das Ergebnis druckt.
Findet eine Dimension
a
als Index+
in der ersten Zeile. Daraus werden die beiden anderen Dimensionen sowie die Breite und Höhe des Eingaberechts abgeleitet.Eine 63-Byte-Alternative, bei der die Dimensionen separat ermittelt werden:
quelle
Bash + Coreutils,
8377 BytesEDITS:
Golf gespielt
Erklärt
Transformiere mit sed :
Befreien Sie sich von Zeilenumbrüchen mit Backticks (Anhängen)
Füttere den resultierenden Ausdruck an bc
Prüfung
Probieren Sie es online! (Verwendet die Bash-arithmetische Erweiterung anstelle von bc , da diese nicht verfügbar ist.)
quelle
Schnecken , 19 Bytes
Probieren Sie es online aus.
Die Idee ist, dass wir irgendwo am äußersten rechten Rand des Netzes beginnen und dann irgendwohin im untersten Gesicht reisen. Die Länge der Kante und die Fläche der Fläche werden mit dem Mechanismus zum Zählen aller übereinstimmenden Pfade multipliziert.
quelle
JavaScript (ES6), 67
91Prüfung
quelle
Rubin, 44
Funktioniert nach einem ähnlichen Prinzip wie bei anderen Antworten: Suchen Sie den Ersten
+
, um die Tiefe zu ermitteln, suchen Sie den Nächsten.
nach dem+
, um die Breite zu ermitteln, und zählen Sie die Anzahl|
der Zeilenenden und addieren Sie 1, um die Höhe zu ermitteln.im Testprogramm ungolfed
quelle
05AB1E , 21 Bytes
Sei
W
undH
sei jeweils die Breite und die Höhe der Eingabe - nicht das Kästchen. Dann werden die Box - MaßeA
,B
undC
diese Regeln befolgen:Die folgende Abbildung zeigt , was
A
,B
undC
sind in Bezug auf die Kante Namen:Daher die obigen Formeln. Dieses Programm berechnet
A
, leitet die Werte vonB
und abC
und berechnet schließlich ihr Produkt.Probieren Sie es online!
Frühere Version - Anderer Ansatz - 26 Bytes
quelle
Befunge 93 , 56 Bytes
Probieren Sie es online!
Erläuterung:
Das Volumen des Kästchens kann berechnet werden, indem die Anzahl von
.
s in der ersten Zeile vor anderen Zeichen mit der Anzahl von+
und-
s in der ersten Zeile - 1 und der Anzahl von Zeilen, die mit|
+ 1 beginnen, multipliziert wird .Ich musste die IP-Zeilen nach oben anstatt nach unten verschieben, um die Vertikale zu verwenden, wenn in der 3. Zeile. Wenn die IP-Adresse nach unten zeigt, wird durch das vertikale if die Stapelspitze auf 1 gesetzt, wenn das folgende horizontale if getroffen wird, und in die falsche Richtung gesendet.
quelle
Haskell,
6456 BytesProbieren Sie es online!
Erläuterung
Es wird erwartet, dass die Eingabe eine Liste von Zeichenfolgen für jede Zeile ist, sodass
f
der Parameterx
die erste Zeile undr
eine Liste der verbleibenden Zeilen enthält.fst(span(>'+')x)
gibt das.
-prefix der ersten Zeile als String zurück, alsolength(fst(span(>'+')x))
die erste Dimensiond1
.['-' | '-' <- x]
gibt eine Zeichenfolge von allen-
in der ersten Zeile zurück und1 + length['-' | '-' <- x]
ergibt so die zweite Dimensiond2
.|
in der ersten Zeile gezählt werden, ebenso1 + length['|' | '|':_ <- r]
die dritte Dimensiond3
.Die Liste Comprehensions von 2. und 3. kann verkürzt werden
1+sum[1|'-'<-x]
und1+sum[1|'|':_<-r]
‚|‘ - ‚‘ oder für jedes Auftreten durch den Aufbau einer Liste von Einsen und dann die Summe nehmen. Wir können weiterhin die äußere setzen1+
in die Liste Verständnis durch Anhängen-
anx
und"|"
zur
zu erhaltensum[1|'-'<-'-':x]
undsum[1|'|':_<-"|":r]
. Jetzt können wir beide Listenverständnisse kombinieren, indem wir beide Prädikate in dasselbe Verständnis setzen:sum[1|'|':_<-"|":r,'-'<-'-':x]
Zweckmäßigerweise berechnet dies genau das Produkt der beiden Dimensionen, da für ListenF
undG
das folgende Listenverständnis das kartesische Produkt istF x G =[(a,b)|a<-F,b<-G]
.Schließlich können wir, anstatt 1. mit der Kombination aus 2. und 3. zu multiplizieren, den
>>
Operator für Listen verwenden:F>>G
WiederholungenG
length F
und Verkettung des Ergebnisses. Sofst(span(>'+')x)>>[1|'|':_<-"|":r,'-'<-'-':x]
wiederholt sich die Liste derd2*d3
diejenigend1
Zeiten, eine Liste von wasd1*d2*d3
diejenigen , die dann summiert werden , um die Lautstärke zu erhalten.quelle
lines
.Java 8,
185129 BytesDanke an Zgarb für -56 Bytes
Golf gespielt:
ungolfed:
Erläuterung
a*b*h = ((length_of_line-2*h-1)/2)*(number_of_lines-2*h-1)*h
Wo
a
undb
sind die Abmessungen der Basis undh
ist die Höhe. Sie finden,h
indem Sie die erstenh
Zeilen zählen, in denen Sie mit a beginnen.
.quelle
Java, 112 Bytes
Erweitert:
quelle
Powershell,
6867 BytesHinweis:
"$args"|% i*f +
ist eine Abkürzung für"$args".indexOf('+')
Erläuterung
Eine gute Erklärung ergab sich aus der Antwort des Osable :
Sei
W
undH
sei jeweils die Breite und die Höhe der Eingabe - nicht das Kästchen. Dann werden die Box - MaßeA
,B
undC
diese Regeln befolgen:Die folgende Abbildung zeigt , was
A
,B
undC
sind in Bezug auf die Kante Namen:Und
C
ist die Position des Ersten+
in der ersten Zeile der Eingabe.Testskript:
Ausgabe:
quelle
Wolfram Language (Mathematica) , 64 Byte
Probieren Sie es online!
Verwendet die Anzahl von
.
,|
und\n
Zeichen in der Eingabe, um nach dem Volume zu suchen. Es sieht dumm aus, weil es eine aktuelle neue Zeile anstelle von gibt\n
.Wenn
A
,,B
undC
die Seiten sind, dann. = 2C(A+2C)
,| = 5B+4C-9
und\n = B+2C
, dann können wir das VolumenABC
in Bezug auf diese drei Zeichenzahlen auflösen.quelle