Dado um palheiro retangular de tamanho pelo menos 2x2 composto pelos mesmos caracteres ASCII imprimíveis, produza a localização (contando a partir do canto superior esquerdo) da agulha, que é um caractere diferente.
Por exemplo, se o seguinte palheiro for inserido:
#####
###N#
#####
#####
A saída deve ser 3,1
quando indexada a zero (o que vou usar neste desafio) ou 4,2
quando indexada a uma.
O palheiro pode ser composto por qualquer caractere ASCII imprimível:
^^^
^^^
^N^
^^^
^^^
^^^
saída: 1,2
e a agulha terá qualquer outro caractere ASCII imprimível:
jjjjjj
j@jjjj
jjjjjj
saída 1,1
Também é possível ter uma agulha no canto:
Z8
88
saída 0,0
88
8Z
saída 1,1
ou para ter a agulha na borda:
>>>>>>>>>>
>>>>>>>>>:
>>>>>>>>>>
saída 9,1
Regras e esclarecimentos
- A entrada e a saída podem ser fornecidas por qualquer método conveniente . Isso significa que você pode receber informações como uma lista de caracteres, como uma única sequência, etc.
- Você pode imprimir o resultado em STDOUT ou retorná-lo como resultado da função. Indique em sua submissão em que ordem a saída está (por exemplo, horizontal e vertical, conforme usado no desafio ou vice-versa).
- Um programa completo ou uma função são aceitáveis.
- Você não escolhe quais caracteres usar. Esse é o desafio.
- É garantido que o palheiro tenha pelo menos 2x2 de tamanho, por isso é inequívoco qual é a agulha e qual é o feno.
- Existe apenas uma agulha na entrada e apenas um caractere.
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
88\n8Z
(com dois caracteres, é claro).("########N###########", 5)
Respostas:
R ,
494744 bytesExperimente online!
Recebe entrada como uma matriz, retorna coordenadas indexadas em 1
fonte
which
tarefa é vergonhosamente suave.Perl 6 ,
41 3837 bytes3 bytes salvos graças a @nwellnhof.
1 byte economizado graças a Jo King.
Experimente online!
Explicação
Ele recebe a entrada como uma lista de listas de caracteres e retorna uma lista de comprimento 2 contendo as coordenadas X e Y baseadas em zero da agulha.
Ele funciona aplicando o bloco
{[+] ^∞ Z* !<<.&[Z~~]}
na entrada e na sua transposição..&[Z~~]
passa por todas as colunas do argumento e retornaTrue
se todos os elementos forem iguais,False
caso contrário. Negamos então todos os valores (para que tenhamos uma lista com um bool por coluna, onde o bool responde à pergunta "A agulha está nessa coluna?"), Multiplique-os por elemento com uma sequência 0,1,2 ,. .. (True = 1
eFalse = 0
) e somar a lista, para que o resultado de todo o bloco seja o número baseado em 0 da coluna onde a agulha foi encontrada.Melhor abordagem de Nwellnhof, Perl 6 , 34 bytes
Experimente online!
Explicação
Geralmente a mesma abordagem, apenas mais eficaz. Ele ainda usa um bloco na matriz e sua transposição, mas agora o bloco converte todas as linhas em
Sets
e verifica o número de elementos. Afirst
função fornece o índice (devido ao:k
) da primeira linha que continha mais de 1 elemento. Por esse motivo, a ordem$_
e.&[Z]
precisava ser trocada.fonte
first(:k)
,Set
e.&[Z]
..&[Z]
.).&[op]
não parece ser equivalente,[op] $_
mas funcionaZ
por algum motivo.Python 2 , 57 bytes
Experimente online!
Uma porta disso para o Python 3 pode ter 62 bytes :
A compreensão da lista,,
[len(set(v))for v in a]
é menor do que o mapa duplo em dois bytes agora, pois precisaria ser convertida em uma lista comolist(map(len,map(set,a)))
Experimente online!
fonte
Braquilog , 20 bytes
Experimente online!
Saídas
[I,J]
, ondeI
estão o índice de linha eJ
o índice de coluna, ambos indexados em 0.Estupidamente longo, mas obter índices no Brachylog geralmente é muito detalhado.
Explicação
fonte
PHP ,
9985 bytesUsando string sem novas linhas e a largura (ou altura)
('########N###########', 5
) como entrada.Experimente online!
Ungolfed:
Saída:
fonte
chr
: se o segundo parâmetro para strpos for um número inteiro, ele será interpretado como um código ASCII. -> -5 bytes. 2) Dois parâmetros de função$s,$w
podem salvar outros 9 bytes.05AB1E ,
96 bytes3 bytes salvos mudando o formato de entrada.
A entrada é tomada como uma sequência e um comprimento de linha.
Saída é uma lista baseada em zero do formulário
[y, x]
Experimente online! ou como um conjunto de testes
Explicação
fonte
.m
...m
antes, mas tinhaPython 3 + NumPy ,
7566 bytes-9 bytes graças a @ ASCII-only
Experimente online!
Isso pressupõe que a entrada seja uma matriz NumPy. A saída é indexada a zero, primeiro vertical e depois horizontal.
Ele converte a entrada de
char
paraint
então calcula a mediana da matriz, que será o caractere do palheiro. Subtraímos isso da matriz, o que torna a agulha o único elemento diferente de zero. Por fim, retorne o índice desse elemento comnumpy.where()
.fonte
uint8
um byte a menos?uint8
códigos ASCII corretos . Suponho que isso ocorre porque o Python3 usa Unicode como formato de entrada padrão para strings.Gelatina , 5 bytes
Saídas [altura, largura] (indexadas em 1).
Experimente online!
Gelatina , 5 bytes
Experimente online!
fonte
Gelatina , 4 bytes
Talvez isso possa ter sido apenas um comentário para o Sr. Xcoder, é bem parecido ...
Um link monádico que aceita a matriz de caracteres que produz uma lista de um item, a coordenada 1 indexada (linha, coluna), coordenada a partir do canto superior esquerdo.
(... Como um programa completo, com um argumento formatado para que a análise resulte em uma lista de listas de caracteres - ou seja, uma lista de cadeias de caracteres no formato Python - a coordenada única é impressa.)
Experimente online!
Quão?
fonte
EƇ
é inteligente.JavaScript (ES6), 55 bytes
Experimente online!
JavaScript (ES6),
6564 bytesGuardado 1 byte graças a @Neil
Experimente online!
Quão?
Procuramos o primeiro personagemc ( x , y) r [ Y] Y≠ y 2 × 2 Y= 0 y Y= 1 y
fonte
~y&1
salva um bytey&1^1
.Java 8,
132111 bytes-8 bytes (e -13 mais implicitamente) graças a @dana .
Entrada como matriz de caracteres.
Experimente online.
Explicação:
fonte
return
declaração final nunca deve ser atingida. Pode haver uma maneira melhor de manter o loop externo funcionando?return"";
é inacessível e pode ser removido também. : D Então -21 bytes, graças a você.unreachable code
erro. Não sabia que remover a finalreturn
era a solução.i--
e>
. :) Veja esta resposta para mais informações. Portanto, oi > 0
é executado primeiro, verificando sei
é maior que 0. E depoisi
é diminuído em 1 comi--
, antes de entrar no corpo do loop.MATL ,
128 bytesExperimente online!
Usando a
mode
função como detector majoritário. Retorna índices baseados em 1.-4 caracteres graças a @LuisMendo
fonte
find
, mesmo no MATLAB. (Oi, btw!)Wolfram Language
3758 bytesMinha entrada anterior não tratou corretamente o caso em que o "caractere ímpar" estava no canto superior esquerdo da matriz. Isso faz.
Counts@Flatten@#
lista quantos de cada caractere há na matriz#
,.TakeSmallest[...,1]
retorna a contagem menos frequente, na forma de uma regra de associação como<| "Z"->1|>
Keys...[[1]]
retorna a "chave" para o único item da associação, o do caractere menos usado. ("Z" no presente caso)#~Position~...
retorna a posição da chave na matriz original#
,.fonte
Perl 5
-p00
,5245 bytes45 bytes
52 bytes
Quão
-p00
: como-n
mas também imprimir, modo de parágrafo/^(.)(\1* )*(\1*)|^/
: corresponde a$1
: primeiro caractere$2
,: repetição (não usada)$3
,: caracteres antes da "agulha" na linha,$&
correspondência inteira$_=
: para atribuir a variável de entrada / argumento padrão$&=~y/ //
o número de novas linhas de$&
.$".
: concatenar com$"
(caractere de espaço por padrão) e concatenarlength$3
: o comprimento do$3
fonte
R 42 bytes
Experimente online!
Entrada: uma matriz de palheiro
m
Saída:
(row,col)
vetor - índice a partir de1
fonte
f=
pode ser omitido da contagem de bytes, mas não ofunction(m)=
.C # (compilador interativo do Visual C #) ,
109108107 bytesPrimeiro () => Último () para -1 byte
currying para -1 byte graças a Modalidade de Ignorância
Experimente online!
fonte
J , 22 bytes
Experimente online!
NB. retorna resposta no formato (linha, coluna).
fonte
Python 2 ,
5347 bytesExperimente online!
Ligue como
f("########N###########", 5)
(permitido em um comentário ). Saídas(y, x)
.Erik salvou 6 bytes, sugerindo reorganizar a saída + usando
divmod
. Obrigado!fonte
divmod
interno .PowerShell ,
107988277 bytesExperimente online!
Toma uma sequência de splatted com LFs. Retorna o local indexado a zero x, y. Desenrolado:
fonte
Python 3 , 93 bytes
Experimente online!
A entrada é tomada como uma sequência multilinha. A saída é indexada em 0
fonte
Oitava , 40 bytes
Resposta MATL do porto de @ sundar . Saída é um vetor de dois elementos com índices de coluna e linha com base em 1.
Experimente online!
fonte
Retina 0.8.2 , 41 bytes
Experimente online! Indexado a 0. Explicação:
Permitir
.
a correspondência de novas linhas. Isso custa 3 bytes (o terceiro byte é?
anterior ao¶
), mas economiza 6 bytes.Olhe para a frente para dois caracteres idênticos.
\1
então se torna o feno.Conte o número de novas linhas antes da agulha.
Capture o feno à esquerda da agulha.
Verifique se a agulha não é de feno ou uma nova linha.
Combine o restante do feno para que o resultado o substitua.
Saída a largura do feno esquerdo e o número de novas linhas.
fonte
C # (compilador interativo do Visual C #) , 82 bytes
Graças à dana por eliminar 6 bytes!
Experimente online!
Solução antiga, 106 bytes
Ambos recebem a entrada como uma sequência e um número inteiro, especificando a quantidade de colunas.
Experimente online!
fonte
Enumerable.Last()
aceitou um delegado, obrigadoJava 8, 104 bytes
A entrada é uma matriz de caracteres e inteiro indicando a largura da linha.
A saída é baseada em zero, vertical e horizontal (ou seja, número da linha e número da coluna)
Explicação:
fonte
Python 3 ,
93898558 bytesReescrita completa, tendo a entrada como
concatenated string, width
:Experimente online!
Resposta original:
EDIT: salvou 4 bytes trocando quebra de linha / recuo por ponto e vírgula. Salvo outros 4 bytes usando
divmod
(obrigado @JonathanFrech).Experimente online!
Eu sei que isso poderia ser muito mais curto, mas eu só queria tentar uma abordagem em torno dessa
dict
compreensão.fonte
divmod
economizaria cinco bytes.MATL , 11 bytes
Saída é linha, depois coluna; Baseado em 1.
Experimente online!
Explicação
fonte
Pitão,
151412 bytesToma a entrada como o comprimento da linha e a entrada sem linhas e sai como [linha, coluna].
Experimente aqui
Explicação
Abordagem antiga
Experimente aqui
Explicação
fonte
Carvão , 40 bytes
Experimente online! Link é a versão detalhada do código. Eu devo estar fazendo algo errado, porque isso é quase o tempo que a Retina responde. Explicação:
Verifique se o segundo caractere na primeira string também é o primeiro caractere e, se não houver, pegue o primeiro caractere da primeira string, caso contrário, o primeiro caractere da segunda string. Este é então o feno.
Continue lendo as strings até encontrar uma string cujo feno seja menor que seu comprimento.
Saída a posição do elemento incompatível e, em seguida, o número de sequências lidas anteriormente.
fonte
MATLAB,
6822 bytes[r,c]=find(v~=v(1));if size(r,1)>1 disp([1,1]);else disp([r,c]);end;
Se eu pudesse excluir qualquer caso, como[1,1]
nesta solução, poderia ter salvo vários bytes.Solução atualizada :
Agradeço ao @sundar por me ajudar com o problema do caso especial e salvar 42 bytes! Além disso, obrigado a @Luis_Mendo pelas sugestões e me poupando mais 2 bytes!
fonte
[1,1]
caso usando emmode(v(:))
vez dev(1)
.v
. Além disso, você provavelmente pode substituir~=
por-
e remover a final;
Röda , 81 bytes
Experimente online!
Recebe entrada como uma sequência contendo linhas terminadas por nova linha. Retorna um fluxo contendo índices horizontais e verticais indexados a 0.
fonte