Finde alle Koordinaten auf einem Pfad

21

Geben Sie bei einer 2D-Zeichenfolge als Eingabe, entweder als Zeichenfolge mit Zeilenumbrüchen oder als Liste mit Zeilen, die Koordinaten (x, y)aller Hashes ( #) in der Liste aus. Die Eingabe enthält nur Hashes und Leerzeichen. (und Zeilenumbrüche, wenn Sie Eingaben als 2D-Zeichenfolge übernehmen möchten)

Wenn keine Hashes vorhanden sind, können Sie alles ausgeben.

Die Ausgabe sollte eindeutig sein, welche Nummern mit welchen gepaart werden.

Beispiel:

##

Sollte ausgeben:

(0,0), (1,0)

Dies setzt eine 0-basierte Indizierung voraus, beginnend von links oben. Sie können an jeder Ecke beginnen, die 0- oder 1-basierte Indizierung verwenden und / oder yzuerst ausgeben . (zB im Formular y,x).

Weitere Testfälle (wiederum alle mit 0-basierter (x, y)Indizierung oben links ):

    #
#####
#

(4, 0), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (0, 2)


# ###
### #

(0, 0), (2, 0), (3, 0), (4, 0), (0, 1), (1, 1), (2, 1), (4, 1)

Beachten Sie, dass diese Testfälle alle zeilenweise aufgelistet sind und nicht dem Pfad folgen.

Sie können davon ausgehen, dass die Hashes einen kontinuierlichen Pfad bilden, dh # #niemals die Eingabe sein werden. (Wahrscheinlich spielt es keine Rolle, aber für den Fall, dass jemand dies regulieren möchte)

Sie können die Koordinaten auch in beliebiger Reihenfolge ausgeben, z. B. vertikale Spalten, horizontale Zeilen oder nur eine unsortierte Liste.

Rɪᴋᴇʀ
quelle
Können wir annehmen, dass die Eingabe nur Hashes und Leerzeichen enthält?
DJMcMayhem
@DJMcMayhem ja, das in die Frage bearbeiten.
4.
Wäre dies oder dies ein gültiges Ausgabeformat?
Zgarb
@Zgarb im Grunde mit der zusätzlichen 1,1 und dem Hash? Ähm, klar.
4.
Wäre mein alternatives Format gültig?
ETHproductions

Antworten:

10

Beleg , 2 + 1 = 3 Bytes

+1 Byte für das pFlag. Code:

`#

Erläuterung:

Das p-Flag gibt die Position jedes Vorkommens von Folgendem zurück:

`#      // The character '#'

Probieren Sie es hier aus!

Adnan
quelle
1
Ich denke, wir haben einen Gewinner
Adám
Irgendeine Erklärung?
4.
@EasterlyIrk Das Backtick maskiert ein einzelnes Zeichen als Zeichenfolge. Das Flag fordert Positionsergebnisse an.
Adám
@Adam oh, cool!
4.
8

Schmutz , 5 Bytes

pa`\#

Probieren Sie es online! Das Ausgabeformat ist ein bisschen funky, aber OP hat angegeben, dass es gültig ist.

Erläuterung

Schmutz ist meine 2D-Pattern-Matching-Sprache. Der folgende Teil `ist das Muster , in diesem Fall ein 1 × 1-Quadrat, das ein #-Zeichen enthält. Grime durchsucht das Eingaberaster nach einer Übereinstimmung und druckt das erste, das es standardmäßig findet. Der `vorherige Teil enthält Optionen. In diesem Fall bedeutet dies, dass alle Übereinstimmungen ( a) mit ihren Positionen und Größen ( p) gedruckt werden sollen .

Zgarb
quelle
8

MATL , 7 6 5 Bytes

Hierbei wird die 1-basierte Indizierung mit (1,1)in der oberen linken Ecke verwendet.

oo&fh

Erläuterung:

o        % convert char to double 
 o       % remainder mod 2 ('#' == 35, ' '==32) makes spaces falsy
  &f     % apply `find` with 2d-output 
    h   % concatenate outputs to display x- and y-coordinates side by side

Vielen Dank an @DJMcMayhem und @LuisMendo für jedes -1 Byte!

Probieren Sie es online!

fehlerhaft
quelle
3
Sie könnten tun ooH#fh, um ein Byte zu speichern. (konvertiere in ganze Zahlen, mod2) Da der Raum gerade ist (mod 2 == 0, falsy) und #ungerade ist (mod 1 == 1, truthy)
DJMcMayhem
Oh, toll, vielen Dank! =)
Fehler
7

