Dado un pajar rectangular de tamaño de al menos 2x2 compuesto por todos los mismos caracteres ASCII imprimibles, genera la ubicación (contando desde la parte superior izquierda) de la aguja, que es un carácter diferente.
Por ejemplo, si se ingresa el siguiente pajar:
#####
###N#
#####
#####
El resultado debe ser 3,1
cuando está indexado a cero (lo que usaré en este desafío) o 4,2
cuando está indexado.
El pajar puede estar compuesto de cualquier carácter ASCII imprimible:
^^^
^^^
^N^
^^^
^^^
^^^
salida: 1,2
y la aguja será cualquier otro carácter ASCII imprimible:
jjjjjj
j@jjjj
jjjjjj
salida 1,1
También es posible tener una aguja en la esquina:
Z8
88
salida 0,0
88
8Z
salida 1,1
o para tener la aguja en el borde:
>>>>>>>>>>
>>>>>>>>>:
>>>>>>>>>>
salida 9,1
Reglas y aclaraciones
- La entrada y salida se pueden dar por cualquier método conveniente . Esto significa que puede tomar la entrada como una lista de caracteres, como una sola cadena, etc.
- Puede imprimir el resultado en STDOUT o devolverlo como resultado de una función. Indique en su envío en qué orden está la salida (es decir, horizontal y luego vertical, como se usa en el desafío, o viceversa).
- Un programa completo o una función son aceptables.
- Usted no consigue escoger qué caracteres a utilizar. Ese es el reto.
- Se garantiza que el pajar tendrá un tamaño de al menos 2x2, por lo que no es ambiguo cuál es la aguja y cuál es el heno.
- Solo hay una aguja en la entrada, y solo tiene un carácter de tamaño.
- Las lagunas estándar están prohibidas.
- Este es el código de golf, por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
88\n8Z
(con dos caracteres cualquiera, por supuesto).("########N###########", 5)
Respuestas:
R ,
494744 bytesPruébalo en línea!
Toma la entrada como una matriz, devuelve coordenadas indexadas 1
fuente
which
tarea es vergonzosamente suave.Perl 6 ,
41 3837 bytes3 bytes guardados gracias a @nwellnhof.
1 byte guardado gracias a Jo King.
Pruébalo en línea!
Explicación
Toma la entrada como una lista de listas de caracteres y devuelve una lista de longitud 2 que contiene las coordenadas X e Y basadas en cero de la aguja.
Funciona aplicando el bloque
{[+] ^∞ Z* !<<.&[Z~~]}
en la entrada y en su transposición..&[Z~~]
pasa por todas las columnas del argumento y devuelveTrue
si todos los elementos son iguales, de loFalse
contrario. Luego negamos todos los valores (por lo que tenemos una lista con un bool por columna, donde el bool responde a la pregunta "¿Está la aguja en esa columna?"), Multiplíquelos por elementos con una secuencia 0,1,2. .. (True = 1
yFalse = 0
) y sume la lista, por lo que el resultado de todo el bloque es el número basado en 0 de la columna donde se encontró la aguja.El mejor enfoque de Nwellnhof, Perl 6 , 34 bytes
Pruébalo en línea!
Explicación
Generalmente el mismo enfoque, solo que más efectivo. Se sigue utilizando un bloque de la matriz y su traspuesta, pero ahora el bloque convierte todas las filas en
Sets
y controles para el número de elementos. Lafirst
función da entonces índice (debido a la:k
) de la primera fila que contenía más de 1 elemento. Debido a eso, el orden$_
y la.&[Z]
necesidad de ser intercambiados.fuente
first(:k)
,Set
y.&[Z]
..&[Z]
)..&[op]
no parece ser equivalente a,[op] $_
pero funcionaZ
por alguna razón.Python 2 , 57 bytes
Pruébalo en línea!
Un puerto de esto a Python 3 puede tener 62 bytes :
La comprensión de la lista
[len(set(v))for v in a]
, es más corta que el mapa doble en dos bytes ahora, ya que necesitaría ser convertida en una lista comolist(map(len,map(set,a)))
Pruébalo en línea!
fuente
Brachylog , 20 bytes
Pruébalo en línea!
Salidas
[I,J]
, dondeI
está el índice de fila yJ
el índice de columna, ambos indexados a 0.Estúpidamente largo, pero obtener índices en Brachylog suele ser muy detallado.
Explicación
fuente
PHP ,
9985 bytesUsar una cadena sin líneas nuevas y el ancho (o altura)
('########N###########', 5
) como entrada.Pruébalo en línea!
Sin golf:
Salida:
fuente
chr
: si el segundo parámetro para strpos es un número entero, se interpretará como un código ASCII. -> -5 bytes. 2) Dos parámetros de función$s,$w
pueden guardar otros 9 bytes.05AB1E ,
96 bytesFormato de entrada de conmutación de 3 bytes guardado.
La entrada se toma como una cadena y una longitud de fila.
La salida es una lista del formulario basada en cero
[y, x]
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
.m
...m
antes, pero estaba razonablemente seguro de haberlo visto en algún momento :)Python 3 + NumPy ,
7566 bytes-9 bytes gracias a @ ASCII-only
Pruébalo en línea!
Esto supone que la entrada es una matriz NumPy. La salida está indexada a cero, y primero vertical, luego horizontal.
Convierte la entrada de
char
a yint
luego calcula la mediana de la matriz, que será el carácter de pajar. Restamos eso de la matriz, lo que hace que la aguja sea el único elemento distinto de cero. Finalmente, devuelva el índice de ese elemento connumpy.where()
.fuente
uint8
para un byte menos?uint8
códigos ASCII correctos . Supongo que esto se debe a que Python3 usa Unicode como formato de entrada estándar para cadenas.Jalea , 5 bytes
Salidas [alto, ancho] (1 indexado).
Pruébalo en línea!
Jalea , 5 bytes
Pruébalo en línea!
fuente
Gelatina , 4 bytes
Tal vez esto podría haber sido un comentario para el Sr. Xcoder, es bastante similar ...
Un enlace monádico que acepta la matriz de caracteres que produce una lista de un elemento, la coordenada indexada 1 (fila, columna) desde la parte superior izquierda.
(... Como un programa completo dado un argumento con formato tal que el análisis resulta en una lista de listas de caracteres, es decir, una lista de cadenas en formato Python, se imprime la coordenada única).
Pruébalo en línea!
¿Cómo?
fuente
EƇ
es inteligente.JavaScript (ES6), 55 bytes
Toma entrada como( s ) ( w ) , dónde s es una cuerda y w es el ancho de la matriz. Devoluciones[ x , y] .
Pruébalo en línea!
JavaScript (ES6),
6564 bytesGuardado 1 byte gracias a @Neil
Toma la entrada como una matriz de caracteres. Devoluciones[ x , y] .
Pruébalo en línea!
¿Cómo?
Buscamos el primer personajedo situado en ( x , y) que no aparece en ninguna otra fila r [ Y] . Podemos realizar esta prueba en cualquier fila, siempre queY≠ y . Porque se garantiza que la matriz de entrada sea al menos2 × 2 , simplemente podemos usar Y= 0 Si y es extraño o Y= 1 Si y incluso.
fuente
~y&1
guarda un byte encimay&1^1
.Java 8,
132111bytes-8 bytes (y -13 más implícitamente) gracias a @dana .
Entrada como matriz de caracteres.
Pruébalo en línea.
Explicación:
fuente
return
statement should never get hit. There might be a better way to keep the outer loop going?return"";
is unreachable and can be removed as well. :D So -21 bytes thanks to you.unreachable code
error. Didn't know that removing the finalreturn
was the fix.i--
and>
. :) See this SO answer for more info. So thei > 0
is executed first, checking ifi
is larger than 0. And theni
is decreased by 1 withi--
, before it enters the body of the loop.MATL,
128 bytesTry it online!
Using the
mode
function as the majority-detector. Returns 1-based indices.-4 characters thanks to @LuisMendo
fuente
find
, even in MATLAB. (Hi, btw!)Wolfram Language
3758 bytesMy earlier entry did not correctly handle the case where the "odd character out" was at the upper left corner of the matrix. This does.
Counts@Flatten@#
lists how many of each character are in the array,#
.TakeSmallest[...,1]
returns the least frequent count, in the form of an association rule such as<| "Z"->1|>
Keys...[[1]]
returns the "key" to the only item in the association, that of the least used character. ("Z" in the present case)#~Position~...
returns then position of the key in the original matrix,#
.fuente
Perl 5
-p00
,5245 bytes45 bytes
52 bytes
How
-p00
: like-n
but also print, paragraph mode/^(.)(\1* )*(\1*)|^/
: matches either$1
: first character,$2
: repetition (not used),$3
: characters before the "needle" in the line,$&
whole match$_=
: to assign the default input/argument variable$&=~y/ //
the number of newlines of$&
.$".
: concatenate with$"
(space character by default) and concatenatelength$3
: the length of$3
fuente
R 42 bytes
Try it online!
Input: a haystack matrix
m
Output:
(row,col)
vector - index starting at1
fuente
f=
can be omitted from the byte count, but not thefunction(m)=
.C# (Visual C# Interactive Compiler),
109108107 bytesFirst() => Last() for -1 byte
currying for -1 byte thanks to Embodiment of Ignorance
Try it online!
fuente
J, 22 bytes
Try it online!
NB. returns answer in (row, column) format.
fuente
Python 2,
5347 bytesTry it online!
Call as
f("########N###########", 5)
(allowed in a comment). Outputs(y, x)
.Erik saved 6 bytes, suggesting rearranging the output + using
divmod
. Thanks!fuente
divmod
builtin.PowerShell,
107988277 bytesTry it online!
Takes a splatted string with LFs. Returns zero-indexed location x,y. Unrolled:
fuente
Python 3, 93 bytes
Try it online!
Input is taken as a multiline string. Output is 0-indexed
fuente
Octave, 40 bytes
Port of @sundar's MATL answer. Output is a two-element vector with 1-based column and row indices.
Try it online!
fuente
Retina 0.8.2, 41 bytes
Try it online! 0-indexed. Explanation:
Allow
.
to match newlines. This costs 3 bytes (3rd byte is the?
before the¶
) but saves 6 bytes.Look ahead for two identical characters.
\1
then becomes the hay.Count the number of newlines before the needle.
Capture the hay to the left of the needle.
Ensure that the needle isn't hay or a newline.
Match the rest of the hay so that the result replaces it.
Output the width of the left hay and the number of newlines.
fuente
C# (Visual C# Interactive Compiler), 82 bytes
Thanks to dana for shaving off 6 bytes!
Try it online!
Old solution, 106 bytes
Both take input as a string and an integer specifying the amount of columns.
Try it online!
fuente
Enumerable.Last()
accepted a delegate, thanksJava 8, 104 Bytes
Input is array of char, and integer indicating row width.
Output is zero-based, vertical then horizontal (i.e., row number then column number)
Explanation:
fuente
Python 3,
93898558 bytesComplete rewrite taking input as
concatenated string, width
:Try it online!
Original answer:
EDIT: Saved 4 bytes by swapping linebreak/indent for semicolons. Saved another 4 bytes by using
divmod
(thanks @JonathanFrech).Try it online!
I know this could be a lot shorter, but I just wanted to try an approach around this
dict
comprehension.fuente
divmod
would save five bytes.MATL, 11 bytes
Output is row, then column; 1-based.
Try it online!
Explanation
fuente
Pyth,
151412 bytesTakes input as the length of the row and the input without lines and outputs as [row, column].
Try it here
Explanation
Old approach
Try it here
Explanation
fuente
Charcoal, 40 bytes
Try it online! Link is to verbose version of code. I must be doing something wrong because this is almost as long as the Retina answer. Explanation:
Check whether the second character in the first string is also the first character, and take the first character of the first string if so otherwise the first character of the second string if not. This is then the hay.
Keep reading strings until a string whose hay is less than its length is found.
Output the position of the mismatching element and then the number of strings previously read.
fuente
MATLAB,
6822 bytes[r,c]=find(v~=v(1));if size(r,1)>1 disp([1,1]);else disp([r,c]);end;
If I could exclude any one case, such as[1,1]
in this solution, I could have saved several bytes.Updated solution:
Thanks to @sundar for helping me with the special case problem and saving 42 bytes! Also, thanks to @Luis_Mendo for the suggestions and saving me another 2 bytes!
fuente
[1,1]
case by usingmode(v(:))
instead ofv(1)
.v
. Also, you can probably replace~=
by-
, and remove the final;
Röda, 81 bytes
Try it online!
Takes input as a string containing newline-terminated lines. Returns a stream containing 0-indexed horizontal and vertical indexes.
fuente