Bei einem rechteckigen Heuhaufen mit einer Größe von mindestens 2x2, der aus denselben druckbaren ASCII-Zeichen besteht, geben Sie die Position (von links oben gezählt) der Nadel aus, die ein anderes Zeichen ist.
Wenn zum Beispiel der folgende Heuhaufen eingegeben wird:
#####
###N#
#####
#####
Die Ausgabe sollte 3,1
bei Nullindexierung (was ich in dieser Herausforderung verwenden werde) oder 4,2
bei Einindexierung erfolgen.
Der Heuhaufen kann aus einem beliebigen druckbaren ASCII-Zeichen bestehen:
^^^
^^^
^N^
^^^
^^^
^^^
Ausgabe: 1,2
und die Nadel wird jedes andere druckbare ASCII-Zeichen sein:
jjjjjj
j@jjjj
jjjjjj
Ausgabe 1,1
Es ist auch möglich, eine Nadel in der Ecke zu haben:
Z8
88
Ausgabe 0,0
88
8Z
Ausgabe 1,1
oder um die Nadel am Rand zu haben:
>>>>>>>>>>
>>>>>>>>>:
>>>>>>>>>>
Ausgabe 9,1
Regeln und Erläuterungen
- Die Ein- und Ausgabe kann auf jede bequeme Weise erfolgen . Dies bedeutet, dass Sie Eingaben als Liste von Zeichen, als einzelne Zeichenfolge usw. vornehmen können.
- Sie können das Ergebnis an STDOUT drucken oder als Funktionsergebnis zurückgeben. Bitte geben Sie in Ihrer Einreichung an, in welcher Reihenfolge die Ausgabe erfolgt (dh horizontal und vertikal, wie in der Challenge verwendet, oder umgekehrt).
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
- Sie müssen nicht auswählen, welche Zeichen verwendet werden sollen. Das ist die Herausforderung.
- Der Heuhaufen hat garantiert eine Größe von mindestens 2x2, so dass eindeutig ist, welche Nadel und welche das Heu ist.
- Es gibt immer nur eine Nadel in der Eingabe und es ist immer nur ein Zeichen groß.
- Standardlücken sind verboten.
- Dies ist Codegolf, daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
88\n8Z
(natürlich mit zwei beliebigen Zeichen).("########N###########", 5)
Antworten:
R ,
494744 BytesProbieren Sie es online!
Nimmt die Eingabe als Matrix und gibt 1-indizierte Koordinaten zurück
quelle
which
Zuordnung ist schändlich glatt.Perl 6 ,
41 3837 Bytes3 Bytes gespart dank @nwellnhof.
1 Byte gespart dank Jo King.
Probieren Sie es online!
Erläuterung
Es nimmt die Eingabe als Liste von Zeichenlisten und gibt eine Liste der Länge 2 zurück, die nullbasierte X- und Y-Koordinaten der Nadel enthält.
Es funktioniert, indem der Block
{[+] ^∞ Z* !<<.&[Z~~]}
auf den Eingang und auf seine Transponierung angewendet wird..&[Z~~]
Durchläuft alle Spalten des Arguments und gibt ansonsten zurück,True
ob alle Elemente gleich sindFalse
. Wir negieren dann alle Werte (also haben wir eine Liste mit einem Bool pro Spalte, in der der Bool die Frage "Befindet sich die Nadel in dieser Spalte?" Beantwortet) und multiplizieren sie elementweise mit einer Folge von 0,1,2. .. (True = 1
undFalse = 0
) und summieren die Liste, sodass das Ergebnis des gesamten Blocks die 0-basierte Nummer der Spalte ist, in der die Nadel gefunden wurde.Nwellnhofs besserer Ansatz, Perl 6 , 34 Bytes
Probieren Sie es online!
Erläuterung
Im Allgemeinen der gleiche Ansatz, nur effektiver. Es verwendet immer noch einen Block im Array und dessen Transponierung, aber jetzt konvertiert der Block alle Zeilen in
Sets
und überprüft die Anzahl der Elemente. Diefirst
Funktion gibt dann den Index (aufgrund der:k
) der ersten Zeile an, die mehr als 1 Element enthielt. Aus diesem Grund musste die Reihenfolge von$_
und.&[Z]
ausgetauscht werden.quelle
first(:k)
,Set
und.&[Z]
..&[Z]
.).&[op]
scheint es nicht äquivalent zu sein,[op] $_
aber es funktioniertZ
aus irgendeinem Grund.Python 2 , 57 Bytes
Probieren Sie es online!
Ein Port von diesem zu Python 3 kann 62 Bytes umfassen :
Das Listenverständnis
[len(set(v))for v in a]
ist nun um zwei Bytes kürzer als die Doppelkarte, da es in eine Liste wie die umgewandelt werden müsstelist(map(len,map(set,a)))
Probieren Sie es online!
quelle
Brachylog , 20 Bytes
Probieren Sie es online!
Ausgaben
[I,J]
, wobei sowohlI
der Zeilenindex als auchJ
der Spaltenindex 0-indiziert sind.Dummerweise lang, aber das Abrufen von Indizes in Brachylog ist normalerweise sehr ausführlich.
Erläuterung
quelle
PHP ,
9985 BytesVerwenden von Zeichenfolgen ohne Zeilenumbrüche und der Breite (oder Höhe
('########N###########', 5
) als Eingabe.Probieren Sie es online!
Ungolfed:
Ausgabe:
quelle
chr
: Wenn der zweite Parameter für strpos eine Ganzzahl ist, wird er als ASCII-Code interpretiert. -> -5 Bytes. 2) Zwei Funktionsparameter$s,$w
können weitere 9 Bytes speichern.05AB1E ,
96 Bytes3 Bytes beim Umschalten des Eingabeformats gespeichert.
Die Eingabe wird als Zeichenfolge und Zeilenlänge verwendet.
Die Ausgabe ist eine nullbasierte Liste des Formulars
[y, x]
Probieren Sie es online! oder als Test Suite
Erläuterung
quelle
.m
...m
zuvor benutzt habe, aber ich war mir ziemlich sicher, dass ich es irgendwann gesehen hatte :)Python 3 + NumPy ,
7566 Bytes-9 Bytes dank nur @ ASCII
Probieren Sie es online!
Dies setzt voraus, dass die Eingabe ein NumPy-Array ist. Die Ausgabe ist nullindexiert und zuerst vertikal, dann horizontal.
Es konvertiert die Eingabe von,
char
umint
dann den Median des Arrays zu berechnen, bei dem es sich um das Heuhaufenzeichen handelt. Wir subtrahieren das vom Array, was die Nadel zum einzigen Nicht-Null-Element macht. Abschließend geben Sie den Index dieses Elements mit zurücknumpy.where()
.quelle
uint8
für ein Byte weniger verwenden?uint8
ASCII-Codes eingefügt . Ich gehe davon aus, dass Python3 Unicode als Standardeingabeformat für Zeichenfolgen verwendet.Gelee , 5 Bytes
Ausgaben [Höhe, Breite] (1-indiziert).
Probieren Sie es online!
Gelee , 5 Bytes
Probieren Sie es online!
quelle
Gelee , 4 Bytes
Vielleicht hätte das nur ein Kommentar für Mr. Xcoder sein können, es ist ziemlich ähnlich ...
Ein monadischer Link, der die Zeichenmatrix akzeptiert und eine Liste mit einem Element ergibt, wobei die 1-indizierte (Zeile, Spalte) Koordinate von oben links ist.
(... Als vollständiges Programm mit einem Argument, das so formatiert ist, dass das Parsen zu einer Liste von Zeichenlisten führt - das ist eine Liste von Zeichenfolgen im Python-Format -, wird die einzelne Koordinate gedruckt.)
Probieren Sie es online!
Wie?
quelle
EƇ
schlau ist.JavaScript (ES6), 55 Byte
Probieren Sie es online!
JavaScript (ES6),
6564 Byte1 Byte dank @Neil gespeichert
Probieren Sie es online!
Wie?
quelle
~y&1
Speichert ein Byte übery&1^1
.Java 8,
132111 Bytes-8 Bytes (und -13 impliziter) dank @dana .
Eingabe als Zeichenmatrix.
Probieren Sie es online aus.
Erläuterung:
quelle
return
Aussage sollte niemals getroffen werden. Gibt es vielleicht einen besseren Weg, um die äußere Schleife am Laufen zu halten?return"";
ist der nicht erreichbar und kann auch entfernt werden. : D Also -21 Bytes dank dir.unreachable code
Fehlermeldung angezeigt. Wusste nicht, dass das Entfernen des Finalesreturn
die Lösung war.i--
und>
. :) Siehe diese SO Antwort für weitere Informationen. Dasi > 0
wird also zuerst ausgeführt und überprüft, obi
es größer als 0 ist. Danni
wird es mit um 1 verringerti--
, bevor es in den Körper der Schleife gelangt.MATL ,
128 BytesProbieren Sie es online!
Verwendung der
mode
Funktion als Majoritätsdetektor. Gibt 1-basierte Indizes zurück.-4 Zeichen dank @LuisMendo
quelle
find
, auch nicht in MATLAB. (Hi, übrigens!)Wolfram Language
3758 BytesMein früherer Eintrag behandelte den Fall, in dem sich das "ungerade Zeichen heraus" in der oberen linken Ecke der Matrix befand, nicht richtig. Das macht.
Counts@Flatten@#
Listen , wie viele der einzelnen Zeichen sind in dem Array#
.TakeSmallest[...,1]
gibt die am wenigsten häufige Anzahl in Form einer Assoziationsregel zurück, wie z<| "Z"->1|>
Keys...[[1]]
Gibt den "Schlüssel" für das einzige Element in der Zuordnung zurück, das des am wenigsten verwendeten Zeichens. ("Z" im vorliegenden Fall)#~Position~...
Gibt die Position des Schlüssels in der ursprünglichen Matrix zurück#
.quelle
Perl 5
-p00
,5245 Bytes45 Bytes
52 Bytes
Wie
-p00
: wie-n
aber auch drucken, Absatzmodus/^(.)(\1* )*(\1*)|^/
: passt entweder$1
: erstes Zeichen$2
,: Wiederholung (nicht verwendet)$3
,: Zeichen vor der "Nadel" in der Zeile,$&
ganze Übereinstimmung$_=
: um die Standardeingabe- / Argumentvariable zuzuweisen$&=~y/ //
die Anzahl der Zeilenumbrüche von$&
.$".
: verketten mit$"
(Leerzeichen standardmäßig) und verkettenlength$3
: die Länge von$3
quelle
R 42 Bytes
Probieren Sie es online!
Eingabe: eine Heuhaufenmatrix
m
Ausgabe:
(row,col)
Vektor - Index ab1
quelle
f=
in der Byteanzahl weggelassen werden können, aber nicht diefunction(m)=
.C # (Visual C # Interactive Compiler) ,
109108107 ByteFirst () => Last () für -1 Byte
Currying für -1 Byte dank Verkörperung der Ignoranz
Probieren Sie es online!
quelle
J , 22 Bytes
Probieren Sie es online!
NB. Gibt die Antwort im (Zeilen-, Spalten-) Format zurück.
quelle
Python 2 ,
5347 BytesProbieren Sie es online!
Aufruf als
f("########N###########", 5)
(in einem Kommentar erlaubt ). Ausgänge(y, x)
.Erik sparte 6 Bytes und schlug vor, die Ausgabe mit neu zu ordnen
divmod
. Vielen Dank!quelle
divmod
können .PowerShell ,
107988277 ByteProbieren Sie es online!
Nimmt einen splatted String mit LFs. Gibt die mit Nullen indizierte Position x, y zurück. Abgerollt:
quelle
Python 3 , 93 Bytes
Probieren Sie es online!
Die Eingabe erfolgt als mehrzeilige Zeichenfolge. Der Ausgang ist 0-indiziert
quelle
Oktave , 40 Bytes
Port von @ Sundars MATL-Antwort . Die Ausgabe ist ein Vektor mit zwei Elementen mit 1-basierten Spalten- und Zeilenindizes.
Probieren Sie es online!
quelle
Retina 0.8.2 , 41 Bytes
Probieren Sie es online! 0-indiziert. Erläuterung:
Lassen Sie
.
Zeilenumbrüche übereinstimmen. Dies kostet 3 Bytes (das dritte Byte ist das?
vor dem¶
), spart aber 6 Bytes.Suchen Sie nach zwei identischen Zeichen.
\1
dann wird das Heu.Zählen Sie die Anzahl der Zeilenumbrüche vor der Nadel.
Nehmen Sie das Heu links von der Nadel auf.
Stellen Sie sicher, dass die Nadel kein Heu oder eine neue Linie ist.
Passen Sie den Rest des Heus so an, dass das Ergebnis ihn ersetzt.
Geben Sie die Breite des linken Heus und die Anzahl der Zeilenumbrüche aus.
quelle
C # (Visual C # Interactive Compiler) , 82 Byte
Danke an dana für die 6 Bytes!
Probieren Sie es online!
Alte Lösung, 106 Bytes
Beide akzeptieren die Eingabe als Zeichenfolge und als Ganzzahl, die die Anzahl der Spalten angibt.
Probieren Sie es online!
quelle
Enumerable.Last()
ein Delegierter akzeptiert, dankeJava 8, 104 Bytes
Die Eingabe besteht aus einem Array von Zeichen und einer Ganzzahl, die die Zeilenbreite angibt.
Die Ausgabe ist nullbasiert, vertikal und dann horizontal (dh Zeilennummer und dann Spaltennummer).
Erläuterung:
quelle
Python 3 ,
93898558 BytesVollständiges Umschreiben unter Verwendung von Eingaben als
concatenated string, width
:Probieren Sie es online!
Ursprüngliche Antwort:
BEARBEITEN: 4 Bytes durch Austauschen von Zeilenumbruch / Einzug gegen Semikolon gespeichert. Sparte weitere 4 Bytes mit
divmod
(danke @JonathanFrech).Probieren Sie es online!
Ich weiß, dass dies viel kürzer sein könnte, aber ich wollte nur versuchen, dieses
dict
Verständnis zu umgehen.quelle
divmod
würde fünf Bytes einsparen.MATL , 11 Bytes
Ausgabe ist Zeile, dann Spalte; 1-basiert.
Probieren Sie es online!
Erläuterung
quelle
Pyth,
151412 BytesNimmt die Eingabe als Zeilenlänge und die Eingabe ohne Zeilen und Ausgaben als [Zeile, Spalte].
Probieren Sie es hier aus
Erläuterung
Alter Ansatz
Probieren Sie es hier aus
Erläuterung
quelle
Kohle , 40 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Ich muss etwas falsch machen, denn das ist fast so lange, wie die Retina antwortet. Erläuterung:
Überprüfen Sie, ob das zweite Zeichen in der ersten Zeichenfolge auch das erste Zeichen ist, und nehmen Sie gegebenenfalls das erste Zeichen der ersten Zeichenfolge, andernfalls das erste Zeichen der zweiten Zeichenfolge. Das ist dann das Heu.
Lesen Sie die Zeichenfolgen weiter, bis eine Zeichenfolge gefunden wird, deren Heu kürzer als ihre Länge ist.
Geben Sie die Position des nicht übereinstimmenden Elements und dann die Anzahl der zuvor gelesenen Zeichenfolgen aus.
quelle
MATLAB,
6822 Bytes[r,c]=find(v~=v(1));if size(r,1)>1 disp([1,1]);else disp([r,c]);end;
Wenn ich einen Fall wie[1,1]
in dieser Lösung ausschließen könnte, hätte ich mehrere Bytes sparen können.Aktualisierte Lösung :
Vielen Dank an @sundar, der mir bei dem speziellen Fallproblem geholfen und 42 Bytes gespart hat! Danke auch an @Luis_Mendo für die Vorschläge und spart mir noch 2 Bytes!
quelle
[1,1]
Fall mit loswerdenmode(v(:))
anstelle von verwendenv(1)
.v
. Außerdem können Sie wahrscheinlich ersetzen~=
durch-
, und entfernen Sie das letzte;
Röda , 81 Bytes
Probieren Sie es online!
Übernimmt die Eingabe als Zeichenfolge mit Zeilen mit Zeilenumbruch. Gibt einen Stream mit 0-indizierten horizontalen und vertikalen Indizes zurück.
quelle