Eu tenho um problema sério Eu tenho alguns arquivos de texto onde guardo meus números muito importantes - todos os importantes! E dois e três ..
Esses números eram tão importantes que eu não os podia confiar nos novos sistemas de números decimais ou binários. Eu mantive cada número codificado em unário, da seguinte forma:
+--+
| |
+---+ +----+ |
| | | |
+---+ +-------+
~/two.txt
Simples e confiável: dois loops ASCII para o número 2. Infelizmente, essas coisas tendem a se complicar ao longo do tempo e agora tenho dificuldade em descobrir quantos loops existem em cada arquivo. Aqui estão alguns exemplos que trabalhei à mão:
1:
+---+
| |
+--+ |
| |
+--+ |
| |
| |
| |
+--+ +--+
| |
+---------+
Três:
+---------+
| +-----+ |
| | +-+ | |
| | | | | |
| | +-+ | |
| +-----+ |
+---------+
Quatro:
+--------------+
| +--+ +--+ |
| | | | | |
+-|-----|-----|----+
| | | | | | | |
| +--+ +--+ +--+ |
+------------------+
+------------+
| |
+-----+ +-----+ |
| | | |
+-----|-----------+ | |
| | +--+ | | | |
+-+ +--|--|--+ +---------+
| | +-+ | | |
+------+ | | | |
+-------+ | |
|| | |
|+-----+
| |
+---+
Cinco:
+--------+ +--------+ +--------+
| | | | | |
| +--|-----+ +--|-----+ |
| | | | | | | | | |
+-----|--+ +-----|--+ +--------+
| | | |
+--------+ +--------+
Você pode me ajudar a contar meus loops?
Aqui estão as regras:
- Como guardo tudo no unário codificado em ASCII, a eficiência do espaço é muito importante para mim. Portanto, isso é código de golfe. O menor programa em bytes vence.
- Os loops são desenhados com os caracteres +, -, |. Todos os cantos do loop são desenhados sem ambiguidade: exatamente um dos caracteres acima e abaixo do + será |, e exatamente um à direita ou à esquerda será -. Duas marcas + nunca são adjacentes.
- Os fios podem passar um por cima do outro. Quando as mechas se cruzam, você pode ver a mecha "under" imediatamente em ambos os lados da mecha "over".
- Seu programa deve usar uma representação de string do loop (a partir de stdin ou como um parâmetro de função) e produzir um número (para stdout ou como um valor de retorno).
- Os comprimentos das linhas podem não ser uniformes no desenho do loop e pode haver espaços à direita em cada linha.
- Você pode assumir que há pelo menos um loop na entrada.
Estou contando com você!
+
?Respostas:
SnakeEx - 98 bytes com Javascript, 44 sem
Parecia um bom problema tentar o meu idioma a partir do Desafio Quinzenal :
O melhor lugar para experimentar isso é o meu intérprete online .
O SnakeEx faz a correspondência de padrões no texto usando "serpentes" que se movem pelas expressões correspondentes ao texto. O código parece um regex, exceto:
<T>
instrução Esse é um comando de direção que ramifica a cobra para a esquerda e para a direita em relação à direção atual.{e<>PE}
é como uma chamada de sub-rotina. Ele cria uma cobra com a definiçãoe
avançando (<>
) e com parâmetrosP
(nas costas - a cobra reprodutora segue a nova cobra) eE
(exclusivo - não corresponde a nada que já foi correspondido). Essa verificação exclusiva é a única coisa que impede a cobra de fazer um loop infinito.`
no final indica que o que segue deve ser correspondido apenas se já tiver sido correspondido, o que podemos usar para forçar o fechamento do loop.Como o SnakeEx é como regex e tecnicamente não produz os resultados desejados, acho que precisamos envolvê-lo em algum Javascript chamando o intérprete:
Edit : corrigido para trabalhar com os casos de teste adicionais do blutorange
fonte
[^ ]
com[|\-]
;)C # - 338
388433bytesEconomizou um monte de bytes alterando para uma matriz unidimensional.
Primeiro, ele lê a entrada e a torna agradável e retangular, com uma borda "" para que não tenhamos que verificar os limites na horizontal (é mais barato verificar na vertical do que colocar na linha extra) . Em seguida, ele olha para trás através do retângulo, para sempre bater no canto inferior direito. Quando atinge um deles, ele se direciona, seguindo todos os + s que encontrar, e limpando-os à medida que avança (com um espaço). Para de seguir quando encontra um espaço. Testado nos cinco exemplos dados.
fonte
Deslizamento ,
5141 + 2 = 43 bytes(Agora atualizado para funcionar com o caso de teste do @ blutorange a um custo maior)
Como o @BMac usou o SnakeEx para esse desafio, pensei em usar o meu envio de linguagem de correspondência de padrões 2D , Slip. Mas como o Slip não tinha os recursos necessários para resolver esse problema, eu os adicionei nos últimos dias. Em outras palavras, este envio não é elegível para ganhar .
Corra com a
n
bandeira para o número de correspondências, por exemploExperimente online .
Explicação
Devido à infinidade de novos recursos neste envio, esta é uma boa oportunidade para mostrá-los.
O deslizamento tenta combinar a partir de todas as posições e retorna apenas correspondências únicas. Observe que usamos
[^ +]
- enquanto o uso[-|]
economizaria dois bytes, teoricamente, o escape sem escape-
no início / fim das classes de caracteres ainda não foi implementado no Slip.fonte
three
também tem+
s que não são um-
, um|
e 2 lugares, então estou assumindo que não é um erroRuby 295
Experimente on-line: http://ideone.com/kIKELi ( eu adicionei uma
#to_a
chamada na primeira linha, porque ideone.com usa o Ruby 1.9.3, que não suporta#size
paraEnumerable
s Em Ruby 2.1.5+ o código é executado OK. . )A abordagem é a seguinte:
+
sinais na entrada e considere cada um deles com uma forma distinta+
sinais e combinam suas formas em umAqui está uma versão mais legível:
fonte
JavaScript (ES6) 190
197 202 215 235 289 570Editar matriz de dimensão única em vez de 2 dimensões, caracteres de tamanho máximo de linha 999 (mas pode ser mais sem custo, por exemplo, 1e5 em vez de 999)
Editar snippet de código animado adicionado, veja abaixo
Primeira tentativa ungolfed
Snippet animado
Mostrar snippet de código
Teste no console Firefox / FireBug
fonte
Ruby, 178
187199212Melhor versão ruby, cria a função F. Agora, com mais deliciosos avisos para intérpretes constantemente.
Teste on-line: ideone
Basicamente, a função
b
começa em qualquer+
, recursivamente passa pelo loop, configurando all+
parau
. Assim, um loop é removido a cada vez queb
é chamado. A funçãoF
apenas tenta quantas vezes precisamos chamarb
até que não haja nenhum loop restante.fonte
Python 2 - 390
Pega uma string com novas linhas de stdin. É um método bem simples de jogar um pouco, mas tenho certeza que não tanto quanto poderia estar considerando quanto tempo leva.
fonte
Python 2 - 346 bytes
Implementado como uma função
c
que recebe os dados do arquivo como entrada e retorna o número de loops.Primeiro, a função decompõe os dados em um mapeamento dos locais dos elementos do loop para o tipo de elemento nesse local (por exemplo
{(0,0): '+'}
). Em seguida, ele usa duas funções internas mutuamente recursivas. O primeiro remove um segmento de loop do mapeamento e decide quais locais verificar o segmento subsequente. O segundo verifica que tipo de elemento de loop está nos locais selecionados e, se for compatível com o esperado, chama o primeiro para remover a seção recém-encontrada.fonte