Encuentra todas las coordenadas en un camino


21

Dada una cadena 2D como entrada, ya sea como una cadena con nuevas líneas o una lista de líneas, genera las coordenadas (x, y)de todos los hashes (# ) en la lista. La entrada solo contendrá hashes y espacios. (y nuevas líneas, si elige tomar la entrada como una cadena 2D)

Si no hay hashes, puede generar cualquier cosa.

La salida no debe ser ambigua en cuanto a qué números están emparejados con cuáles.

Ejemplo:

##

Debería dar salida:

(0,0), (1,0)

Eso supone una indexación basada en 0, comenzando desde la parte superior izquierda. Puede comenzar desde cualquier esquina, usar indexación basada en 0 o 1, y / o salida yprimero. (por ejemplo, en el formulario y,x).

Más casos de prueba (de nuevo, todos usando (x, y)indexación superior izquierda basada en 0 ):

    #
#####
#

(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)

Tenga en cuenta que todos estos casos de prueba se enumeran por filas, no siguiendo la ruta.

Puede suponer que los hashes formarán un rastro continuo, es decir # #, nunca serán la entrada. (probablemente no importará, pero en caso de que alguien quiera expresar esto)

También puede generar las coordenadas en el orden que desee, es decir, columnas verticales, filas horizontales o simplemente una lista sin clasificar.


¿Podemos suponer que la entrada solo contiene hashes y espacios?
DJMcMayhem

@DJMcMayhem sí, editando eso en la pregunta.
Rɪᴋᴇʀ

¿Serían esto o esto formatos de salida válidos?
Zgarb

@ Zgarb básicamente con el 1,1 extra y el hash? Eh, claro.
Rɪᴋᴇʀ

Respuestas:


10

Resbalón , 2 + 1 = 3 bytes

+1 byte para la pbandera. Código:

`#

Explicación:

La pbandera-devuelve la posición de cada ocurrencia de lo siguiente:

`#      // The character '#'

Pruébalo aquí!


1
Creo que tenemos un ganador
Adám

Alguna explicación?
Rɪᴋᴇʀ

@EasterlyIrk La tecla de retroceso escapa a un solo carácter como cadena. La bandera solicita resultados posicionales.
Adám

@ Adám oh, genial!
Rɪᴋᴇʀ

8

Grime , 5 bytes

pa`\#

Pruébalo en línea! El formato de salida es un poco raro, pero OP ha declarado que es válido.

Explicación

Grime es mi lenguaje de coincidencia de patrones 2D. La parte posterior `es el patrón , en este caso un cuadrado de 1 × 1 que contiene un carácter #. Grime buscará una coincidencia en la cuadrícula de entrada e imprimirá la primera que encuentre por defecto. La parte anterior `contiene opciones, en este caso significa que se adeben imprimir todas las coincidencias ( ), junto con sus posiciones y tamaños ( p).


8

MATL , 7 6 5 bytes

Esto está utilizando la indexación basada en 1 con (1,1)en la esquina superior izquierda.

oo&fh

Explicación:

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

¡Gracias @DJMcMayhem y @LuisMendo por cada -1 byte!

Pruébalo en línea!


3
Podrías hacer ooH#fhpara guardar un byte. (convertir a enteros, mod2) Dado que el espacio es par (mod 2 == 0, falso) y #es impar (mod 1 == 1, verdadero)
DJMcMayhem

¡Oh, genial, muchas gracias! =)
error

7

Python , 67 bytes

Esto es en realidad solo un golf de mi respuesta de Stack Overflow sobre un tema similar.

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

Pruébalo en línea!

Recorre la lista 2D, registra los caracteres hash y devuelve el resultado. Guardamos un byte usando en char > '!'lugar de char == '#', porque la entrada solo consistirá en hashes y espacios, por lo que los hashes ( 0x23) serán los únicos caracteres más grandes que los signos de exclamación ( 0x21).


5

JavaScript (ES6), 70 67 bytes

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

Da como resultado una lista de coordenadas separadas por líneas y espacios, por ejemplo

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

Puede acortarse mucho con un formato de salida extraño:

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

Esto salidas

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

para el segundo caso de prueba. Todavía está claro qué números están emparejados con qué ...


5

J , 12 bytes

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

Pruébalo en línea!

Explicación

$#:'#'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.

4

Jalea , 8 bytes

n⁶T€,€"J

Pruébalo en línea!

Dada una matriz 2D de caracteres (= una lista de cadenas):

            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]]]

3

Dyalog APL 16.0, 5 caracteres = 9 bytes o 6 caracteres = 8 bytes

Da una lista de pares (y, x) desde la parte superior izquierda.

⍸⎕='#'

dónde

entrada

= es igual

'#' Este personaje*

* Es posible guardar un carácter a costa de un byte reemplazándolo '#'con ⍕#(formatear el espacio de nombres raíz)

