Uma 'Sequência Par' é qualquer sequência em que a paridade dos valores ASCII dos caracteres esteja sempre alternada. Por exemplo, a sequência EvenSt-ring$!
é uma sequência par porque os valores ASCII dos caracteres são:
69 118 101 110 83 116 45 114 105 110 103 36 33
E as paridades desses números são:
Odd Even Odd Even Odd Even Odd Even Odd Even Odd Even Odd
O que está alternando o caminho todo. No entanto, uma sequência como nãoHello world!
é uma sequência par porque os valores ASCII são:
72 101 108 108 111 32 87 111 114 108 100 33
E as paridades são:
Even Odd Even Even Odd Even Odd Odd Even Even Even Odd
O que nem sempre é sempre alternado.
O desafio
Você deve escrever ou um programa completo ou uma função que aceita uma seqüência para entrada e gera um truthy valor se a string é ainda, e um valor Falsas contrário. Você pode levar sua entrada e saída em qualquer formato razoável e pode assumir que a entrada terá apenas ASCII imprimível (o intervalo 32-127). Você não precisa lidar com entrada vazia.
Exemplos
Aqui estão alguns exemplos de seqüências pares:
#define
EvenSt-ring$!
long
abcdABCD
3.141
~
0123456789
C ode - g ol!f
HatchingLobstersVexinglyPopulateJuvenileFoxglove
E todos esses exemplos nem são strings:
Hello World
PPCG
3.1415
babbage
Code-golf
Standard loopholes apply
Shortest answer in bytes wins
Happy golfing!
Você também pode usar esta solução não-gasta para testar qualquer string, se estiver curioso sobre um determinado caso de teste.
lno
.Respostas:
MATL ,
43 bytesAgradecemos a Emigna por salvar um byte e a Luis Mendo por corrigir alguns bugs. Código:
Explicação:
Experimente online!
fonte
A
.A
fora, graças à maneira como o MATLif
funciona.2\
poro
. E o código será muito ... imperativo :-)4
ainda é regular4
...05AB1E ,
54 bytesGuardado 1 byte graças a Adnan .
Experimente online!
Explicação
fonte
Ç¥ÉP
:)Geléia ,
754 bytesSalvou 2 bytes usando a ideia deltas de @ Steven H.
Guardou 1 byte graças a @ Lynn .
Experimente online! ou Verifique todos os casos de teste.
Explicação
fonte
%2
→Ḃ
mod
.Python 2, 54 bytes
fonte
Mathematica,
5044 bytesA versão atual é basicamente todo virtuosismo de Martin Ender.
Devoluções
True
ouFalse
. Nada muito inteligente: pega a soma mod-2 de cada par de códigos ASCII consecutivos e verifica se 0 nunca é obtido.Versão antiga:
fonte
JavaScript (ES6),
605046 bytesTentei recursão, mas com 51 bytes, não parece valer a pena:
Snippet de teste
Mostrar snippet de código
fonte
s=>[...Buffer(s)].every(c=>p-(p=c&1),p=2)
Explosão Cerebral ,
13811411284 + 3 = 87 bytesGraças a @Riley pela ajuda no golfe.
Este programa trata a entrada vazia como uma sequência não uniforme.
Experimente online!
Explicação (desatualizada)
Desloca a entrada da pilha esquerda para a direita enquanto modifica por 2. Encontra a diferença entre cada caractere adjacente até que todos tenham sido verificados ou uma das diferenças seja igual a zero (o que ocorreria apenas em uma sequência não-igual). Se o loop for encerrado devido a uma sequência não uniforme, volte para a pilha esquerda e insira o valor restante nela. Caso contrário, permaneça na pilha direita e coloque o zero acima do 1 restante na pilha.
fonte
([]){{}
->{
e remova([])
-o imediatamente antes do fechamento do primeiro loop.{({}(())){({}[()]<(()[{}])>)}{}({}<>)<>}<>
(42 bytes). Isso foi derivado do seu módulo original. Para que ele funcione com seu programa, é necessário adicionar um nilad +1 adicional:{({}(())){({}[()]<(()[{}])>)}{}({}()<>)<>}<>
R,
4135 bytesEDIT: salvou alguns bytes graças a @JDL usando em
diff
vez derle
.Explicação
readline()
leia a entrada.utf8ToInt()%%2
converter para valores ascii e mod 2 (armazenar como vetor R)all(rle()==1)
codificação de comprimento de execução de para encontrar execuções. Todas as execuções devem ser iguais a um ou menores que 2, pois nenhuma execução pode ser negativa ou 0 (salva um byte em vez de==
).fonte
prod(...)
ao invés deall(... == 1)
salvar alguns caracteres.>1
?all
fosse inteiramente zero e uns.rle
e usandodiff
:all(diff(utf8ToInt(readline())%%2))
(recebemos um aviso, mas acho que não é permitido)all(numeric(0))
qual éTRUE
, a resposta desejada para um comprimento de uma corda. (Eu testei, se isso importa, contra R-3.3.1)Pitão ( bifurcação ), 9 bytes
Link No Try It Online, porque o fork não possui sua própria versão nos intérpretes online.
Explicação:
fonte
Braquilog , 17 bytes
Experimente online!
Explicação
fonte
Java 8,
77767257 bytes-4 bytes graças a @Geobits .
Explicação:
Experimente online.
fonte
boolean
aqui (eu sei, é péssimo). O melhor que eu poderia conseguir isso dessa forma (72) é usando um sinalizador de int como:boolean c(char[]a){int i=3,b=1;for(int c:a)b=i==(i=c%2)?0:b;return b>0;}
Brain-Flak
155 151 141121Inclui +3 para -a
Economizou 30 bytes graças a 1000000000
Saída:
truthy : 1
falsy : 0 no topo da pilha
Experimente online! (verdade)
Experimente online! (falso)
Melhor explicação depois (se me lembro como funciona depois de algumas horas ...)
fonte
Estrelado , 85 bytes
Experimente online!
Observe que, como um programa Starry não tem como saber quando uma entrada de comprimento arbitrário termina, esse programa usa uma nova linha à direita na entrada para marcar o final da string. Se você receber uma mensagem de erro enigmática sobre um método indefinido
ord
paranil:NilClass
a entrada, falta uma nova linha à direita.Explicação
A estratégia básica que o programa emprega é ler os caracteres um a um a partir da entrada e, se não forem uma nova linha (caractere 10), modifica o valor ASCII do caractere por 2 e encontra a diferença entre ele e o caractere lido anteriormente. Se a diferença for zero, o programa termina e imprime
0
(falsey). Caso contrário, o programa volta e faz o processo novamente. Se o programa lê uma nova linha, ele termina e imprime10
(na verdade).Programa anotado
fonte
Perl, 24 + 1 (
-p
) = 25 bytes-4 bytes graças a @Ton Hospel !
Precisa de
-p
bandeira. As saídas 1 são a sequência é par, nada diferente. Por exemplo :Explicações : substitui cada caractere pelo seu valor mod 2 (para que a sequência contenha apenas 0s e 1s depois disso). Em seguida, procure dois seguintes 1 ou 0: se encontrar algum, a sequência não será par; caso contrário, será.
fonte
s/./$&&v1/eg;$_=!/(.)\1/
. PS(ord$&)%2
poderia ter sido escrito como1&ord$&
v1
?\x01
não é isso #J, 15 bytes
Uso
Explicação
fonte
Vim, 38 bytes
qqs<C-R>=char2nr(@")%2<CR><Esc>l@qq@q:g/00\|11/d<CR>
Assume a string de entrada no buffer e vazia
"q
. Produz absurdo binário se verdadeiro, nada se falso.s<C-R>=char2nr(@")%2<CR>
: Substitui um caractere por 1 se ímpar, 0 se for par. A macro em que se encontra faz isso com todos os caracteres da linha (não importa quanto tempo seja).:g/00\|11/d<CR>
: Exclui a linha se 2 "bits" consecutivos tiverem o mesmo valor. Mais rápido que uma referência posterior.Normalmente, no vimgolf, quando você usa uma função de expressão dentro de uma macro, você deve fazer a própria macro no registro de expressões e usar alguns truques para concluir a tabulação. Desta vez é mais difícil. Eu posso encontrar uma maneira de encurtar isso mais tarde.
fonte
Retina , 39 bytes
A contagem de bytes assume a codificação ISO 8859-1.
Saídas
1
para verdade e0
falsidade.Experimente online!(A primeira linha ativa um conjunto de testes separado por avanço de linha.)
Explicação
Inspirado por uma resposta de mbomb007, desenvolvi recentemente uma
ord()
implementação razoavelmente curta na Retina. Isso é amplamente baseado nisso, embora eu tenha sido capaz de fazer algumas simplificações, já que não preciso de um resultado decimal, pois só preciso oferecer suporte a ASCII imprimível (e só me preocupo com a paridade do resultado, terminando com um deslocamento arbitrário também é bom).Etapa 1: Divisão
Isso simplesmente divide a entrada em seus caracteres individuais, dividindo-a em torno da correspondência vazia e eliminando os resultados vazios no início e no final
_
.Etapa 2: substituir
o
%{
diz à Retina a) que esse estágio e o próximo devem ser executados em um loop até que a string pare de mudar por uma iteração completa e que esses dois estágios sejam aplicados a cada linha (ou seja, cada caractere) da entrada separadamente.O próprio palco é a técnica padrão para duplicar o primeiro caractere da entrada. Combinamos a string vazia (mas apenas observamos as duas primeiras correspondências) e inserimos o prefixo dessa correspondência. O prefixo da primeira correspondência (no início da string) está vazio, portanto, isso não faz nada, e o prefixo da segunda correspondência é o primeiro caractere, portanto, é duplicado.
Etapa 3: Transliterar
}
indica o fim do loop. O palco em si é uma transliteração.01
indica que ele deve ser aplicado apenas ao primeiro caractere da sequência.p
é uma abreviação de todos os caracteres ASCII imprimíveis e_
significa "excluir". Portanto, se expandirmos isso, a transliteração fará a seguinte transformação:Portanto, os espaços são excluídos e todos os outros caracteres são diminuídos. Isso significa que esses dois estágios juntos criarão um intervalo de caracteres do espaço ao caractere especificado (porque eles duplicam e decrementam repetidamente o primeiro caractere até que se torne um espaço no qual a duplicação e a exclusão são canceladas).
O comprimento desse intervalo pode ser usado para determinar a paridade do personagem.
Etapa 4: substituir
Simplesmente descartamos todos os pares de caracteres. Isso limpa as linhas de comprimento par e reduz as linhas de comprimento ímpar a um único caractere (o caractere de entrada, de fato, mas isso realmente não importa).
Etapa 5: partida
É mais fácil encontrar entradas que não são uniformes, por isso contamos o número de correspondências de duas linhas vazias sucessivas ou duas linhas não vazias sucessivas. Deveríamos obter
0
entradas pares e algo diferente de zero, caso contrário.Etapa 6: partida
Tudo o que resta é inverter o resultado, o que fazemos contando o número de correspondências desse regex, que verifica se a entrada começa com a
0
. Isso só é possível se o resultado da primeira etapa foi0
.fonte
Clojure, 59 bytes
Gera todos os pares seqüenciais da string
n
e verifica se a soma de cada par é ímpar. Se uma sequência de entradas é considerada um formato razoável, são 50 bytes.Veja on-line: https://ideone.com/USeSnk
fonte
Julia,
5553 BytesExplicado
Mapeie caracteres para 0 | 1 e verifique se a sequência resultante contém "00" ou "11", o que torna a sequência não alternada.
fonte
Python, 52 bytes
Uma função recursiva. Produz 1 (ou Verdadeiro) para seqüências pares, 0 para ímpares. Multiplica a paridade da diferença dos dois primeiros caracteres pelo valor recursivo no restante. Uma cadeia de caracteres únicos fornece True, conforme verificado, igualando seu primeiro caractere. Isso pressupõe que a entrada não esteja vazia; caso contrário, é necessário mais um byte para
s==s[:1]
oulen(s)<2
.Python 2, 52 bytes
Alternativamente, uma solução iterativa. Repete os caracteres de entrada, armazenando os valores de caracteres atuais e anteriores mod 2. Multiplica o produto em execução pela diferença, que causa 0 (Falsey) somente quando duas paridades consecutivas são iguais.
O valor "anterior" é inicializado para 2 (ou qualquer valor que não seja 0 ou 1) para que o primeiro caractere nunca corresponda à paridade com o caractere anterior fictício.
Python, 42 bytes, saídas via código de saída
Saídas via código de saída. Termina com um ZeroDivisionError quando dois caracteres consecutivos têm as mesmas paridades, caso contrário, termina de maneira limpa.
fonte
Haskell,
4240 bytesExemplo de uso:
all odd.(zipWith(-)=<<tail).map fromEnum $ "long"
->True
.Como funciona:
Edit: @xnor salvou dois bytes. Obrigado!
fonte
all odd.(zipWith(-)=<<tail).map fromEnum
.Mathematica,
4140 bytes-1 caracteres, graças a Martin Ender
fonte
C, 52 bytes
Compara a paridade dos 2 primeiros caracteres, movendo-se recursivamente pela sequência até encontrar 2 caracteres com a mesma paridade ou a sequência com o comprimento de 1 (
s[1] == 0
).Código com alguns dos casos de teste
fonte
f(char*s){s=s[1]?(*s-s[1])%2?f(s+1):0:1;}
você não precisa o int, retorno ou [0]*++s
vez do segundo,s[1]
você pode mudarf(s+1)
paraf(s)
. que mais meu comentário anterior reduzam o total para 39; Gostaria também de acrescentar que a remoção dereturn
marcas que não trabalho em ideone, mas ainda funciona com o gcc no Windowsf(char*s){s=s[1]?(*s-*++s)%2&&f(s):1;}
Eu continuar, mas é 5:00 e eu tenho acordar 3 horas lmaoPyke, 8 bytes
Experimente aqui!
fonte
C #, 69 bytes
Programa completo com casos de teste:
fonte
PHP, 69 bytes
solução com Regex 81 bytes
fonte
PowerShell v2 +, 47 bytes
(Não pode bastante pegar concorrentes habituais do PowerShell ...)
Pega a entrada
$args[0]
como uma cadeia de caracteres, lança-a como umachar
matriz e circula através dela|%{...}
, cada iteração colocando o módulo no pipeline (com implícita[char]
à[int]
conversão). Aqueles são encapsulados em parênteses e editados-join
em uma string, que é alimentada no lado esquerdo do-notmatch
operador, verificando00
ou11
( ou seja, retornaTrue
se o0
s e1
s alternativo). Esse resultado booleano é deixado no pipeline e a saída é implícita.Casos de teste
fonte
> <> ,
2927 bytesProduz 1 se a palavra for par, 0 se a palavra for ímpar.
Você pode experimentá-lo online .
Edit: salvou dois bytes graças a Martin Ender
fonte
Perl 6 ,
4726 bytesExpandido:
fonte
Scala, 54 bytes
Tenho certeza que isso pode ser melhorado.
fonte