Este é o fio do ladrão. A discussão do policial está aqui .
Uma matriz de cobra é uma matriz quadrada que segue esse padrão:
3 por 3:
1 2 3
6 5 4
7 8 9
e 4 por 4:
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
Sua tarefa é escrever um código que receba uma entrada n
e crie essa matriz, no mesmo idioma que uma publicação policial e com um código que corresponda à expressão regular da polícia. O formato de saída do seu código deve corresponder ao formato de saída do código do policial.
Deixe um comentário na postagem do policial para indicar que você o violou.
Critério de vitória:
O vencedor será o usuário que obteve o maior número de envios. Em caso de empate, haverá vários vencedores.
fonte
¦
funciona mata-me o tempo todo, eu tentei isso ontem, mas comṚ
em vez deU
e decidiu oḤ
não estava funcionando.F
foi uma ótima idéia,J
vez deF
.J
... eu tinha tentado comLR
, mas não podia fazê-lo com menos de 11 bytes05AB1E, Emigna
Esta foi a minha primeira vez usando 05AB1E. Consegui com um pouco de ajuda. Foi divertido. :)
Experimente online
Explicação:
Na verdade, eu encontrei esse programa semelhante sozinho, mas o formato de saída é diferente:
Experimente online
Veja o histórico de edições das minhas duas tentativas anteriores.
fonte
not bool(reversed(str(bin(N))).index('1'))
... Eu acho que é a maneira mais absurda que eu já vi alguém fazer umaN%2
operação.Dennis Python 2
Este é um problema divertido de golfe com token.
Verificação Regex
fonte
Ohm, Nick Clifford
Minha primeira vez tentando Ohm.
Linguagem realmente agradável que estou ansioso para usar novamente :)
Explicação
Minha primeira tentativa que não funcionou como adicionar uma matriz e um int não é possível:
Minha segunda tentativa que não corresponde ao regex:
fonte
05AB1E, Emigna (2ª submissão)
Primeira vez em que trabalhei com 05AB1E.
Experimente online! | Verificação Regex
Explicação
fonte
)
pensando que seria a única maneira de obter o resultado correto na pilha.)
quando você pode usar apenas 2 caracteres não alfanuméricos. A parte complicada aqui foi estruturar o programa para usar apenas 2 curingas e tê-los em seqüência. Provavelmente teria sido um pouco mais difícil sem as outras soluções, mas deve ter havido alguma confusão envolvidos :)^\w*..$
é possível.UV
necessidade de vir depois+ˆ
. Também não consigo pensar em outra maneira de fazer isso com apenas 2 curingas no final. Isso pode ser feito com 3 curingas.CJam , Lynn
Todos os feeds de linha são para fins cosméticos e podem ser removidos sem afetar o programa.
Experimente online!
Explicação
Depois que Lynn foi removido
{|}
da lista de caracteres permitidos, tive que tentar algo novo. Acontece que ainda podemos construir seqüências arbitrárias e avaliá-las como código.Primeiro, precisamos agregar algum valor à pilha. Os únicos built-ins disponíveis que enviam algo sem aparecer primeiro (e sem ler a entrada) são
es
,ea
eet
. Tenho certeza de que você pode começar de todas essas formas, mas fui com oes
que pressiona o timestamp atual. Como não queria fazer suposições sobre seu valor real, testo sua primalidade commp
(o que dá0
e1
) e testo novamente a primalidade desse valor para garantir que eu esteja0
na pilha. Um1
será mais útil, então calculamosexp(0)
comme
e transformá-lo em um inteiro comi
. Então, todos os números começam com:Agora temos vários operadores de matemática unários para trabalhar:
Também podemos combinar alguns recursos internos para funções mais elaboradas de
x
:Usando esses, podemos obter qualquer número
0 <= x < 128
(e muitos outros) em menos de 10 etapas a partir de1
. Tenho certeza de que um subconjunto muito menor desses comandos também seria suficiente. Eu escrevi um pequeno programa Mathematica, para determinar todos esses trechos (não é muito legível, desculpe):Com isso, podemos simplesmente enviar uma lista arbitrária de códigos de caracteres, convertendo cada um deles em um caractere
c
posteriormente. Depois de empurrarmos todo o código que queremos executar, pressionamos95
(]
). Avaliamos aquele com~
que todos os outros devem ser agrupados em uma string e, em seguida, avaliamos essa string com~
.O código real executado no final do programa é novamente:
Veja minha solução anterior para uma explicação.
fonte
Python 3, TuukkaX
Desculpe, o regex que você usou foi muito fácil de banalizar. Não
0
,#
ou? Sem problemas!
Talvez eu tenha interpretado mal o exemplo de saída, mas ainda é muito fácil ajustar, já que tenho 45 caracteres sobrando
fonte
R, MickyT
Casos de testes:
E confirmação de regex: https://regex101.com/r/OB8ZIM/1
Eu também tive:
que fornece a mesma saída e corresponde ao mesmo regex .
fonte
lets_make_a_snake
... Eu ficaria surpreso se isso era a solução pretendida: Pfor
` e `if
`, mas muito melhor jogado do que o meu.Röda , fergusq
Esta é uma função anônima que corresponde a esta regex PCRE:
^{(\|[^\/#\s]*){8}$
.Experimente online!
fonte
Bash, @Marcos M
Pré-especificado:
A primeira parte do subcomando irá gerar
1 2 3 4
,9 10 11 12
e a segunda parte vai gerar8 7 6 5
,16 15 14 13
. O exteriorsort -n
irá misturá-los adequadamente para formar o padrão de cobra.Usei o truque em /superuser//a/101760 para imprimir as linhas pares e ímpares. Obrigado Marcos, realmente divertido.
fonte
Javascript, Tom
fonte
Python 3, @TuukkaX
Analisando levemente a regex do policial, mostra um modelo fixo:
onde
_
é qualquer caractere, exceto[ '"#]
e^
é um dos[int()2/]
.O
"*n)
final mostra claramente umeval("..."*n)
ouexec("..."*n)
está acontecendo, portanto, precisamos apenas garantir que a"..."
impressão seja a j-ésima linha.O
for i in range(j,
está muito perto do final da string, sugerindo a compreensão da lista sem nenhumif
. Então, precisamos construir o i-th coluna usando aquelesi%n
,2*n
coisas.fonte
dc , Mitchell Spector
Esta foi a minha primeira participação em um desafio de policiais e ladrões, e eu me diverti muito. O regex precisava ser correspondido era simples, o
^[^# !]{59}$
que basicamente transformou meu trabalho em golfe, sem usar esses três caracteres. Inicialmente, tive dificuldades em obter menos de 60 bytes, mas no fim eu o decifrei.Experimente online!
Explicação:
Meu código usa um loop com N 2 iterações , mantendo um contador baseado em zero (1D) e calcula qual número precisa ser impresso com base nas coordenadas correspondentes da linha e da coluna da matriz (r, c).
Exemplo do que quero dizer, se N = 4:
Parece complicado, mas a etapa intermediária é útil. Além disso, tentei usar 2 loops desde o início, mas acabei acima do limite de caracteres de expressão regular. Geração de número em cada iteração (com base em zero):
r % 2 = 0
(linha normal),n = (r * N) + c = counter
r % 2 = 1
(linha invertida),n = ((r + 1) * N) - c - 1 = counter + N - (2 * c) - 1
Ou tudo de uma vez, como uma numeração baseada:
n = counter + ((N - (2 * c) - 1) * (r % 2)); n++
fonte
~
para calcular os índices de linha e coluna de uma só vez. Mas uma das minhas tentativas anteriores as calculou separadamente, como você fez. Mentes brilhantes pensam igual? :)~
para encurtar o código.?sN0[AP]sP[ddlN~_2*lN+1-r2%*+1+n32P1+dlN%0=PdvlN>L]dsLx
tio.run/nexus/...PowerShell, ConnorLSW
Rachadura
Comecei com uma solução menor para o problema e preenchi meus nomes de variáveis para fazer com que o regex correspondesse. Tentando encontrar um uso para o cólon, suponho que foi a parte mais difícil de entender.
Explicação
fonte
$script
variável e alguns loops muito bagunçados para preenchê-lo, o[array]::Reverse()
estava correto, parabéns - acho que você pode querer equilibrar o comprimento$i
e o tamanho$MySnakeIndex
.CJam, Lynn
Algo assim:
Todo o espaço em branco é para ... "legibilidade" ... e pode ser omitido para estar em conformidade com a regex de Lynn.
Experimente online!
Explicação
A regex exige que resolvamos o problema usando apenas:
{}
, que pode ser usado para criar blocos.|
, usado principalmente para OR bit a bit.~
, "eval" e bit a bit NOT (também "dump array", mas não vou usá-lo).Como temos
~
, se podemos construir seqüências arbitrárias, podemos executar código arbitrário. No entanto, a princípio não é óbvio como fazer isso.A primeira peça do quebra-cabeça é que os blocos são pedaços de código não avaliados, que podem se transformar em strings
s
. Então{abc}s
nos dá"{abc}"
. Em seguida, podemos usareu
para converter essas strings em maiúsculas.O benefício disso é que as letras maiúsculas são variáveis pré-inicializadas, para que possamos obter muitos valores constantes criando uma string e avaliando-a duas vezes (uma vez para transformar a string novamente em um bloco e outra para executar esse bloco). Não podemos obter todas as letras, porque algumas, como
x
comandos não são válidos (o CJam se recusará a analisar um bloco que as contenha). Não podemos usarf
como estão, porque ele precisa ser seguido por outro comando, mas podemos usarfb
e depois OU os dois valores juntos. Da mesma forma, podemos usar emee
vez dee
. Com isso, podemos obter os números0
,-1
,3
, e10
para19
. O-1
é conveniente, porque se o transformarmos em uma string ("-1"
), em um caractere ('-
) e, em seguida, avaliá-lo, podemos obter subtração ou definir diferença. Como eu disse, não podemos obterX
(por1
), mas podemos assumir o valor absoluto de-1
withz
.Também podemos usar
s
para obter uma string contendo um espaço ec
transformá-la em um caractere de espaço :Isso é conveniente, pois a partir daí podemos obter muitos comandos úteis no intervalo ASCII mais baixo, ORing o espaço com vários números. Para obter alguns dos caracteres acima do ponto de código
48
, usamos o caractere'0
como base:Isso já é suficiente para construir cadeias arbitrárias, porque podemos obter
'+
(adição e concatenação de cadeias) do seguinte trecho:E nós temos um literal
1
para podermos simplesmente empurrar caracteres de espaço, incrementá-los para o valor que precisamos e concatená-los todos juntos, mas isso é um pouco chato e o código se tornaria maciço.Em vez disso, eu criei
[
e]
e evalled-los, de modo que todos os personagens que eu empurro entre são embrulhados em uma corda automaticamente. Essas são as duas linhas:E, finalmente, precisaremos
f
e~
na string que estamos gerando. Embora esses caracteres já sejam válidos, não temos literais de seqüência de caracteres ou literais de caracteres, portanto, teríamos que gerá-los também, e construir pontos de código maiores a partir do espaço é um pouco chato. Em vez disso, usei a subtração definida aqui, mas subtraindo dois blocos (para se livrar da{}
):Isso é praticamente tudo o que existe. Nós avaliamos
[
. Empurramos todos os caracteres, obtidos por vários cálculos das poucas constantes internas que temos|
,,-
(via eval) e+
(via eval). Nós avaliamos]
. Achatamos a coisa toda em uma string, porque em algum momento adicionei algumas strings ou números à lista. Avaliamos nossa string arbitrária com~
.Eles
ri...p
fazem parte do programa final real, mas eu os extraí porque eles não precisam de codificação.Finalmente, este é o programa que estamos executando:
fonte
tinylisp , @DLosc
Experimente online!
Isso define uma função
f
que retorna a resposta. Ele também imprime os nomes das funções que defini para stdout, mas presumo que isso não importe, pois [podemos escolher nosso fluxo de saída] para o código golf, pelo menos. Se for um grande negócio, acho que posso ajustá-lo para não imprimi-los. Como eu fiz isso? Comecei com algo bastante padrão:Então, observei que é possível transformar definições de funções como esta:
torna-se
E chamadas de função assim:
torna-se
Usei essa macro recursiva do Vim, armazenada em registrador
q
, para fazer a segunda (eujk
mapeei<Esc>
):f s(v(h(q(jkea))))jk@q
.Essas duas transformações foram suficientes para eliminar todos os espaços.
fonte
Swift, @James Webster
Verificação: https://regex101.com/r/7ukrM0/1
fonte
(…)(4)
, não há necessidade de converter o literal inteiro no CShort.PHP, @ JörgHülsermann
221 bytes é muito longo (portanto, a cobra), e a falta de espaço em branco pode ser facilmente contornada.
Pré-especificado:
fonte
Jelly, comprimento 12, @JonathanAllan
Experimente online!
Como funciona
fonte
Jelly , 12 bytes, rachaduras Segunda resposta de JonathanAllan
Experimente online!
Explicação
Isso é quase o mesmo que minha outra resposta . Acabei de fazer duas alterações:
Primeiro, mudei
U
("reverter cada elemento") paraṚ€
("reverter" "cada elemento"). Isso não ajuda por si só, porqueṚ
também é proibido.Em seguida, mudei o
Ṛ
("reverse") para;@/
(/
"fold by";
"concatenating"@
"na ordem oposta à lista original"). Isso evita todos os caracteres proibidos, fornecendo uma solução válida.Suponho que o próximo passo seria começar a banir as rápidas de manipulação de array , além dos átomos.
fonte
€
...€
em termos de/
também. É apenas mais detalhado do que esta solução.;@\ṫ0
, o regex está ficando longo.Jelly, comprimento 13, @JonathanAllan
Experimente online!
Como funciona
fonte
m
?!Jelly, comprimento 14, @JonathanAllan
Experimente online!
fonte
Scala, @Soapy
Não tocamos em Scala por um tempo, foi divertido revisitar. Infelizmente, esta solução perde muitos dos recursos interessantes do Scala.
Experimente aqui
Confirmação de Regex
fonte
QBasic (QB64), @DLosc
Observe que, como
.
não corresponde\n
(U + 000A, LF), a nova linha aqui é\r
(U + 000D, CR).Verificar:
A principal dificuldade é como inserir uma palavra após o
;
. Felizmente, o QB64 trata o CR como uma nova linha, enquanto o regex do Python não, para que possamos escorregar umREM\r
aqui. Dos cinco sabores permitidos de regex,"\r" =~ /./
!/./.test('\r')
(\n
,\r
,\u2028
,\u2029
são todos separadores de linha )re.match('.', '\r')
( somente\n
é considerada uma quebra de linha )regexp.Match(".", "\r")
/./ =~ "\r"
Portanto, esse crack é bom, desde que não mencionemos JavaScript ... 🤐
fonte
REM
imediatamente após uma declaração sem separador de declarações. Minha solução original não usou comentários. Tenho outra variação que estarei postando em breve. : DPython 3, kennytm
Verificação Regex
fonte
> <>, torcado
fonte
C, @Yimin Rong
O programa não pode conter números, mas podemos obter números via:
c
, comumente conhecido como "argc", que é sempre 2.+
e-
estão disponíveis, para que possamos criar 0 comn-n
e criar 1 como=c;--o
.fonte
Ruby, @Value Ink
[(-=Z-~]*
significa "Eu posso escrever o que quiser :)"fonte
tinylisp, @DLosc
Uma solução muito simples e totalmente não otimizada :)
Ligar como
(disp (f 4))
.(p m n)
calcula m + n usando subtraçãos
(m + n == m - ((1 - 1) - n))(j f g)
gera(f f+1 f+2 ... g-1)
(r f g)
gera(g-1 g-2 g-3 ... f)
(k m o f g n)
gere uma linha da matriz de cobra e, em seguida, recurve-se para a próxima linha, até que n linhas sejam criadas. Os argumentosm
,o
são substituídos porj
/r
para gerar aumentando ou diminuindo linhas. Os argumentosf
,g
estão em execução índices para saber qual linha em que estamos.(f n)
chamadas(k j r 1 1 n)
para iniciar a geração.fonte
(f 4)
--odisp
está implícita.)PHP, @Ionut Botizan
No momento, não tenho nenhuma idéia melhor para quebrar a solução original.
Suporta n <= 15
É a primeira vez que uso getopt. Talvez não seja a melhor ideia para usar opções como entrada.
comece na linha de comando como esta
Regex original
Nível 1:
Muito boa combinação de letras. Sinta-se livre para votar no tópico da polícia.
Ele me bloqueia funções como - strrev - array_reverse - get_defined_vars
https://regex101.com/r/5rGTnw/2
Nível 2:
https://regex101.com/r/XtVl9G/1
Solução
Nível 2:
fonte