Python , 67 Bytes

Dies ist eigentlich nur ein Golf meiner Stack Overflow-Antwort zu einem ähnlichen Thema.

lambda a,e=enumerate:[[(i,j)for j,B in e(A)if'!'<B]for i,A in e(a)]

Probieren Sie es online!

Die Schleife durchläuft die 2D-Liste, zeichnet die Hash-Zeichen auf und gibt das Ergebnis zurück. Wir sparen ein Byte, indem wir char > '!'anstatt verwenden char == '#', da die Eingabe nur aus Hashes und Leerzeichen besteht und daher Hashes ( 0x23) die einzigen Zeichen sind, die größer als Ausrufezeichen ( 0x21) sind.

FlipTack
quelle
5

JavaScript (ES6), 70 bis 67 Byte

s=>s.replace(/./g,(c,i)=>c>' '?[i%l,i/-l|0]+' ':'',l=~s.indexOf`
`)

Gibt eine durch Zeilenumbrüche und Leerzeichen getrennte Liste von Koordinaten aus, z

4,0
0,1 1,1 2,1 3,1 4,1
0,2

Sie können mit einem seltsamen Ausgabeformat viel kürzer werden:

s=>s.replace(/#/g,(c,i)=>[i%l,i/-l|0]+c,l=~s.indexOf`
`)

Dies gibt aus

    4,0#
0,1#1,1#2,1#3,1#4,1#
0,2#

für den zweiten Testfall. Es ist immer noch klar, welche Nummern mit welchen gepaart sind ...

ETHproductions
quelle
5

J , 12 Bytes

$#:'#'I.@:=,

Probieren Sie es online!

Erläuterung

$#:'#'I.@:=,  Input is y.
           ,  Flatten y
   '#'    =   and form bit vector of equality with #.
      I.@:    Compute positions of 1s
 #:           and convert each to base
$             shape of y.
Zgarb
quelle
4

Gelee , 8 Bytes

n⁶T€,€"J

Probieren Sie es online!

Gegeben ein 2D-Array von Zeichen (= eine Liste von Zeichenfolgen):

            Implicit input (example):
               [[' ', ' ', ' ', ' ', '#']
               ,['#', '#', '#', '#', '#']
               ,['#', ' ', ' ', ' ', ' ']]
n⁶          Not-equal to space (⁶).
               [[0, 0, 0, 0, 1]
               ,[1, 1, 1, 1, 1]
               ,[1, 0, 0, 0, 0]]
  T€        Indices of 1s in each row
               [[5], [1,2,3,4,5], [1]]
    ,€"J    Pair each, vectorizing, with y-indices
               [[[5,1]], [[1,2],[2,2],[3,2],[4,2],[5,2]], [[1,3]]]
Lynn
quelle
3

Dyalog APL 16.0, 5 Zeichen = 9 Byte oder 6 Zeichen = 8 Byte

Gibt eine Liste von (y, x) Paaren von oben links.

⍸⎕='#'

woher

Eingang

= gleich

'#' dieser Charakter*

* Es ist möglich, ein Zeichen zum Preis von einem Byte zu speichern, indem Sie es '#'durch ⍕#(Formatieren des Stammnamensraums) ersetzen.

TryAPL online! Beachten Sie, dass mit emuliert wurde, i da TryAPL Version 14.0 ausführt.

Adam
quelle
Ziemlich sicher in Dyalog APL Codierung 1 Zeichen = 1 Byte, nein?
DevRicher
@devRicher Normalerweise, aber nicht in der Einzelbyte- Version enthalten. Siehe den Link "Bytes".
Adám
3

JavaScript (Firefox 30-57), 61 Byte

s=>[for(c of(x=0,y=1,s))if(c<' '?(y++,x=0):(x++,c>' '))[y,x]]

Gibt 1-basierte Koordinaten zurück. Leicht umschaltbar zwischen [y, x]und [x, y]Bestellung. Ungolfed:

function coords(s) {
    var x = 0;
    var y = 1;
    for (Var c of s) {
        if (c == "\n") {
            y++;
            x=0;
        } else {
            x++;
        }
        if (c == "#") {
            console.log(y, x);
        }
    }
}
Neil
quelle
2

Vim, 37 Bytes

:%s/#/\=line('.').','.col('.').' '/g<cr>

Da V überwiegend abwärtskompatibel ist, können Sie es online ausprobieren!

Eine einfache Regex-Lösung, bei der jedes '#' durch die Position ersetzt wird, an der es gefunden wurde (einseitige Indizierung). Ich war ein bisschen besorgt, als ich dies schrieb, dass sich die Position nach dem Ersetzen der ersten Zeile in einer Zeile ändern würde, aber das scheint kein Problem zu sein. TBH Ich bin angenehm schockiert, wie einfach diese Lösung letztendlich war.

Leider ist Vimscript sehr ausführlich, daher stammen die meisten Bytes aus der Trennung der Ergebnisse, sodass sie noch lesbar sind. Ansonsten könnten wir tun

:%s/#/\=line('.').col('.')/g

Dies erzeugt jedoch eine Ausgabe, die ziemlich schwer zu interpretieren ist. Außerdem funktioniert es nur, wenn das Raster immer 9x9 oder kleiner ist.

Dies ist eine wirklich unterhaltsame Lösung, da jedes Koordinatenpaar an der Position des Hashs angezeigt wird, den es darstellt. Zum Beispiel die Eingabe

# ###
### #

Ausgänge

1,1  1,3 1,4 1,5 
2,1 2,2 2,3  2,5 

Wenn wir V verwenden würden, könnten wir natürlich die abschließende Newline entfernen und den regulären Ausdruck komprimieren. Dann könnte es einfach sein

Í#/½line('.').','.col('.').' '/g

(32 Bytes)

Aber da dies genau derselbe Ansatz ist und immer noch schmerzhaft wortreich, scheint es sich nicht zu lohnen, eine Golfsprache zu verwenden.

DJMcMayhem
quelle
2
Okay, das Ganze "zeigt jedes Koordinatenpaar am Ort des Hash" ist verdammt cool. +1
Rɪᴋᴇʀ
2

Haskell, 53 Bytes

concat.zipWith(\y l->[(x,y)|(x,'#')<-zip[0..]l])[0..]

Die Eingabe wird als Liste von Zeichenfolgen verwendet. Die Ausgabe ist eine Liste von (x,y)Paaren (0 indiziert), z

*Main> concat.zipWith(\y l->[(x,y)|(x,'#')<-zip[0..]l])[0..] $ ["# ###","### #"]
[(0,0),(2,0),(3,0),(4,0),(0,1),(1,1),(2,1),(4,1)]
nimi
quelle
2

Lua, 141 Bytes

w=io.read()x=w:sub(1,w:find("\n")-1):len()_,c=w:gsub("\n","")for i=0,x do for j=0,c+1 do if w:sub(c*x+i,c*x+i)=="#"then print(i,j)end end end

Es ist halb drei, ich bin im Bett und telefoniere. Warum mache ich das?

devRicher
quelle
1

Mathematica, 12 Bytes

Position@"#"

Betreiberformular von Position. Nimmt ein 2D-Array von Zeichen an. 1-indiziert ab dem linken oberen Eintrag. Gibt eine Liste der Koordinaten im Formular aus {row,column}.

Genisis
quelle
So wie ich die Aufgabenbeschreibung gelesen habe, ist es meiner Meinung nach nicht zulässig, ein 2D-Array von Zeichen für Sprachen zu verwenden, die Zeichenfolgen unterstützen.
smls
Ich bin nicht überzeugt. Zum einen geht es bei dieser Frage darum, char[]wie man Strings in C-basierten Sprachen speichert. In dieser Aufgabenbeschreibung wird auch ausdrücklich "entweder als Zeichenfolge mit Zeilenumbrüchen oder als Liste von Zeilen" erwähnt, und es werden keine Liste-von-Listen-von-Zeichen oder 2D-Matrix von Zeichen erwähnt.
smls
@smls Genau. Der Konsens war, dass, wenn eine Frage eine Zeichenfolge angibt, dies eine Folge von Zeichen bedeutet, und wenn Ihre Sprache mehr als eine Möglichkeit hat, dies auszudrücken, Sie diejenige wählen können, die Ihren Golfanforderungen entspricht. Die Angabe von "entweder als Zeichenfolge mit Zeilenumbrüchen oder als Liste von Zeilen" ändert nichts daran, dass Sie genau ein 2D-Zeichenarray erhalten, wenn Sie jede Zeile als Zeichenarray darstellen.
Genisis
1

PHP, 69 Bytes

for(;$a=$argv[++$i];)for($j=0;""<$c=$a[$j++];)echo$c>" "?"$j $i,":"";

Verwendet 1-basierte Indizierung, beginnend von links oben.
Verwenden Sie wie:

php -r 'for(;$a=$argv[++$i];)for($j=0;""<$c=$a[$j++];)if($c>" ")echo"$j $i,";' '    #' '#####' '#    '

Wird ausgeben:

5 1,1 2,2 2,3 2,4 2,5 2,1 3,
user59178
quelle
1

C 113 Bytes

i,j,k,l;f(char**p){i=strlen(*p);l=strlen(p);for(j=0;j<l;j++)for(k=0;k<i;k++)if(p[j][k]==35)printf("%d,%d ",k,j);}

Ausgaben von Testfällen:

0,0 2,0 3,0 4,0 0,1 1,1 2,1 4,1 
4,0 0,1 1,1 2,1 3,1 4,1 0,2 

Probieren Sie es online!

betseg
quelle
1

RBX.Lua, 131 Bytes

Es muss davon ausgegangen werden, dass die Eingabe gültig ist (Z ist die flache Achse, Leerzeichen sind WhiteKacheln, Hashes können jede andere Farbe haben, der linke obere Teil befindet sich bei0, 0, 0 ) und alle Teile sind Teil desselben Modells M, und das Modell ist ansonsten leer.

for k,v in pairs(workspace.M:GetChildren())do if v.BrickColor~=BrickColor.new("White")then print(v.Position.X,-v.Position.Y)end end

Beispiel Input / Output:

Beispiel

devRicher
quelle
Können Sie ein gültiges E / A-Beispiel angeben?
5.
@EasterlyIrk Dort wurde die Antwort bearbeitet.
devRicher
1

Perl 6 , 25 Bytes (22 Zeichen)

{^∞ZX@_».indices("#")}

Nimmt die Eingabe als eine Liste von Zeilen.
Gibt eine Liste pro Zeile aus, die jeweils (y, x) Tupel für die Koordinaten enthält.
Probieren Sie es online!

Wie es funktioniert

{                    }  # A lambda.
{    @_»             }  # For each input line:
        .indices("#")   #    get x-coordinates.  (4) (0 1 2 3 4) (0)
 ^∞                     # Range from 0 to Inf.    0   1           2 ...
   Z                    # Zip with:              (0 (4)) (1 (0 1 2 3 4)) (2 (0))
    X                   #    Cartesian product.  ((0 4)) ((1 0) (1 1) (1 2) (1 3) (1 4)) ((2 0))
smls
quelle
1

Groovy, 80 68 Bytes

{y=0;it.each{it.eachWithIndex{x,i->print(x=='#'?"($i,$y)":"")};y++}}

Beispiel Eingabe:

[#   #,#   #,#####]

Beispielausgabe:

(0,0)(4,0)(0,1)(4,1)(0,2)(1,2)(2,2)(3,2)(4,2)
Magische Kraken-Urne
quelle
Warum die Eingabe in Zeilen aufteilen, wenn die Aufgabenbeschreibung eine bereits aufgeteilte Zeilenliste erlaubt?
smls
0

C 80 Bytes

x,y;f(char*s){for(x=y=0;*s;printf(*s-35?"":"%d,%d ",x,y),*s++==10?++y,x=0:++x);}

Erfordert die Eingabe als durch Zeilenumbrüche getrenntes Zeichen-Array und druckt die Ausgabe auf dem Bildschirm.

Ungolfed & Nutzung:

x,y;

f(char*s){
 for(
  x = y = 0;             //init coordinates
  *s;                //iterate until end
  printf(*s-35 ? "" : "%d,%d ", x, y),     //print coordinates or empty string
  *s++==10 ? ++y, x=0 : ++x              //advance to the right or the next line
 );
}


main(){
 f("    #\n#####\n#    ");
 puts("");
 f("# ###\n### #");
}
Karl Napf
quelle
1
78 Bytes:x,y;f(char*s){for(x=y=0;*s;*s++==10?++y,x=0:++x)*s==35&&printf("%d,%d ",x,y);}
Gastropner