Herausforderung:
Als Eingabe erhalten Sie ein ASCII-Bild eines Gewichtsstapels und müssen das kombinierte Gewicht des Stapels ausgeben.
Format:
Es gibt 5 verschiedene Gewichte mit einem Gewicht von 1, 2, 5, 10, 20 Passanten (oder einer anderen willkürlichen Einheit).
Die Gewichte sehen in aufsteigender Reihenfolge so aus:
1: __
|__|
2: ______
|______|
5: ______
| |
|______|
10: ______________
| |
|______________|
20: ____________________
| |
|____________________|
Die Wägungen werden symmetrisch platziert (wie im Beispielbild), nicht unbedingt in einer sortierten Reihenfolge. Wägungen teilen sich Grenzen, wo zutreffend:
Testfälle:
Sie können auch alle Einzelgewichte als Testfälle verwenden.
__
_|__|_
|______|
| |
|______|
1 + 2 + 5 = 8
____________________
| |
|____________________|
| |
|______________|
_|__|_
|______|
| |
|______|
20 + 10 + 1 + 2 + 5 = 38
______
|______|
|______|
|______|
|______|
2 + 2 + 2 + 2 = 8
Zusätzliche Regeln:
- Sie dürfen keine zusätzlichen führenden Leerzeichen annehmen. Das größte Gewicht befindet sich ganz links.
- Sie können abschließende Leerzeichen und Zeilenumbrüche annehmen.
- Sie können davon ausgehen, dass maximal 10 Gewichte vorhanden sind
- Sie können die Eingabe in einem optionalen Format vornehmen, aber Sie können die von etwas anderem verwendeten Zeichen nicht ersetzen
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes jeder Sprache. Erklärungen sind wie immer erwünscht.
Antworten:
Gelee ,
2423 BytesProbieren Sie es online!
Wie?
Die Gewichte können durch ihre Breiten und Höhen identifiziert werden. Die Breite kann gemessen werden, indem der Abstand zwischen den
|
Zeichen der Linie betrachtet wird . Wenn wir zuerst alle Zwischenräume entfernen, tragen diese Gewichte der Höhe zwei zu einer solchen Linie mit einer gemessenen Breite von eins bei.Die verschiedenen Gewichte haben Breiten von
3, 7, 7, 15, 21
(jeweils für Gewichte1, 2, 5, 10, 20
). Hinzufügen eines nachlauf1
für die von der Höhe zwei finden wir die[3],[7],[7,1],[15,1],[21,1]
Umwandlung von binären diese sind3,7,15,31,43
, ganze Zahl dividiert durch drei gibt uns1,2,5,10,14
, was sind die Gewichte außer14
Bedarf ersetzt durch20
.Alternativ ersetzt die gemessenen Breiten
21
mit30
vor der Umwandlung unter Verwendung von“ßœ‘y
:quelle
Python 2 , 77 Bytes
Probieren Sie es online!
[i/21, i%21, ' _'[i<50] for i in [23,48,69,224,440]]
erzeugt die folgenden Drillinge[1, 2, '_'], [2, 6, '_'], [3, 6, ' '], [10, 14, ' '], [20, 20, ' ']
, die das Gewicht, die Länge und das Zeichen in der Basis jedes Gewichts darstellen, die verwendet werden, um eine eindeutige einzeilige Darstellung jedes Gewichts zu erstellen.Da sich das 3. Gewicht mit dem 2. Gewicht überschneiden würde, ersetze ich seine Basis durch seinen Körper (
_
->) und reduziere den Wert auf
3
(es wird die Basis als2
und den Körper als zählen3
, was zur Folge hat5
).quelle
Retina 0.8.2 , 60 Bytes
Probieren Sie es online! Erläuterung: Die
|
s werden!
zur Vereinfachung des Abgleichs durch s ersetzt , dann werden die Gewichte in unäre umgewandelt und summiert. Der einzig interessante Teil ist, dass das5
Gewicht als die Summe von a2
und a betrachtet wird3
, während das Gewicht10
und20
nur zwei Zeilen des halben Gewichts sind.quelle
JavaScript (Node.js) , 73 Byte
Probieren Sie es online!
quelle
Python 3 , 76 Bytes
Probieren Sie es online!
Wie?
quelle
Ich bin mir sicher, dass einige Verbesserungen vorgenommen werden müssen, aber das habe ich im Moment:
Groovy, 131 Bytes
def f(s){s.split('\n').sum{n=0;[2:1,6:2,14:5,20:10].each{k,v->if(it==~".*\\|[ _]{$k}\\|.*"){n=v+(!it.contains('_')&&k==6?1:0)}};n}}
Konvertiert die Eingabe
String
in aCollection<String>
und summiert dann die Ergebnisse für jede Zeile, um die Summe zu erhalten. Verwendet aMap
wobei der Schlüssel die Anzahl der Leerzeichen oder Unterstriche zwischen den Pipe-Zeichen ist und der Wert die entsprechende Passerees-Menge ist. Der Schlüssel wird in den regulären Ausdruck eingesteckt, um festzustellen, ob die Linie einem signifikanten Muster entspricht. Die einzige Einschränkung ist die ternäre Addition von 1 für den Fall, dass die Länge des Teilstrings zwischen den Rohren 6 beträgt und aus Leerzeichen besteht (im Gegensatz zu Unterstrichen). Wenn kein Muster übereinstimmt, hat die Linie den Wert 0.quelle
Perl 6 , 57 Bytes
Probieren Sie es online!
quelle