Tangential inspiriert von der Eröffnung des What-If-Buches.
Die Eingabe ist ein Rechteck aus Leerzeichen als Zeichenfolge, Liste der Zeichenfolge usw. mit Objekten, die aus #
den folgenden Elementen bestehen:
########
# #
########
### ####
### ####
###
Die Objekte sind immer sich nicht überschneidende, sich nicht berührende Rechtecke. Ein weiches Objekt ist definiert als ein Objekt, das nicht mit #
's in der Mitte gefüllt ist und nur einen Rand darstellt. Ein hartes Objekt ist ein Objekt, das gefüllt ist. Ein Objekt mit Breite oder Höhe <=2
wird als hart angesehen. Alle Objekte sind entweder hart oder weich.
Befinden sich mehr harte Objekte in der Eingabe, werden sie ausgegeben "Hard"
, wenn sie weicher sind "Soft"
, werden sie ausgegeben , wenn sie gleich sind "Equal"
.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes !
Testfälle
Diese Fälle sind keine vollständigen Eingaben, sondern vielmehr das, als was jedes Objekt charakterisiert werden sollte. Der eigentliche Input wird wie die ASCII-Kunst am Anfang der Frage sein.
Hart
#
####
##
##
##########
##########
##########
Weich
###
# #
###
###################
# #
# #
# #
###################
####
# #
# #
# #
# #
# #
# #
# #
####
Aktuelle Testfälle
########
# #
########
### ####
### ####
###
Hard
###
###
###
###################
# #
# #
# #
###################
Equal
######
# #
######
###
## # # #
###
########
# #
########
Soft
quelle
Antworten:
MATL ,
105104585049 BytesVielen Dank an @Neil für einen Vorschlag, mit dem ich 46 Bytes entfernen konnte!
Die Eingabe ist ein 2D-Zeichen-Array mit durch getrennten Zeilen
;
. Das Beispiel in der Herausforderung istHier ist ein weiteres Beispiel:
Das entspricht
und sollte so geben
'Equal'
.Als drittes Beispiel, entsprechend
'Soft'
,das ist,
Probieren Sie es online!
Erläuterung
Dies verwendet 2D-Faltung, um Formen zu erkennen. Die Eingabe wird in ein 2D-Array mit
1
Angabe#
und-1
für Leerzeichen konvertiert . und ist mit einem Rahmen von-1
Werten aufgefüllt . Dies stellt sicher, dass auch Formen am Rand des ursprünglichen Feldes erkannt werden.Ein weiches Objekt wird von der Maske erkannt
Dies entspricht der linken oberen Ecke des Objekts mit einem leeren Innenpunkt. Beachten Sie, dass die Faltung die Maske invertiert, sodass sie wie
[-1 1; 1 1]
im Code definiert ist. Die Anzahl S der Positionen, an denen die Faltung gleich4
ist, ist die Gesamtzahl der weichen Objekte.Ein Objekt (weich oder hart) wird von der Maske erkannt
Dies entspricht der oberen linken Ecke des Objekts zusammen mit einigen leeren äußeren Punkten. Diese Maske ist die negierte Version der vorherigen, sodass das vorherige Faltungsergebnis wiederverwendet werden kann. Insbesondere ist die Anzahl T von Positionen, an denen dieses Ergebnis gleich
-4
ist, die Gesamtzahl von Objekten.Die Anzahl H der harten Gegenstände ist T - S . Die Ausgabezeichenfolge wird durch das Vorzeichen der ermittelten S - H = 2 * S - T .
quelle
JavaScript (ES6),
123121118 Byte2 Bytes gespart dank @ edc65!
Nimmt Eingaben als mehrzeilige Zeichenfolge auf, die mit Leerzeichen aufgefüllt ist, um ein Raster zu bilden.
Erklärung / Test
Ganz in der Nähe von MATL Länge!Grundsätzlich wird nach der obersten Zeile von#
s jedes Objekts gesucht, und wenn die Länge der obersten Zeile kleiner als 2 ist oder die ersten 2 Zeichen unter der obersten Zeile gleich sind, ist es hart, ansonsten weich.quelle
###
kehrt zurückEqual
.~g.search(/$/m)
ist etwas lesbarer als~g.search`\n`||-1
.||-1
habe, aber Ihr Vorschlag hat mir klar gemacht, dass das Hinzufügen|$
zum regulären Ausdruck trotzdem 2 Bytes einspart. Vielen Dank!n=l=...
n>l?...:n<l?...:...
Jelly,
5049464338343332 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle .
Hintergrund
Es gibt 16 verschiedene 2 × 2- Muster von Blöcken und Zwischenräumen:
Von diesen, da zwei Objekte nie berühren werden,
wird nie in der Eingabe auftreten und uns mit 14 möglichen Mustern verlassen.
Wenn Sie
einen Wert von 0 und
#
einen Wert von 1 zuweisen, können Sie ein 2 × 2- Muster codierenals 2 (2a + c) + (2b + d) = 4a + 2b + 2c + d , wobei die folgenden Werte für die 14 Muster belassen werden.
Für partielle 2 × 1 , 1 × 2 oder 1 × 1- Muster am unteren und / oder rechten Rand werden sie so behandelt, als ob sie mit Leerzeichen aufgefüllt wären, und als 4a + 2b , 4a + 2c und codiert 4a , jeweils .
Auf diese Weise hat jedes Objekt (weich oder hart) genau ein 4- Muster (seine untere rechte Ecke); Jedes weiche Objekt hat genau zwei 7 Muster (seine untere linke und seine obere rechte Ecke).
Das Subtrahieren der Anzahl von 4 Mustern von der Anzahl von 7 Mustern in der Eingabe ergibt (s + h) - 2s = h - s: = d , wobei h und s die Anzahl von harten und weichen Objekten sind, die sie bilden.
Wir drucken Hart, wenn d> 0 , Weich, wenn d <0 und Gleich, wenn d = 0 .
Wie es funktioniert
quelle
Julia,
999593 Bytes!
erwartet ein zweidimensionales Char-Array als Argument. Probieren Sie es online!Wie es funktioniert
Dies verwendet fast genau die gleiche Idee wie meine Gelee-Antwort , mit einer Verbesserung:
Anstatt die Anzahl der 4er und 7er zu zählen, entfernen wir alle anderen Zahlen und subtrahieren dann 5.5 , um (4, 7) auf (-1.5, 1.5) abzubilden . Auf diese Weise bestimmt das Vorzeichen der Summe der resultierenden Differenzen die korrekte Ausgabe.
quelle
TSQL,
328249 BytesVariablen und Testdaten deklarieren:
Code:
Code entleert:
Erklärung:
Das Skript durchsucht den Text nach dem Muster:
Jedes davon ist der Anfang einer Kiste
Für diese Positionen sucht das Skript nach dem Muster und muss nicht erst nach x suchen:
Wenn das existiert, ist es ein weiches Objekt, sonst ist es ein hartes Objekt.
quelle