Continuo ouvindo que pensar fora da caixa é um objetivo que vale a pena atingir, mas como posso saber se estou conseguindo fazer isso com sucesso?
Para resolver esse dilema, já escrevi um tradutor de ondas cerebrais para ASCII que, em teoria, deveria produzir resultados como
#
+------------+ #
| thinking | #
| | #
+------------+ #
#
ou
#
+------+ #
| | thinking #
| | #
| | #
+------+ #
#
o que torna bastante fácil saber se alguém está pensando fora da caixa ou não. (Eles #
não fazem parte da saída e representam novas linhas.)
No entanto, devido a um erro, às vezes apenas uma seção menor da saída é retornada:
| | #
+---------+ #
thinking #
#
+#
|#
inking |#
#
#
A tarefa
Por favor, ajude-me a classificar automaticamente a saída do tradutor Brainwave-to-ASCII , escrevendo um programa ou função que leia uma reprensentação ascii e retorne se thinking
está na caixa, fora dela ou não pode ser detectado pela entrada.
Entrada
Um conjunto de cadeias de caracteres do mesmo comprimento como uma lista ou delimitadas por novas linhas contendo
- a sequência
thinking
ou pré ou sufixos válidos - os caracteres que
+-|
formam uma caixa retangular ou partes válidas - espaços
- NÃO
#
, elas estão incluídas apenas no desafio de marcar as extremidades das linhas de entrada.
Resultado
- um valor verdadeiro se
thinking
estiver fora da caixa - um valor falso se
thinking
estiver na caixa - um terço distinto talvez valor, se não puder ser determinado a partir da entrada,
thinking
esteja na caixa ou não
Exemplos
Verdade:
#
+------+ #
| | thinking #
| | #
| | #
+------+ #
#
| | #
+---------+ #
thinking #
#
+#
|#
|#
inking |#
thinking #
-------+ #
++ # (thinking is not in the box, so it must be outside)
++ # (this is also the smallest possible box)
+ #
t#
+----+# (The box is not wide enough to contain "thinking")
---# (The box is not high enough to contain "thinking")
---#
Como entrada de string:
" \n +------+ \n | | thinking \n | | \n | | \n +------+ \n "
" | | \n +---------+ \n thinking "
" \n +\n |\n |\ninking |"
"thinking \n-------+ "
" ++ \n ++ "
"+ \n t"
"+----+"
"---\n---"
"g++"
"k\n+"
Falsy:
#
+------------+ #
| thinking | #
| | #
+------------+ #
#
+---------------#
| #
| #
| thinking #
| #
king | #
------+ #
+---#
|thi#
+---#
-#
n#
-#
Como entrada de string:
" \n +------------+ \n | thinking | \n | | \n +------------+ \n "
" +---------------\n | \n | \n | thinking "
" | \nking | \n------+ "
"+---\n|thi\n+---"
"-\nn\n-"
Talvez:
thinking#
g|#
think#
-----#
| |# (box large enough to possibly contain the string)
| |#
+--#
| #
# (empty input)
Como entrada de string:
"thinking"
"g|"
"|t"
"-\ni"
"h\n-"
"think\n-----"
"| |\n| |"
" +--\n | "
""
Regras
- Isso é código-golfe , então tente usar o mínimo de bytes possível.
- O valor talvez pode ser escolhido livremente, desde que seja diferente do valor verdade / falsidade e seja o mesmo para todas as entradas talvez. Também pode ser um erro.
- Você pode assumir que a entrada é sempre válida (por exemplo, não contém outros caracteres além de
+-ghiknt|
, não mais que uma caixa, ...).
fonte
+\n+
caixa muito pequena para uma palavra #Respostas:
JavaScript (ES6),
274263 bytesA função
f
retornatrue
,false
ou-1
como seu "talvez" valor. Deve ser chamado com um argumento: a entrada. Os outros dois parâmetros existem apenas para encurtar o código.Aqui está uma versão menos golfe com comentários:
Nos divertimos muito com este. Obrigado!
Editar: salvou 6 bytes graças a @L. Serné modificando
b
para usar um argumento padrão, economizando 3 bytes e alterando[a-z]
para\w
, economizando mais 3 bytes. Também salvou mais 5 bytes, tornando a substituição da palavra não global, economizando 1 byte e alterando"a"
para5
e","
para4
, economizando 4 bytes.fonte
console.log(f("input"))
. Parece funcionar. Ótimo trabalho em jogar isso.b=(b,c)
parab=(b,c="")
e, em seguida, você pode remover o último argumento das duas chamadasb
com uma string vazia como segundo argumento, economizando (2 * 3-3 =) 3 bytes no total. Além disso, você pode reduzir a palavra regex de[a-z]+
para\w+
(faça isso antes que o outro substitua, porque isso também corresponderá a dígitos), economizando mais 3 bytes.Python 2.7,
532494453 bytesEste com certeza teve muitos casos especiais. Meus valores de verdade e falsidade são as cadeias "Verdadeiro" e "Falso", respectivamente. Meu valor talvez é um erro de índice, pois é fácil de disparar e um dos meus casos de teste o aciona se a entrada for uma sequência vazia, o que é um caso talvez. Eu usei expressões regulares bastante.
Eu não jogo golfe em python com frequência, então tenho certeza de que isso poderia ser mais fácil, mas aqui está o meu código:
Na minha versão de golfe, eu mostro a resposta Verdadeiro / Falso ligando
exit(bool as string)
. Aqui está uma versão comentada, na qual as instruções de saída são substituídas por instruções de retorno e tudo foi movido para uma função:Minha solução pressupõe que a entrada é válida, ou seja, 'Thinking' (ou suas substrings) estão escritas corretamente, existe apenas uma caixa, etc.
Editar: salvou 10 bytes graças à sugestão de @ ais523 de mudar
c
parai.count('+')
, 3 bytes graças à sugestão de @ Pavel de substituirTrue
por1<2
eFalse
com2>1
, 23 bytes removendo um bloco desnecessário e 2 bytes removendo alguns espaços.Edit 2: Salvei 36 bytes graças ao @Wheat Wizard, que gentilmente apontou que minhas 'guias' eram na verdade 5 espaços (D'oh!) E sugeriu outras melhorias.
fonte
i
nunca muda, certo? Portanto, você provavelmente poderia salvar alguns bytes armazenandoi.count('+')
emc
vez dei.count
, como nunca o chama com nenhum argumento, exceto+
.Anterior, 535 bytes
Isso não é bonito e nem chega perto de competir com as respostas existentes, mas é o melhor que pude obter no Befunge.
Retorna
1
se pensar fora da caixa,0
se pensar dentro da caixa, e-1
para talvez .Experimente online!
fonte