TryAPL en línea! Tenga en cuenta que se ha emulado i porque TryAPL ejecuta la versión 14.0.


Bastante seguro en Dyalog APL que codifica 1 char = 1 byte, ¿no?
devRicher

@devRicher Normalmente, pero no está incluido en la versión de un solo byte. Ver el enlace "bytes".
Adám

3

JavaScript (Firefox 30-57), 61 bytes

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

Devuelve coordenadas basadas en 1. Fácilmente conmutable entre [y, x]y [x, y]pedidos. Sin golf:

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);
        }
    }
}

2

Vim, 37 bytes

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

Como V es en su mayoría compatible con versiones anteriores, ¡puede probarlo en línea!

Una solución directa de expresiones regulares, donde reemplaza cada '#' con la ubicación en la que se encontró (indexación basada en uno). Mientras escribía esto, estaba un poco preocupado porque la ubicación cambiaría después de sustituir la primera en una línea, pero eso no parece ser un problema. TBH Estoy gratamente sorprendido por lo simple que terminó siendo esta solución.

Desafortunadamente, vimscript es muy detallado, por lo que la mayoría de los bytes provienen de la separación de los resultados para que todavía sea legible. De lo contrario, podríamos hacer

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

Pero esto crea resultados que son bastante difíciles de interpretar. Además, solo funcionará si la cuadrícula es siempre 9x9 o menor.

Esta es una solución realmente divertida porque muestra cada par de coordenadas en la ubicación del hash que representa. Por ejemplo, la entrada

# ###
### #

salidas

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

Por supuesto, si estuviéramos usando V, podríamos eliminar la nueva línea final y comprimir la expresión regular. Entonces podría ser simplemente

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

(32 bytes)

Pero dado que este es exactamente el mismo enfoque y sigue siendo dolorosamente detallado, no parece que valga la pena usar un lenguaje de golf.


2
De acuerdo, el conjunto "muestra cada par de coordenadas en la ubicación del hash" es bastante genial. +1
Rɪᴋᴇʀ

2

Haskell, 53 bytes

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

La entrada se toma como una lista de cadenas. La salida es una lista de (x,y)pares (0 indexados), p. Ej.

*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)]

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

Son las 2:30 a.m., estoy en la cama, en mi teléfono. ¿Por qué estoy haciendo esto?


1

Mathematica, 12 bytes

Position@"#"

Operador de forma Position. Asume una matriz 2D de caracteres. 1 indexado a partir de la entrada superior izquierda. Emite una lista de coordenadas en el formulario {row,column}.


La forma en que leo la descripción de la tarea, no creo que se permita tomar una matriz 2D de caracteres para los idiomas que admiten cadenas.
sonríe el


No estoy convencido. Por un lado, esa pregunta se centra en char[], que en realidad es una forma común de almacenar cadenas en lenguajes basados ​​en C. Además, esta descripción de la tarea menciona específicamente "ya sea como una cadena con nuevas líneas o una lista de líneas", y no menciona la lista de listas de caracteres o la matriz de caracteres 2D.
sonríe el

@smls Exactamente. El consenso fue que si una pregunta especifica una cadena, significa una secuencia de caracteres, y si su idioma tiene más de una forma de expresar eso, entonces es libre de elegir el que mejor se adapte a sus necesidades de golf. Especificar "como una cadena con nuevas líneas o una lista de líneas" no hace nada para cambiar eso, ya que si representa cada línea como una matriz de caracteres, obtendrá exactamente una matriz 2D de caracteres.
ngenisis

1

PHP, 69 bytes

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

Utiliza indexación basada en 1 a partir de la esquina superior izquierda.
Usar como:

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

Saldrá:

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

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);}

Salidas de casos de prueba:

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 

Pruébalo en línea!


1

RBX.Lua, 131 bytes

Debe suponer que la entrada es válida (Z es el eje plano, los espacios en blanco son Whitemosaicos, los hash pueden ser de cualquier otro color, la parte superior izquierda se encuentra en 0, 0, 0) y todas las partes son parte del mismo modelo M, y el modelo está vacío.

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

Entrada / salida de muestra:

Ejemplo


¿Puede proporcionar un ejemplo de E / S válido?
Rɪᴋᴇʀ

@EasterlyIrk Allí, editó la respuesta.
devRicher

1

Perl 6 , 25 bytes (22 caracteres)

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

Toma la entrada como una lista de líneas.
Emite una lista por línea, cada una de las cuales contiene (y, x) tuplas para las coordenadas.
Pruébalo en línea!

Cómo funciona

{                    }  # 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))

1

Groovy, 80 68 bytes

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

Entrada de ejemplo:

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

Salida de ejemplo:

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

¿Por qué dividir la entrada en líneas, cuando la descripción de la tarea permite tomar una lista ya dividida de líneas?
sonríe el


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);}

Requiere entrada como matriz de caracteres delimitada por nueva línea, imprime la salida a la pantalla.

Sin golf y uso:

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### #");
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.