Aqui está um simples rubi de arte ASCII :
___
/\_/\
/_/ \_\
\ \_/ /
\/_\/
Como joalheiro da ASCII Gemstone Corporation, seu trabalho é inspecionar os rubis recém-adquiridos e deixar uma nota sobre os defeitos encontrados.
Felizmente, apenas 12 tipos de defeitos são possíveis, e seu fornecedor garante que nenhum rubi terá mais de um defeito.
Os defeitos 12 correspondem à substituição de um dos 12 interiores _
, /
ou \
caracteres do rubi com um carácter de espaço ( ). O perímetro externo de um rubi nunca apresenta defeitos.
Os defeitos são numerados de acordo com o caráter interno que possui um espaço em seu lugar:
Portanto, um rubi com defeito 1 se parece com isso:
___
/\_/\
/_/ _\
\ \_/ /
\/_\/
Um rubi com defeito 11 se parece com isso:
___
/\_/\
/_/ \_\
\ \_/ /
\ _\/
É a mesma idéia para todos os outros defeitos.
Desafio
Escreva um programa ou função que utilize a sequência de um único rubi potencialmente defeituoso. O número do defeito deve ser impresso ou devolvido. O número do defeito é 0 se não houver defeito.
Obtenha entrada de um arquivo de texto, stdin ou um argumento de função de sequência. Retorne o número do defeito ou imprima-o no stdout.
Você pode supor que o ruby tenha uma nova linha à direita. Você não pode presumir que ele tenha espaços à direita ou novas linhas iniciais.
O código mais curto em bytes vence. ( Contador de bytes acessíveis ) .
Casos de teste
Os 13 tipos exatos de rubis, seguidos diretamente pelo resultado esperado:
___
/\_/\
/_/ \_\
\ \_/ /
\/_\/
0
___
/\_/\
/_/ _\
\ \_/ /
\/_\/
1
___
/\ /\
/_/ \_\
\ \_/ /
\/_\/
2
___
/\_/\
/_ \_\
\ \_/ /
\/_\/
3
___
/\_/\
/_/ \_\
\ _/ /
\/_\/
4
___
/\_/\
/_/ \_\
\ \ / /
\/_\/
5
___
/\_/\
/_/ \_\
\ \_ /
\/_\/
6
___
/\_/\
/_/ \ \
\ \_/ /
\/_\/
7
___
/\_ \
/_/ \_\
\ \_/ /
\/_\/
8
___
/ _/\
/_/ \_\
\ \_/ /
\/_\/
9
___
/\_/\
/ / \_\
\ \_/ /
\/_\/
10
___
/\_/\
/_/ \_\
\ \_/ /
\ _\/
11
___
/\_/\
/_/ \_\
\ \_/ /
\/_ /
12
fonte
Respostas:
CJam,
2723 bytesConverta a base 11, pegue o mod 67, pegue o mod 19 do resultado e encontre o índice do que você tem na matriz
Magia!
Experimente online .
fonte
Ruby 2.0, 69 bytes
Hexdump (para mostrar fielmente os dados binários na string):
Explicação:
-Kn
opção lê o arquivo de origem comoASCII-8BIT
(binário).-0
opção permitegets
ler toda a entrada (e não apenas uma linha).-rdigest
opção carrega odigest
módulo, que forneceDigest::MD5
.fonte
Julia,
9059 bytesDefinitivamente não é o mais curto, mas a donzela justa Julia cuida muito da inspeção dos rubis reais.
Isso cria uma função lambda que aceita uma string
s
e retorna o número do defeito de ruby correspondente. Para chamá-lo, dê um nome, por exemplof=s->...
.Ungolfed + explicação:
Exemplos:
Observe que as barras invertidas devem ser escapadas na entrada. Confirmei com o @ Calvin'sHobbies que está tudo bem.
Deixe-me saber se você tiver alguma dúvida ou sugestão!
Edit: Salvo 31 bytes com a ajuda de Andrew Piliser!
fonte
search
e indexação de array.s->(d=reshape([18 10 16 24 25 26 19 11 9 15 32 34],12);search(s[d],' '))
. Não gosto da remodelação, mas não consegui pensar em uma maneira mais curta de obter uma matriz 1d.reshape()
a utilizadavec()
. :)> <> (Peixe) , 177 bytes
Esta é uma solução longa, mas única. O programa não contém aritmética ou ramificação além da inserção de caracteres de entrada em locais fixos no código.
Observe que todos os caracteres de construção de rubi inspecionados (
/ \ _
) podem ser "espelhos" no código> <> que altera a direção do ponteiro de instrução (IP).Podemos usar esses caracteres de entrada para construir um labirinto a partir deles com a instrução de modificação de código
p
e a cada saída (criada por um espelho ausente na entrada), podemos imprimir o número correspondente.As
S B U
letras foram alteradas para/ \ _
respectivamente. Se a entrada for um ruby completo, o código final se tornará:Você pode experimentar o programa com este excelente intérprete visual online . Como você não pode inserir novas linhas lá, é necessário usar alguns caracteres fictícios para inserir um ruby completo, como por exemplo
SS___LS/\_/\L/_/S\_\L\S\_/S/LS\/_\/
. (Os espaços também mudaram para S por causa da redução.)fonte
CJam,
41 31 2928 bytesComo de costume, para caracteres não imprimíveis, siga este link .
Experimente online aqui
Explicação em breve
Abordagem anterior:
Certamente isso pode ser reduzido alterando a lógica de dígitos / conversão. Mas aqui vai a primeira tentativa:
Como sempre, use este link para caracteres não imprimíveis.
A lógica é bem simples
"Hash for each defect":i
- Isso me dá o hash por defeito como o índiceqN-"/\\_ "4,er
- isso converte os caracteres em números4b1e3%A/
- este é o número único no número convertido base#
Então, simplesmente encontro o índice do número único no hashExperimente online aqui
fonte
.h
no momento é inútil porque usa o embutido não confiável e ruimhash()
), até então não posso fazer melhor.Deslizamento ,
123108 + 3 = 111 bytesCorra com os sinalizadores
n
eo
, ou seja,Como alternativa, tente online .
Slip é uma linguagem semelhante a regex que foi criada como parte do desafio de correspondência de padrões 2D . O deslizamento pode detectar a localização de um defeito com o
p
sinalizador de posição através do seguinte programa:que procura um dos seguintes padrões (aqui
S
indica aqui a partida começa):Experimente online - as coordenadas são produzidas como um par (x, y). Tudo parece um regex normal, exceto que:
`
é usado para escapar,<>
vire o ponteiro da partida para a esquerda / direita, respectivamente,^6
define o ponteiro da correspondência para a esquerda e\
desliza o ponteiro da partida ortogonalmente para a direita (por exemplo, se o ponteiro estiver voltado para a direita, ele desce uma linha)Infelizmente, porém, precisamos de um número único de 0 a 12, dizendo qual defeito foi detectado, não onde foi detectado. O deslizamento possui apenas um método para gerar um único número - o
n
sinalizador que gera o número de correspondências encontradas.Para isso, expandimos a regex acima para corresponder ao número correto de vezes para cada defeito, com a ajuda do
o
modo de correspondência sobreposto. Divididos, os componentes são:Sim, é um uso excessivo
?
para acertar os números: Pfonte
JavaScript (ES6), 67
72Simplesmente procura espaços em branco nos 12 locais
Editar 5 bytes salvos, thx @apsillers
Teste no console Firefox / FireBug
Saída
fonte
C,
9884 bytesATUALIZAÇÃO: Um pouco mais inteligente sobre a string e corrigiu um problema com rubis não defeituosos.
Desvendado:
Muito simples e pouco menos de 100 bytes.
Para teste:
Entrada para STDIN.
Como funciona
Cada defeito no ruby está localizado em um caractere diferente. Esta lista mostra onde cada defeito ocorre na cadeia de entrada:
Desde que
{17,9,15,23,24,25,18,10,8,14,31,33}
fazemos uma série de custos com muitos bytes, encontramos uma maneira mais curta de criar essa lista. Observe que adicionar 30 a cada número resulta em uma lista de números inteiros que podem ser representados como caracteres ASCII imprimíveis. Esta lista é a seguinte:"/'-5670(&,=?"
. Assim, podemos definir uma matriz de caracteres (no códigoc
) para essa string e simplesmente subtrair 30 de cada valor que recuperamos dessa lista para obter nossa matriz original de números inteiros. Definimosa
como igualc
para manter o controle de quanto tempo chegamos na lista. A única coisa que resta no código é ofor
loop. Ele verifica se ainda não atingimos o finalc
e, em seguida, verifica se o caractereb
atualc
é um espaço (ASCII 32). Se for, definimos o primeiro elemento não utilizado deb
ao número do defeito e devolva-o.fonte
Python 2,
146888671 bytesA função
f
testa cada localização de segmento e retorna o índice do segmento de defeito. Um teste no primeiro byte na cadeia de entrada garante que retornemos0
se nenhum defeito for encontrado.Agora empacotamos as compensações de segmento em uma sequência compacta e usamos
ord()
para recuperá-las:Testando com um rubi perfeito:
Teste com o segmento 2 substituído por um espaço:
EDIT: Obrigado a @xnor pela boa
sum(n*bool for n in...)
técnica.EDIT2: Obrigado ao @ Sp3000 por dicas extras sobre golfe.
fonte
sum(n*(s[...]==' ')for ...)
.<'!'
vez de==' '
por um byte. Você também pode gerar a lista commap(ord, ...)
, mas eu não sei como você se sente sobre unprintables :)Pitão,
353128 bytesRequer um Pyth corrigido , a versão mais recente atual do Pyth possui um bug
.z
que remove os caracteres finais.Esta versão não usa uma função hash, mas abusa da função de conversão básica no Pyth para calcular um hash muito estúpido, mas funcional. Em seguida, convertemos esse hash em um caractere e procuramos seu índice em uma string.
A resposta contém caracteres não imprimíveis. Use este código Python3 para gerar o programa com precisão em sua máquina:
fonte
Haskell, 73 bytes
Mesma estratégia que muitas outras soluções: procurar espaços nos locais indicados. A pesquisa retorna uma lista de índices dos quais eu tiro o último elemento, porque sempre há um acerto para o índice 0.
fonte
05AB1E , 16 bytes
Experimente online ou verifique todos os casos de teste .
Explicação:
Consulte esta dica 05AB1E (seções Como compactar números inteiros grandes? E Como compactar listas de números inteiros? ) Para entender por que
•W)Ì3ô;4(•
é2272064612422082397
e•W)Ì3ô;4(•₆в
é[17,9,15,23,24,25,18,10,8,14,31,33]
.fonte