Um programa quadriculado é um programa em que o valor ordinal de cada caractere individual alterna de par para ímpar, excluindo o terminador de linha (que pode ser qualquer final de linha padrão).
Um programa triangular é um programa em que cada linha possui um caractere adicional que a linha anterior, com a primeira linha tendo um caractere. Você não precisa manipular entrada vazia.
Sua tarefa é construir um programa que valide que a entrada fornecida atenda a esses critérios e produza / devolve algo verdadeiro se o programa atender aos critérios ou algo falso de outra forma.
Seu programa também deve atender a esses critérios.
Exemplos de programas válidos
G
`e
@u^
5r{B
^
cB
+$C
VA01
Regras
- Seu programa pode começar com um byte ímpar ou par, desde que a paridade dos caracteres se alterne.
- Seu programa deve validar os programas que começam com um caractere ímpar ou par.
- Para caracteres unicode, os valores de bytes subjacentes devem ter paridade alternada.
- Você pode assumir que a entrada contém apenas caracteres imprimíveis. Se o seu programa contiver imprimíveis, ele ainda poderá se validar.
- Seu programa pode incluir uma nova linha à direita. Isso não precisa ser permitido pela sua validação, pois você pode assumir que isso foi removido antes da validação.
- As brechas padrão são proibidas.
- O código mais curto em bytes, em cada idioma, vence.
code-golf
restricted-source
source-layout
Dom Hastings
fonte
fonte
E\nOE\nOEO
. Espero que ajude!Respostas:
Stax , 26 bytes
Executar casos de teste online
Eu tive que introduzir 3 caracteres indesejados.
i
é um no-op quando está fora de todas as construções de loop.é sempre um não-op.
O
coloca 1 na parte superior da pilha, mas o valor não é usado no programa.Execute este
fonte
C (gcc), 189 bytes
Experimente online!
␉
representa um caractere de tabulação (me desculpe). Observe que existem vários espaços / guias à direita (me desculpe). O original com abas intactas é melhor visualizado no vim com:set tabstop=1
(as palavras não podem expressar o quanto sinto muito).É uma função (chamada
f
, que não é imediatamente óbvia ao olhar para ela) que pega uma string como argumento e retorna um0
ou outro1
.Eu poderia reduzir isso em pelo menos uma e provavelmente duas ou mais linhas, mas observe que fica cada vez mais confuso e com pouco esforço no final, principalmente porque escrever um código tão horrível (mesmo para os padrões PPCG) estava me fazendo sentir como uma pessoa má e eu queria parar o mais rápido possível.
A idéia básica aqui é evitar construções que necessariamente quebrar o formato (
++
,+=
,return
, etc.). Milagrosamente, palavras-chave importantes comofor
,char
ewhile
(que eu não acabei usando) se encaixam na regra de paridade alternada. Então usei espaços (paridade par) e tabulações (paridade ímpar) como preenchimento para fazer o resto se encaixar nas regras.fonte
Haskell ,
10801033 bytesExperimente online!
Explicação
Essa tem sido uma tarefa bastante interessante para Haskell.
Paridade
Para começar, precisamos de uma maneira de determinar se um personagem tem um ponto de código par ou ímpar. A maneira normal de fazer isso é obter o ponto de código e modificá-lo com 2. No entanto, como se pode saber, obter o ponto de código de um caracter exige uma importação, o que devido à restrição de origem significa que ele não pode ser usava. Um Haskeller mais experiente pensaria em usar recursão.
Char
fazem parte daEnum
classe para que possamos obter seus antecessores e sucessores. No entantopred
esucc
também são ambos inutilizável porque eles não fazem paridade byte alternativo.Então, isso nos deixa muito presos, praticamente não podemos fazer nenhuma manipulação com caracteres. A solução para isso é codificar tudo. Podemos representar (a maioria) caracteres pares como literais, probabilidades com as quais temos problemas porque
'
é ímpar, por isso não pode estar ao lado do caractere, tornando o literal impossível de expressar a maioria dos caracteres ímpares. Portanto, codificamos todos os bytes pares e adicionamos uma captura de todos os bytes ímpares no final.Bytes com problema
Você pode perceber que existem alguns bytes pares para os quais literais não podem ser feitos colocando-os entre aspas simples. Eles são os imprimíveis, as novas linhas e
\
. Não precisamos nos preocupar com imprimíveis, desde que não utilizemos nenhum deles, não precisamos verificar. De fato, ainda podemos usar estranhos não imprimíveis, como tab, simplesmente não preciso. A nova linha pode sabiamente ser ignorada, pois será cortada do programa de qualquer maneira. (Poderíamos incluir nova linha, porque seu ponto de código é bastante conveniente, mas não precisamos). Isso deixa\
, agora\
tem o ponto de código 92, que convenientemente é um número ímpar seguido por um número par, então\92
alterna entre pares e probabilidades, portanto, o'\92'
é perfeitamente válido. Mais tarde, quando precisarmos representar a nova linha, perceberemos que ela possui essa mesma propriedade'\10'
.Problemas de espaçamento
Agora, para começar a escrever o código real, precisamos poder colocar um número considerável de caracteres em uma única linha. Para fazer isso, escrevi o cap:
A tampa não faz nada, exceto ser Haskell válido. Inicialmente, eu esperava fazer definições que nos ajudassem no código mais tarde, mas isso não aconteceu. Também existem maneiras mais fáceis de fazer o limite, por exemplo, espaço em branco e ponto-e-vírgula, mas eles não salvam bytes por esse caminho, então não me preocupei em alterá-lo.
Hardcoder
Então agora que tenho espaço suficiente em uma linha, inicio a codificação dos valores. Isso é muito chato, mas há algumas coisas interessantes. Por uma vez, as linhas começam a ficar ainda mais longas, podemos usar
;
para colocar várias declarações em uma linha, o que nos economiza uma tonelada de bytes.A segunda é que, como nem sempre podemos iniciar uma linha de
g
vez em quando, precisamos recuar um pouco as linhas. Agora, Haskell realmente se importa com o recuo, por isso vai reclamar disso. No entanto, se a última linha antes da linha recuada terminar em ponto e vírgula, será permitida. Por quê? Eu não tenho o menor, mas funciona. Então, precisamos nos lembrar de colocar o ponto e vírgula no final das linhas.Blocos de Construção de Função
Uma vez feito o codificador, é fácil navegar até o final do programa. Precisamos construir algumas funções simples. Primeiro eu construo uma versão do
drop
chamadoi
.i
é diferente dodrop
que, se tentarmos ultrapassar o final da string, ela retornará"y"
.i
é diferente de drop também, pois, se tentar soltar uma nova linha, retornará"y"
. Isso será útil porque mais tarde, quando verificarmos que o programa é um triângulo, isso nos permitirá retornarFalse
quando a última linha não estiver concluída ou quando uma linha termina cedo.k
k
True
k
False
Em seguida, fazer um alias para
k
,m
.m
é apenask
com1
no primeiro argumento e uma nova linha é anexada ao segundo argumento.Em seguida, temos
o
.o
pega um número e uma string. Determina se os bytes da string (ignorando novas linhas) se alternam em paridade (usando nossag
) começando com o número de entrada.Por fim, temos o
s
que rodao
com ambos1
e0
, se um deles é bem-sucedido, ele adiam
. Se falhar, apenas retornaFalse
. Esta é a função que queremos. Determina que a entrada é triangular e alternada.fonte
05AB1E ,
3426 bytesExperimente online!
Aceita a entrada como uma sequência de linhas múltiplas (entrada entre "" " ). Explicações a seguir.
fonte
Java 10, 209 bytes
Um lambda vazio tomando um iterável ou matriz de
byte
. Indica true retornando normalmente, false lançando uma exceção de tempo de execução. O programa espera que a linha final seja finalizada corretamente, ou seja, termine com um caractere de nova linha. A linha final do programa é encerrada da mesma forma.Tudo é feito sob UTF-8, com a interpretação de que "caractere" se refere a pontos de código Unicode.
As guias são substituídas por espaços nessa exibição.
Experimente Online
Hex dump
Reverta com o
xxd -p -r
Unix.Ungolfed
f
é o número esperado de caracteres na linha atual,h
é o número de caracteres vistos até agora na linha atual,c
é o último byte visto eb
sea
é a nova linha.A condição
a > -65
testa sea
é o primeiro byte em um caractere. Isso funciona porque os caracteres de byte único (ASCII) não são negativos no complemento de dois bits de 8 bits, o primeiro byte de caracteres mais longos possui formato binário11xxxxxx
(pelo menos -64 no complemento de dois) e os bytes não iniciais desses caracteres são de o formulário10xxxxxx
, no máximo -65 no complemento de dois. ( Fonte )Quando um personagem viola o padrão triangular ou quadriculado (ou seja, uma nova linha aparece cedo ou tarde ou aparece um byte de paridade errada), o ramo esquerdo do ternário correspondente (na atribuição a
f
ouc
) é ativado e o método lança uma exceção aritmética.fonte
Python 3 (3,4?), 350 bytes
Um desafio complicado para uma linguagem específica sobre espaço em branco como o Python 3. O envio é impresso
0
ou1
padronizado e trava para algumas entradas. O programa espera que a linha final seja finalizada corretamente, ou seja, termine com um caractere de nova linha. A linha final do programa é encerrada da mesma forma. UTF-8 é usado para verificar a paridade de bytes.As guias são substituídas por espaços nessa exibição.
Funciona para mim com o Python 3.4.2; não funciona em nenhum Python 3 no TIO. Parece-me um erro nos intérpretes da TIO.
Hex Dump
Reverta com o
xxd -p -r
Unix.fonte