Este é o tópico do policial. A linha do ladrão está aqui .
Escreva um código que aceite uma entrada n
e crie uma "matriz de cobra" n por n.
Uma matriz de cobra é uma matriz 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
O formato exato de saída é opcional. Você pode, por exemplo [[1 2 3],[6 5 4],[7 8 9]]
, saída , ou algo semelhante.
Você deve fornecer o nome do idioma e uma regex que corresponda totalmente ao seu código. Você pode escolher o quão detalhado deve ser o seu regex. No extremo, você pode escrever uma regex que corresponda a todas as seqüências possíveis; nesse caso, será muito fácil decifrar seu código. Você também deve fornecer a saída para n=4
que os ladrões saibam o formato exato pelo qual você optou.
Você pode usar um dos sabores de regex disponíveis no regex101.com ou o sabor de Ruby.
- PCRE (PHP)
- Javascript
- Python
- Golang
- Rubi
Você deve especificar qual você está usando.
Notas:
- Você deve suportar qualquer razoavelmente grande
n
. Você pode supor que ele não excederá o tipo de dados ou a memória. Se o tipo de dados padrão for números inteiros assinados em 8 bits, você poderá assumir quen<=11
, se forem números inteiros não assinados em 8 bits, poderá assumirn<=15
. - Os ladrões precisam corresponder ao formato de saída da submissão, exceto espaços à esquerda / à direita e novas linhas, pois isso pode ter sido removido pela formatação SE.
Critério de vitória:
O vencedor será o envio sem rachaduras com a menor expressão regular, medida em número de caracteres.
Se sua postagem permanecer sem crack por 7 dias, você poderá postar a solução pretendida e marcar seu envio como seguro.
fonte
.
,.Respostas:
05AB1E , rachado por mbomb007
Esperançosamente divertido de quebrar e não muito óbvio.
Regex (PCRE):
Saída n = 4:
Solução original
fonte
\w
não. Você pode tentar-se em regex101.{0,2}
para.?.?
-
última posição da classe de caracteres entre colchetes ([+*\/%-]
) para não precisar escapar dela.Python 2 , comprimento 62, rachado
Regex (PCRE)
Saída de amostra
fonte
Gelatina , comprimento 6, rachada
Regex (PCRE)
Saída de amostra
fonte
G
formato da saída corretamente. Estou perto de resolver o resto, mas eu simplesmente não consigo descobrir como reverter qualquer outro item em uma matriz com geléia ...R, comprimento 14 Rachado por plannapus
Espero ter acertado este regex. O que eu quero dizer é 77 caracteres excluindo
<space>
,#
,;
e[
. Eu testei aquiRegex
Saída de amostra n = 4
fonte
05AB1E , rachado pelo valor da tinta
Vamos aumentar um pouco :)
Espero que seja um bom quebra-cabeça.
Regex (PCRE)
Saída n = 4
fonte
> <> , comprimento 49, Rachado por Aaron
Regex (Javascript)
Saída de amostra (n = 4)
A formatação é um pouco estranha, mas a verificação do tamanho do número teria feito muito mais tempo. Pode ter exagerado um pouco no regex, não tenho certeza!
Edit: Também esqueci de mencionar, eu uso a pilha inicial (-v flag) para entrada, não a entrada de peixe usual. Desculpe!
Código original:
Aaron é muito mais simples! A complexidade do meu código original é baseada na idéia de usar
n[r]
todo o n-ésimo número para inverter esse segmento (linha) e, em seguida, imprimir todos os números de uma vez no finalfonte
..
é menor do que.{2}
;)Ohm , rachado
Também meu primeiro desafio de Policiais e Ladrões, diga-me se há problemas com esse padrão (especialmente porque esse é um idioma bastante desconhecido).
Regex (PCRE)
Saída (n = 4)
fonte
.*
no seu regex, pode ser qualquer coisa. Portanto, se o idioma tiver comentários, eles poderão escrever qualquer programa seguido por um comentário.PHP, 221 bytes ( rachado )
Espero que seja difícil o suficiente.
Regex (PCRE): 16 bytes
Sem espaço, sem comentários, sem uso de base64_decode. Diverta-se.
Saída
Código original
fonte
base64_decode
porque o seu regex não o proíbe.6
, que podem bloquearbase64_decode
.C # net46 (rachado)
( http://ideone.com/ funciona)
Comprimento do sabor 58 do Regex PCRE testado no regex101
Somente o método é regexado. O método retorna um 2d int [,] array (int [4,4]) para uma entrada n = 4. Se impresso for assim:
Esta é minha primeira entrada em algo assim, deixe-me saber se fiz algo errado. Não estou tentando vencer pelo comprimento de regex, com certeza, só estou interessado em ver como me saí bem na prevenção de rachaduras :)
Código original:
fonte
QBasic, comprimento 10 do regex ( rachado )
Regex
Deve funcionar com qualquer sabor de expressão regular, mas chamaremos de sabor de Python.
NOTA: Minha solução usa QBasic não formatado; após a formatação, o código não corresponde à regex devido aos espaços adicionados. (Mas posso lhe dizer que essa é a única alteração que faz a diferença.
([A-Z]+ ?. ?)+
Ainda funciona na versão formatada.)Para fins de teste, usei o QB64 com a formatação de código desativada (em Opções> Layout de código). Se você não deseja fazer o download de algo, também pode executar o QBasic online em archive.org (mas não é possível desativar a formatação).
Saída de amostra
fonte
\w+\W
pode ser dividida em\w*
e\w\W
. (\w*
Ou énull
(trivial) ou\w+
(facilmente escapado com um símbolo)).
não pode ser um caractere de palavra. Pode ser uma letra minúscula ou um dígito. De fato, pode até ser uma letra maiúscula, caso o último caractere do programa seja um.Python 3, 55 bytes (rachado)
Sabor PCRE / Python / Golang.
(Lembre-se de que é necessária a correspondência completa . Suponha
^
e$
durante o teste.)Saída de amostra:
Solução original:
Deveria ter aparado 4 bytes: p
fonte
)
segunda parte do regex(
está dentro de uma classe de personagem começando depoisprint
e terminando antes{48}
. Levei um tempo para ver também. ;) (Por falar nisso, o par anterior do parênteses também estão dentro de uma classe de caracteres).dc , comprimento 12 do Regex Rachado por seshoumara!
Essa expressão regular é simples o suficiente para que eu não pense que o sabor da regex importa - deve funcionar de maneira geral. (Observe o espaço após o # na regex.)
Testei todos os quatro tipos em regex101.com (PCRE / PHP, Javascript, Python e Golang), bem como a versão Ruby em rubular.com. O programa dc corresponde ao regex nas cinco versões do regex.
O programa dc recebe sua entrada no stdin e coloca sua saída no stdout.
Exemplo de saída para a entrada 4 (há um espaço à direita no final de cada linha):
Código original (adicionado após ser quebrado)
Isso foi quebrado por @seshoumara . Aqui está o meu código pretendido:
Explicação:
A soma no topo da pilha agora é o próximo número que queremos imprimir:
É fácil ver que isso está correto se o número da linha for par, desde então a soma é apenas i.
Para linhas com números ímpares, observe que i = d * (i / d) + (i% d) = d * (número da linha) + número da coluna. Daqui resulta que a soma i + d-2 * (número da coluna) -1 é d * (número da linha) + número da coluna + d - 2 * (número da coluna) - 1 = d * (número da linha + 1) - número da coluna - 1, que é o número que queremos colocar na linha e coluna indicadas para garantir a contagem regressiva nas linhas com números ímpares.
Voltando à explicação agora:
fonte
#
`` omitidos para que uma solução mais curta não possa usar comentários para atingir 59 bytes? Nesse caso, não há necessidade, pois no dc existem muitas maneiras de adicionar comandos que não mudam nada, por exemplo. repetindoq
comandos no final do script.32P
é mais curto do que nunca[ ]n
.Bash, comprimento regex 38, rachado ( @kennytm )
Entrada:
Saída:
fonte
PHP
Espero que seja divertido! : D
Saída (n = 4)
Nível 1: PCRE (comprimento = 17) ( Rachado por Jörg Hülsermann )
{
assim ... não há funções anônimas!v
então ... nãoeval()
!;
então ... deve ser uma única afirmação!<
, não ...Heredoc
nem vários blocos PHP!@ JörgHülsermann tinha uma abordagem interessante, mas não era o que eu tinha em mente :). Portanto, estou introduzindo um novo nível de dificuldade (prometo ter o código que se encaixa nisso e não estou apenas brincando com você):
Nível 2: PCRE (comprimento = 23) ( Rachado por Jörg Hülsermann )
_~|&A-Z
! :)Diverta-se!
A SOLUÇÃO ORIGINAL
Portanto, proibir o
$
significado de que as variáveis não podem ser acessadas da maneira regular, mas isso não significa que elas não possam ser usadas! Você ainda pode usarextract()/compact()
para importar / exportar variáveis para o escopo atual. :)No entanto, há uma pegadinha:
compact('x')['x']++
não funcionaria porque variáveis no PHP são passadas por valor ... com uma exceção! ObjetosO resto é fácil.
0
e1
são facilmente gerada através da conversão defalse
etrue
paraint
, antecedendo-os com o+
sinaland
eor
desde&
e|
é proibido@
v
pode ser gerada usandochr(ord('u') + 1)
, que se traduz em@chr(ord(u) + true)
usar as soluções alternativas acimachr(ord('a') - 2)
que se traduz emchr(ord(a) - true - true)
callable
tipo do PHP , que pode ser uma string contendo o nome da função. Assim, você pode concatenar constantes indefinidos e cadeias de caracteres individuais gerados porord()
construir o nome da função e chamá-lo assim:array_reverse()
torna-se(a.rray.chr(ord(a)-true-true).re.chr(ord(u)+true).erse)()
(array
é um construtor de linguagem, que é por isso que é dividido nas constantes indefinidosa
erray
)if ($n = $argv[1] and $i = 0) while ($n > $i++ and do_some and other_stuff or exit)
A lógica no código legível por humanos seria:
E a versão hostil que corresponde ao regex:
<?php if (@extract([x=>(object)[s=>[],i=>+false]])and@define(n,compact(arg.chr(ord(u)+true))[arg.chr(ord(u)+true)][+true]?:+true)and@define(un,chr(ord(a)-true-true))and@define(s,(a.rray.un.chunk)(range(+true,pow(n,true+true)),n)))while((@compact(x)[x]->s[]=s[@compact(x)[x]->i++])and(@compact(x)[x]->s[]=(a.rray.un.re.chr(ord(u)+true).erse)(s[@compact(x)[x]->i++]))and(n>@compact(x)[x]->i)or(@die((json.un.encode)((a.rray.un.filter)(@compact(x)[x]->s)))))?>
fonte
V
. Diverta-se! :)(array_re.chr(ord(u)+true).erse)()
! :) (... ou pelo menos você poderia quando o_
foi permitido)Ruby [rachado]
Primeiro desafio de Policiais e Ladrões. Espero não ter facilitado muito as coisas.
EDIT: substituído
\g<1>
por(?1)
porque é evidentemente equivalente no PCRE.Regex (PCRE)
Saída (n = 4)
(Retorna uma matriz de matrizes. É uma lambda, BTW, mas talvez isso dê muito?)
fonte
JavaScript (Rachado)
Primeira vez em um desafio de Policiais e Ladrões, espero que esteja certo.
Regex (JavaScript)
Saída
Uma matriz igual a:
fonte
$
no final da regex se o próprio código terminar no final da regex. Caso contrário, eu poderia fazer, por exemplo,x=>x.toString().toString().toString().toString()
e depois o que eu quiser depois disso..*
começo teria tornado tudo muito fácil. Pode ser qualquer programa seguido de um comentário. Basicamente, não inclua.*
no seu regex.Swift, regex 25 (Rachado)
Certo, vamos ver se eu entendi isso. Este é o meu primeiro post de policiais e ladrões, então deixe-me saber se eu errei!
Regex
Eu usei o sabor javascript no regex101.com
Saída de amostra
Código original
fonte
n
uma entrada, mas requer uma variável codificada . Se estiver correto, receio que isso não seja válido de acordo com o meta consenso.C - regex de 42 caracteres - rachado
Regex Javascript conforme usado em regex101 .
Adivinhar isso será trivial ...
A saída é delimitada por tabulação
\n
após cada linha.Minha solução, aqui inteiros 0-2 foram obtidos via
t-t
,t/t
et
:fonte
r
no seu regex.Gelatina , comprimento 14 rachada
rachado por Dennis
Regex Python.
Adicionado
m
novamente depois que eu deixei escapar./
(reduzir rapidamente);de
P
(produto) para`
(mônada da díade rápida);m
(indexação do módulo);v
(díade eval);de
Ḋ
(desenfileirar) aṫ
(cauda); e€
(para cada rápida)Para uma entrada das
4
saídas da mina:... porque eu formatei uma lista de listas como uma grade com
G
.fonte
Powershell, 23 bytes
Rachado por Matt
Solução original:
Recebe entrada como argumento e gera saída para stdout
Espero que este regex esteja OK, não espero que seja muito difícil de decifrar, pois não ofusquei muito dele, e o regex fornece alguns bons pontos de partida para preencher as lacunas, existe uma coisa no primeiro segmento que é muito incomum no código de golfe, o que pode atrapalhar alguém, acho que é necessária uma correspondência não gananciosa para tornar isso um pouco mais difícil.
Os primeiros policiais desafiam de qualquer maneira.
fonte
[Array]::Reverse()
vez de$array[9..0]
e$script:r
variáveis que são principalmente desnecessárias.Röda 0,12 , comprimento 19 (Rachado por @KritixiLithos)
PCRE:
Saída de amostra (n = 4):
Código original:
Experimente online!
fonte
PHP 7 (Seguro)
Código original
Segunda tentativa
Regex (PCRE): 29 bytes
Sem espaço, sem comentários, sem uso de base64_decode.
Muitas funções não são permitidas! sublinhado
Saída n = 11
Saída n = 4
Saída n = 3
fonte
MATL , comprimento 12 (seguro)
Regex
Usa o sabor Python:
Saída de exemplo
Para
n=4
:Solução
Para ver como isso funciona, considere a entrada
n=4
.fonte
Gelatina , comprimento 17 (seguro)
Regex Python.
Apertando o nó, isso proíbe algumas coisas mais úteis, para sua ajuda aqui estão os bytes proibidos:
pouco menos de um terço deles!
Para uma entrada das
4
saídas da mina:... porque eu formatei uma lista de listas como uma grade com
G
.Uma solução:
Experimente online! / regex101
O principal truque aqui é indexar em uma lista lexicograficamente classificada das permutações dos números naturais até n 2 (usando
œ?
para evitar a construção da lista de comprimento n 2 ! ) E dividir o resultado em pedaços de comprimento n . O índice acima mencionado é encontrado através da formação de sua representação no sistema de números fatoriais, que é de fórmula, uma vez que a cobra "sem fatia" é criada permutando elementos de uma maneira prescrita (isso pode ser facilmente convertido em um número comÆ¡
).A solução que apresento usa
Ŀ
para referenciar links anteriores como mônadas (substituindoÑ
eÇ
), mas vários$
em uma linha podem ser empregados para "alinhar" essas funções auxiliares. Ele também usar
uma vezḶ
eR
são proibidos.fonte
Pip , comprimento de regex 3 (seguro)
A solução é um programa completo que aceita n como argumento da linha de comando. Ele não usa nenhum sinalizador de linha de comando.
Regex (qualquer sabor)
Saída de amostra
Minha solução
Experimente online!
Estratégia
Aqui está o código que iria gostar de escrever:
Isso é:
a
emy
i
0 aa-1
i
for ímpar, inverta y, adicionei*a
a cada elemento, concatene um espaço para cada elemento e imprimaDificuldades
Muitos comandos e variáveis no Pip usam letras, mas alguns importantes não:
,
e\,
)+
,-
,*
,%
,++
):
){}
)Como contornamos essas limitações:
EN
umerate pode ser usado no lugar de,
; só precisamos de uma string com o número de caracteres que queremos e precisamos extrair o primeiro elemento de cada sub-lista em uma estrutura como[[0 "H"] [1 "i"]]
.F
ou loops.y
variável com oY
operador ank.X
é a multiplicação de strings ePU
sh (ouPB
"push-back") concatenará uma string com outra string no local. Para obter o comprimento de uma string, podemosEN
umerá-la e extrair o número certo da lista resultante._
.Específicos
Os elementos básicos do nosso programa:
Alcance
Isso está
map-unpack(_, enumerate(repeat(space, a)))
no pseudocódigo. Map-unpack é como o Pythonitertools.starmap
: dada uma lista de listas, ele chama uma função nos itens de cada sub-lista._
retorna seu primeiro argumento, portanto,_MU
apenas obtém o primeiro item de cada sub-lista. Por exemplo, se a = 3:... que é o mesmo que
,a
.Gama inclusiva
Não tenho certeza de que haja uma maneira de fazer
inclusive-range(1, a)
em uma única expressão, mas felizmente precisamos apenas dela uma vez, para que possamos construí-la nay
variável em três etapas.Em pseudocódigo,
yank(enumerate(repeat(space, a).push-back(space)))
:Em seguida,
POy
aparece o primeiro itemy
e o descarta, saindo[[1 " "] [2 " "] [3 " "]]
.Finalmente,
Ou seja
yank(map-unpack(_, y))
,: extraia o primeiro elemento de cada sub-lista e puxe a lista resultante novamentey
.y
é agora[1 2 3]
.comprimento
No pseudocódigo
pop(dequeue(enumerate(a.push-back(space))))
,. A dificuldade aqui é que enumerar apenas nos dá númeroslen(a)-1
, mas queremoslen(a)
. Primeiro, empurramos um espaço paraa
, alongando-o em um caractere e depois pegamoslen-1
a nova string.Matemática
Agora que temos uma maneira de obter o comprimento das strings, podemos usá-las para multiplicar e adicionar números:
O primeiro faz
sXaXb
para criar uma cadeia dea*b
espaços e depois leva o comprimento dela; o segundo fazsXaPBsXb
empurrar uma sequência deb
espaços para uma sequência dea
espaços e, em seguida, leva o comprimento dela.A parte boa é que todos os operadores que estamos usando aqui (
PU
,PO
,PB
,DQ
,EN
,X
) pode ser utilizado com_
a expressões forma lambda. Assim, podemos mapear transformações matemáticas para o intervalo inclusivo que construímos anteriormente.Também precisamos verificar o
i%2
interior do loop, mas isso é facilmente realizado com AND: bit a bitiBA1
.Coloque-os juntos
O código completo, com alguns espaços em branco adicionados:
fonte
-S
?a*b
é_V_VRVENCGaRLbPU1
,,a
é_MUENZGa
,aJ" "
éaJ_VRVk
ea@i
é algo como_V_VRVaZCGi
, embora ainda não consiga descobrir a precedência sem parênteses. Além disso, uma vaga idéia de que posso obter as permutações de um intervalo (criado como acima, usando o equivalente a,(a*a)
) e usá-lo para selecionar a permutação correta para cada linha.CJam, PCRE, comprimento 8, rachado
Exemplo de saída para 4:
fonte
CJam, PCRE, comprimento 9, rachado
Exemplo de saída para 4:
Agora também
{|}
estão proibidos.fonte
me
emq
para aproximar o número, então era tipo, extremamente (~ 20k bytes) de comprimento.Mathematica, comprimento de regex 11, não concorrente , rachado
Sabor PCRE:
A solução correta será uma função que pega um número inteiro e retorna a saída como uma lista aninhada, como:
fonte
tinylisp , comprimento 3 do regex ( rachado )
Você pode testar o código tinylisp em Experimente online!
Regex (qualquer sabor)
Hora de ir hardcore.
Saída
A solução define uma função que usa um único argumento inteiro e retorna uma lista como esta (para n = 4):
Meu código original usa a mesma idéia básica de Brian McCutchon, construindo listas e avaliando-as. Aqui está em uma linha:
Eu usei o método completo de construção e avaliação uma vez, para definir uma macro
d'
que faz definições comod
, mas pega seus argumentos agrupados em uma lista: então, em vez de(d x 42)
, você pode fazer(d'(x 42))
. Depois, basta reescrever qualquer lista nas definições que possam precisar de espaço em branco:(q(a b))
->(c a(q(b)))
->(c(h(q(a)))(q(b)))
.fonte
Python3, comprimento 162 (rachado!)
Regex:
^([^"' #]){24}"(?1){11}i%n(?1){4}2\*n-(?1){4}i%n(?1){10}i\/n(\)\/\/1)(?1){5}(?2)(?1){3}2\*\(i%n\)(?1){4}[int()2\/]{16}for i in range\(j,(?1){4}\]\)(?1){6}\"\*n\)$
Ok, eu sei, é muito longo. Felizmente, não será quebrado em menos de uma semana ...: 'D.
Acho que não cometi nenhum erro em nenhum lugar, isso permitiria respostas brechas.
Formato de saída
Código original:
n=int(input());j=0;exec("print([int(i%n+1+(2*n-(2*(i%n)+1))*((((i/n)//1+1)/2)//1)+(2*(i%n)+1)*int(int(i/n)/2))for i in range(j,j+n)]);j+=n;"*n)
fonte