Dada uma expressão infix, determine se todas as constantes são do mesmo tipo.
Os operadores consistirão apenas desses operadores diádicos :+-/*
Seu programa ou função deve usar uma string de expressão válida como entrada e gerar um valor verdadeiro se as constantes na expressão forem do mesmo tempo e um valor falsey caso contrário.
A expressão consistirá apenas em constantes e pode conter qualquer um dos seguintes tipos:
- String, no formato
"String"
(Sempre as aspas duplas, podem estar vazias, sem caracteres de escape, podem conter qualquer texto ASCII) - Inteiro, da forma
14
(Sempre positivo ou zero) - Flutuante, na forma
7.3f
(Sempre positivo ou zero, sempre tem um componente decimal, por exemplo14.0f
) - Byte, no formato
0x42
(0-255
, Sempre 2 caracteres hexadecimais) - Booleano, no formato
true
(true
oufalse
, sem distinção entre maiúsculas e minúsculas)
A expressão não conterá parênteses, pois a ordem da operação não afeta o tipo quando não há coerção de tipo.
Uma constante solitária sem operadores é uma expressão válida.
Uma expressão vazia não é uma expressão válida.
Você pode assumir que a cadeia de expressão não contém espaços em branco fora dos literais da cadeia.
Nota: Como alternativa, você pode assumir que sempre haverá espaços entre constantes e operadores, como visto nos casos de teste. Se você fizer essa suposição, especifique como tal em sua resposta
Você não precisa lidar com expressões inválidas, como 1 +
.
Pontuação
Isso é código-golfe , e o menor número de bytes vence!
Casos de teste
(Espaço em branco adicionado para facilitar a leitura)
2 + 3
True
"Hello" / "World"
True
true * false
True
"Hello" + 4
False
"Hello" + "4"
True
3 + 2.4f / 8
False
0xff * 0xff
True
0xff + 2
False
6
True
" " + ""
True
"4 + false" + "word"
True
fonte
truE+fALSe
). Caso contrário, posso salvar dois bytes na minha solução.Respostas:
JavaScript (ES6),
79 7775 bytesGuardado 2 bytes graças a @ExpiredData
Espera espaço em branco ao redor dos operadores. Retorna um valor booleano.
Experimente online!
Quão?
/".*?"/g
/0x../g
/\S+f/g
/\d/
; se encontrarmos um, deve haver pelo menos um número inteiro"e"
ou"E"
com/e/i
; se encontrarmos um, deve haver pelo menos um valor booleanoTodas as expressões removidas são substituídas por uma vírgula, que é inofensiva.
Nós filtramos as expressões regulares que não causam alterações na sequência de entrada e testamos se menos de duas delas permanecem no final do processo.
fonte
true
efalse
são marcados como não diferenciando maiúsculas de minúsculas, acho que isso significa que você precisa fazer com que o seu regex ignore maiúsculas e minúsculas ao procurá-last
es
(embora eu possa estar errado).Perl 5
-p
, 73 bytesExperimente online!
Quão?
Tente remover cadeias, flutuadores, hexadecimal, booleano e números inteiros, nessa ordem. Pare assim que algo for removido. Após parar, verifique se a sequência restante consiste apenas em operadores e espaço em branco. Caso isso aconteça, a verificação do tipo é verdadeira; se não, é falso.
Primeira tentativa: Perl 5
-MList::Util=all
-p
, 99 bytesExperimente online!
fonte
$_=/^[+\/* -]*$/
pode ser alterado por$_=!y#-+/* ##c
, e....?e
por.*e
Geléia ,
3023 bytesExperimente online!
Um link monádico que recebe uma string como entrada e retorna 1 para true e 0 para false (valores booleanos de Jelly). Espera espaço em branco ao redor dos operadores.
Adicionei alguns novos casos de teste ao TIO, incluindo um com três operadores e um com caso misto para booleanos.
Explicação
fonte
C # (Compilador interativo do Visual C #) ,
113111109 bytesResposta javascript do Port of Arnauld . Tem 72 bytes com o sinalizador
/u:System.Text.RegularExpressions.Regex
.Experimente online!
fonte
Japonês
-!
, 36 bytesTente
fonte
05AB1E ,
5024 bytes-26 bytes criando uma porta para a resposta de @NickKennedy 's Jelly , portanto, !!
Espera entrada com espaços nos operandos.
Experimente on-line ou verifique todos (mais alguns) casos de teste .
Explicação:
fonte
Python 2 , 102 bytes
Experimente online!
Não tenho muita certeza de como representar alguns desses tipos no Python. Por exemplo, 0xff e 2 são tratados como números inteiros. E 2.4f não é um tipo válido em Python, eu acho. Capitalizado Verdadeiro e Falso para testar booleanos.
Editar: Gramática
fonte
true * false
primeiro.Stax , 26 bytes
Execute e depure
Este programa espera espaços ao redor dos operadores. Em geral, ele funciona aplicando algumas transformações à entrada, de modo que o caractere máximo para cada tipo de expressão seja distinto.
Descompactado, não jogado e comentado, parece com isso.
Execute este
fonte
Haskell, 140 bytes
fonte
f x=let z=...in ...
pode serf x|z<-...=...
.