É uma palavra estranha?


29

Desafio

Dada uma única palavra como entrada, determine se a palavra é ímpar ou par.

Palavras ímpares e pares

Suponha as regras gerais:

odd + odd = even
even + odd = odd
odd + even = odd
even + even = even

No alfabeto, as letras ímpares são:

aeiou

E as letras pares são:

bcdfghjklmnpqrstvwxyz

O mesmo se aplica às letras maiúsculas ( AEIOUsão ímpares e BCDFGHJKLMNPQRSTVWXYZpares).

Você 'adiciona' cada uma das letras da palavra. Por exemplo, a palavra catsé equivalente a:

even + odd + even + even

O que simplifica para:

odd + even

O que simplifica ainda mais:

odd

Então a palavra catsé estranha.

Exemplos

Input:  trees
Output: even

Input:  brush
Output: odd

Input:  CAts
Output: odd

Input:  Savoie
Output: even

Input:  rhythm
Output: even

Regras

Toda entrada será uma única palavra que conterá apenas caracteres alfabéticos.

Se a palavra for ímpar, insira um valor de verdade. Se a palavra for par, imprima um valor falsey.

Ganhando

O código mais curto em bytes vence.


11
Você poderia adicionar um exemplo de uma palavra sem letras ímpares.
Hedi

@Hedi Adicionei um, ritmo
Beta Decay

7
Ex desculpe você. Odd Word ™ já foi registrado pela JLee. Este é um uso não autorizado do termo. : P
Deusovi 20/09/16

2
Este está implorando por uma submissão regex pura
Rohan Jhunjhunwala

2
A entrada é garantida para conter apenas caracteres alfabéticos?
DJMcMayhem

Respostas:



18

EXCEL, 79 bytes:

=MOD(SUMPRODUCT(LEN(A1)-LEN(SUBSTITUTE(LOWER(A1),{"a","e","i","o","u"},""))),2)

entrada:
Esta função pode ser colocada em qualquer lugar, EXCETO A1
Coloque sua palavra em questão em A1.

Saída: 0 se for par, 1 se for ímpar.


13

JavaScript (ES6), 34 41 33 32 bytes

Economizou 1 bytes graças a Arnauld:

s=>~s.split(/[aeiou]/i).length&1
  • Palavra estranha: retorna 1
  • Palavras pares: retorna 0


Soluções anteriores:

33 bytes graças a Arnauld:

s=>s.split(/[aeiou]/i).length&1^1
  • Palavra estranha: retorna 1
  • Palavras pares: retorna 0

Outra maneira sem operadores bit a bit:

s=>++s.split(/[aeiou]/i).length%2

41 bytes:

(s,a=s.match(/[aeiou]/ig))=>a&&a.length%2
  • Palavra estranha: retorna 1
  • Palavras pares com letras ímpares: retorna 0
  • Palavras pares sem letras ímpares: retorna null

42 bytes para retornar em 0vez de null:

(s,a=s.match(/[aeiou]/ig))=>a?a.length%2:0

34 bytes, quebras de palavras sem letras ímpares:

f=s=>s.match(/[aeiou]/ig).length%2

Economizou 2 bytes graças a Shaun H

s=>s.match(/[aeiou]/ig).length%2

11
Esse método é interrompido quando o word não possui vogais. Dito isto: f=não é necessário, e chamar exec no objeto regex é mais curto. s=>/[aeiou]/ig.exec(s).length%2
Shaun H

Não tenho o mesmo resultado execcom a gbandeira.
Hedi

droga cérebro sim ignorar que, F = ainda não é necessário, embora
Shaun H

Você poderia fazer s=>s.split(/[aeiou]/i).length&1^1?
Arnauld

11
s=>~s.split(/[aeiou]/i).length&1é na verdade um byte mais curto.
Arnauld

8

Brain-Flak 206 196 192 178 + 3 = 181 bytes

Experimente Online!

([]<{({}[((((((()()())){}){}){}){}){}()]){({}[({}())]){({}[({})]){({}[({}()())]){({}[({})]){({}<>)(<>)}}}}}{}{}}><>[[]]<>()()){(({}[<>(())<>()()])){{}({}())((<>)<>)}{}}{}<>({}<>)  

Isso requer que o -csinalizador seja executado no modo ASCII, adicionando 3 bytes extras ao comprimento do programa.

Ungolfed

([]<
{({}[(((((()()()){}){}){}){}){}()])
 {
  ({}[()()()()])
  {
   ({}[()()()()])
   {
    ({}[(()()()){}])
    {
     ({}[(()()()){}])
     {
      ({}<>)
      (<>)
     }
    }
   }
  }
 }
 {}
}
><>[[]]<>)
(<(()()<>)>)<>{({}[()])<>(({}()[({})])){{}(<({}({}))>)}{}<>}{}<>({}<{}><>)

Explicação

Primeiro armazene a altura da pilha para fins futuros

([]<...>

Enquanto a pilha não estiver vazia (assume que nenhum dos caracteres é zero)

{...}

Subtraia noventa e sete (e armazene 3 para otimizações posteriores)

({}[((((((()()())){}){}){}){}){}()])

Se não for zero (ou seja, não a)

{...}

Subtraia 4 (e armazene 4 para otimizações posteriores)

({}[({}())])

Se não for zero (ou seja, não e)

{...}

Subtraia 4 (e armazene 4 para otimizações posteriores)

({}[({})])

Se não for zero (ou seja, não i)

{...}

Subtraia 6 (e armazene 6 para otimizações posteriores)

({}[({}()())])

Se não for zero (ou seja, não o)

{...}

Subtraia 6 (armazene 6 porque o programa espera um depois)

({}[({})])

Se não for zero (ou seja, não u)

{...}

Mova o restante para a outra pilha e coloque um zero na pilha ativa para escapar de todos os ifs

({}<>)(<>)

Depois que todos os ifs tiverem escapado, remova o zero e os seis

{}{}

Depois que todos os caracteres tiverem sido processados, subtraia a altura do deslocamento da altura armazenada originalmente.

...<>[[]]<>)

Mod por dois

{(({}[<>(())<>()()])){{}({}())((<>)<>)}{}}{}<>({}<>) 

Eu acho que -cé apenas +1 byte desde sempre Perl resposta também adiciona apenas 1 byte / flag.
ThreeFx

11
@ThreeFx Isso ocorre porque perl -pe'code'é apenas um byte maior que perl -e'code'.
Dennis

8

C, 42 bytes

f(char*s){return*s&&2130466>>*s&1^f(s+1);}

Isso funciona com o GCC 4.x em uma CPU x86-64. Os resultados podem variar de acordo com as diferentes configurações.

Testá-lo em repl.it .

Ao custo de mais 5 bytes, é possível evitar um comportamento indefinido, portanto o código deve funcionar desde que os int tenham pelo menos 32 bits de largura.

f(char*s){return*s&&2130466>>(*s&31)&1^f(s+1);}

Como funciona

Módulo 32 , os códigos de caracteres de todas as letras ímpares são 1 , 5 , 9 , 15 e 21 . 2130466 é o número inteiro de 32 bits que definiu bits nessas posições e não definiu bits em todas as outras.

Quando f é chamado em uma sequência, ele primeiro verifica se o primeiro caractere é um byte nulo (terminador de sequência). Se for, *sproduz 0 e f retorna 0 . Caso contrário, *sforneça o código de caractere de uma letra e o argumento correto do AND lógico ( &&) será executado.

Pois >>, o GCC gera uma instrução de turno. Em uma CPU x86-64, a instrução correspondente para um número inteiro de 32 bits ignora todos, exceto os 5 bits inferiores do argumento correto, o que evita a redução do *smódulo 32 . O deslocamento para a direita e o seguinte bit a bit E com 1 extratos do bit de 2.130.466 que corresponde à carta, que será 1 se e somente se a letra é estranho.

Depois, incrementar o ponteiro s (descartando efetivamente a primeira letra), chamada f recursivamente na corda decapitado, e tomar o XOR bit a bit do resultado de cima e o resultado da chamada recursiva.


Grande trabalho sábio!
Keyu Gan

erees Retorno 0 em Ideone, está certo?
RosLuP 21/09

@RosLuP Não, isso não está correto. Porém, ele funciona no meu computador e no repl.it (possivelmente porque a versão do GCC é bem diferente).
Dennis

Sim, é definitivamente o compilador. Com o clang 3.7, ele também funciona com o Ideone .
Dennis

7

sed 44 (42 + 1 para -n) 43

-1 graças a Neil

s/[aeiou][^aeiou]*[aeiou]//gi
/[aeiou]/Ico

Imprime opara ímpar e nada para par


s/[aeiou][^aeiou]*[aeiou]//gipode economizar um byte, se eu tiver contado corretamente.
Neil

@Neil Yep! Eu gostaria que o sed pudesse fazer uma pesquisa não gananciosa.
Riley #

7

Python, 41 bytes

lambda s:sum(map(s.count,"aeiouAEIOU"))%2

6

Python, 42 bytes

lambda s:sum(c in"aeiouAEIOU"for c in s)%2

Não há muito o que explicar aqui. Uma função sem nome que retorna 0 ou 1.


6

Brain-Flak , 524, 446 , 422 bytes

{(<((((()()()()){}){}){}<>)>)<>{({}[()])<>(({}[({})]())){{}(<({}({}))>)}{}<>}{}<>([(((({}<{}<>>))))]()){(<{}>)<>({}[()])<>}<>({}())<>{}([{}]()()()()()){(<{}>)<>({}[()])<>}<>({}())<>{}(((()()())){}{}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}(((()()()()())){}{}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}((((()()()){}())){}{}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}}(<(()())>)<>{({}[()])<>(({}[({})]())){{}(<({}({}))>)}{}<>}{}<>({}<{}<>>)

Experimente online!

Versão não-gasta e mais legível:

{((((()()()()){}){}){})(<({}<>)>)<>{({}[()])<>(({}()[({})])){{}(<({}({}))>)}{}<>}{}<>({}<{}><>)((((({})))))
(())
({}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}
(()()()()())
({}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}
(()()()()()()()()())
({}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}
(()()()()()()()()()()()()()()())
({}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}
(()()()()()()()()()()()()()()()()()()()()())
({}[{}])
{(<{}>)<>({}[()])<>}<>({}())<>{}}<>(()())(<({}<>)>)<>{({}[()])<>(({}()[({})])){{}(<({}({}))>)}{}<>}{}<>({}<{}><>){{}([()])
(<><>)}({}{}())

A versão Ungolfed não parece trabalho (não é possível vincular TIO ajuste no comentário; _;)
Trigo Assistente de

6
"mais legível" 'disse
Rohan Jhunjhunwala

6

Geléia , 13 12 11 bytes

-1 byte graças a @Luis Mendo (use para substituir %2)
-1 byte graças a @Dennis (use uma compactação de string)

Œlf“¡ẎṢɱ»LḂ

Todos os casos de teste estão em TryItOnline

Quão?

Œlf“¡ẎṢɱ»LḂ - Main link takes an argument - s
Œl          - lowercase(s)
   “¡ẎṢɱ»   - string of lowercase vowels (compression using the words a and eoui)
  f         - filter - keep only the vowels
         L  - length - the number of vowels
          Ḃ - Bit (modulo 2)

Não concorrente, 5 bytes (desde que acabei de adicionar a funçãoØc )

fØcLḂ

Casos de teste também em TryItOnline

O mesmo que acima, mas Øcproduz as vogais do alfabeto latino,'AEIOUaeiou'


11
Eu acho que você pode substituir %2por
Luis Mendo

7
euoi é um grito de arrebatamento apaixonado nas antigas revelações bacchicas , para que você possa usar o dicionário e obter as vogais como “¡ẎṢɱ».
Dennis

@Dennis - LOL é claro!
Jonathan Allan

2
@ Dennis Como exatamente isso funciona? É apenas compactação básica para obter o índice de uma palavra em um dicionário gigante? De onde vem o 'a'?
DJMcMayhem

2
@DJMcMayhem é uma compactação de base 250 usando um dicionário (que acredito ter sido tirado do computador de Dennis) com separação entre palavras curtas (menos de 6 caracteres) e palavras longas. Algum código para automatizar o processo de criação de seqüências de caracteres compactadas foi escrito por Lynn. Os 6 bytes não utilizados são os caracteres de identificação de cadeia de caracteres do Jelly “”«»‘’(também existe um para uma cadeia de dois caracteres, mas que é usada em cadeias compactadas).
Jonathan Allan

6

Haskell, 38 37 bytes

odd.length.filter(`elem`"aeiouAEIOU")

Graças a Angs por um byte!


Verdade para estranho, então você tem que usar em oddvez de even. Salva um byte!
Angs

@Angs clever :)
BlackCap 13/16

4

Python 3, 53 bytes

Provavelmente isso pode ser ainda mais importante:

lambda n:[x in 'aeiou' for x in n.lower()].count(1)&1

Remover espaços entre ine 'aeiou'e fore uso sumpara salvar 8 bytes: lambda n:sum(x in'aeiou'for x in n.lower())&1(embora, como você pode ver o post de DJMcMayhem usando todas as vogais dez também é mais curto)
Jonathan Allan

11
Obrigado pelas dicas! Percebi os espaços extras um pouco depois da publicação, mas com toda a honestidade, o @DJMcMayhem e eu tínhamos abordagens idênticas, pois ele era a melhor versão que eu posso imaginar para uma solução Python. Eu não sabia sobre o sum()comando antes deste golfe e, mais uma vez, aprendi alguma coisa! Tenha um bom dia :)
L. Steer

4

Java, 73

boolean f(String s){return s.replaceAll("(?i)[^aeiou]","").length()%2>0;}

vi algumas respostas java, caso contrário não teria compartilhado. Agradecemos a Phaeze por salvar um byte.


11
Eu acho que você pode salvar um byte com%2>0
JustinM - Reinstate Monica

4

C 52 bytes

h(o){o=strpbrk(o,"aeiouAEIOU");return o?1^h(o+1):0;}

o principal e o resultado:

main()
{int   k;
 char *a[]={"trees","brush","CAts","Savoie","rhythm", 0};

 for(k=0;a[k];++k)
     printf("[%s]=%s\n", a[k], h(a[k])?"odd":"even");
}

/*
91
[trees]=even
[brush]=odd
[CAts]=odd
[Savoie]=even
[rhythm]=even

*/

eu tento usar int como ponteiros, mas não compilar onde o uso de inirection * ... a solução impresso pela primeira vez aqui foi errado ...
RosLuP

h(o){return~-o?1^h(1+strpbrk(o,"aeiouAEIOU")):1;}salva 3 bytes.
Dennis

s; h (o) {s = ~ -o? 1 ^ h (1 + strpbrk (o, "aeiouAEIOU")): 1;} o resultado está na variável global s ...
RosLuP

Infelizmente, isso não é permitido. As funções precisam ser reutilizáveis, e isso será interrompido se você a usar mais de uma vez. Além disso, não é permitido salvar a saída em uma variável, a menos que você tome o local como entrada do usuário.
Dennis

Eu acho que, neste caso, a reutilização é possível becausr o valor inicial de s agora não é importante ... ok ok agora eu acho que alguma coisa pode dar errado ... Obrigado
RosLuP

3

Pitão, 14 bytes

%l@"aeiou"rQ02

Experimente Online!

Explicação:

  @"aeiou"       Grab only the vowels
          rQ0      From lowercased input
 l                 Get the length of this
%            2     And mod 2 to check for oddness


3

Teclas Vim, 32, 31 , 29

:s/[^aeiou]//gi
C<C-r>=len(@")%2<cr>

Como o intérprete V é compatível com versões anteriores, você pode experimentá-lo online! bem aqui.

Um Três bytes salvos graças ao m-chrzan!


11
Você pode fazer em s/.../givez de s/\c.../g?
M-chrzan 20/09/16

@ m-chrzan Woah, dica incrível. Obrigado!
DJMcMayhem

Além disso, '<C-r>"'-> @".
M-chrzan 20/09/16

11
Eu descobri cerca de @"15 minutos atrás. A melhor dica do vim que tenho é usar :help fooe /a documentação: P.
M-chrzan 20/09/16

2
Bem, já que estamos falando de golfe, :h fooé mais curto. : P
DJMcMayhem

3

Java 7, 88

boolean f(char[]s){int x=0;for(char c:s)if("aeiouAEIOU".indexOf(c)>=0)++x;return x%2>0;}

Ungolfed:

  boolean f(char[] s) {
    int x = 0;
    for (char c : s) {
      if ("aeiouAEIOU".indexOf(c) >= 0) {
        ++x;
      }
    }
    return x % 2 > 0;
  }

3

dimwit , 14 bytes (não concorrente)

ar[aeiou]}et}T

Eu pensei que este seria um desafio divertido e simples para um novo idioma.

Explicação

  • a - empurre uma nova matriz para a matriz
  • r[aeiou]} - conte ocorrências de todos os valores correspondentes ao regex "[aeiou]" na primeira matriz (uma vez que a primeira matriz contém a entrada), ignorando maiúsculas e minúsculas e envie esse valor até o final da última matriz.
  • e - se o último número da última matriz for par (que definimos como o número de ocorrências), execute as próximas operações até um colchete de fechamento ("}")
  • t - interrompa a execução, limpe a matriz e defina o primeiro valor como falso
  • } - fim do e bloco código
  • T - interrompa a execução, limpe a matriz e defina o primeiro valor como verdadeiro

Experimente online!

Use o campo Entrada para inserir a palavra.

Em breve adicionarei documentação ...


2

PowerShell v2 +, 45 42 bytes

($args[0]-replace'[^aeiouAEIOU]').Length%2

Recebe entrada $args[0], envia-a -replacepara remover todos os caracteres que não são vogais, pega o resultado .lengthe %2verifica se é ímpar / par.

Exemplos

PS C:\Tools\Scripts\golfing> 'trees','brush','CAts','Savoie','rhythm'|%{"$_ --> "+(.\is-it-an-odd-word.ps1 $_)}
trees --> 0
brush --> 1
CAts --> 1
Savoie --> 0
rhythm --> 0

2

J, 20 bytes

2|+/@e.&'aeiouAEOIU'

Abordagem direta

Explicação

2|+/@e.&'aeiouAEOIU'  Input: string S
     e.&'aeiouAEOIU'  Test each char in S for membership in 'aeiouAEOIU'
  +/@                 Sum those values
2|                    Take it modulo 2 and return

Haha, acabei de postar uma resposta em J (agora excluída) 1 byte a mais que isso. Bom trabalho!
Conor O'Brien

Onde está o comando para "receber entrada"?
RosLuP 22/09

@RosLuP Este é um verbo (função) que recebe um único argumento como entrada. J usa programação tácito para que os comandos são encadeados e valores passagem implicitamente
milhas

2

Japonês, 7 bytes

1&Uè"%v

Teste online! Saídas 1 para ímpar, 0 para par.

Como funciona

         // Implicit: U = input string
  Uè     // Count the number of matches of the following regex in the input:
    "%v  //   /[AEIOUaeiou]/g
1&       // Take only the first bit (convert 1, 3, 5, etc. to 1, and others to 0)
         // Implicit output

2

Oitava, 34 bytes

@(s)mod(nnz(~(s'-'aeiouAEIOU')),2)


s'-'aeiouAEIOU'    % Creates a 2D-matrix where each of the odd letters are 
                   % subtracted from the string s
~(s'-'aeiouAEIOU') % Negates that array, so the all zero elements become 1
nnz( .... )        % Counts all the non-zero elements (the odd letters)
mod(nnz( ....),2   % Takes this sum modulus 2

Este é 6 bytes mais curto do que a abordagem tradicional utilizando ismember, @(s)mod(sum(ismember(s,'aeiouAEIOU')),2)e dois bytes mais curto do que a abordagem regex:@(s)mod(nnz(regexpi(s,'[aeiou]')),2) .

Teste aqui .


2

PHP, 41 bytes

<?=count(spliti("[aeiou]",$argv[1]))%2-1;

Isso gera -1 para verdade e 0 para falsey.


2

Mathematica, 44 bytes

OddQ@StringCount[#,Characters@"aeiouAEIOU"]&

Dá Verdadeiro para uma sequência ímpar e Falso para uma sequência par.


11
+1 a qualquer mathematica homem ou mulher aprendizagem
Magia Octopus Urna


2

C # 64 62 56 50 bytes

s=>1>s.Split("aeiouAEIOU".ToCharArray()).Length%2;
  • Já estamos usando linq, portanto Contém economiza 2 bytes sobre IndexOf
  • Usar a sobrecarga de método de Count economiza 6 bytes
  • Obrigado ao @Milk por sugerir um método elegante e salvar mais 6 bytes

Uma função anônima que pega uma string e conta as letras ímpares retorna true se houver um número ímpar delas ou false se não houver.

Esta nova solução divide a cadeia de caracteres em qualquer um dos caracteres na matriz de caracteres especificada. A mecânica disso muda o significado do %2resultado; 0 agora é ímpar e 1, portanto, o 1>.

Experimente online aqui!


São apenas 50 bytes para string.Split()contar as vogais e você não precisa de LINQ.s=>1>s.Split("aeiouAEIOU".ToCharArray()).Length%2;
milk

@ leite Obrigado por isso, solução muito elegante.
JustinM - Restabelece Monica

1

Retina , 19 bytes

Mi`[aeiou]
[13579]$

Experimente online!(A primeira linha ativa um conjunto de testes separado por avanço de linha.)

A primeira linha conta as vogais na entrada. A segunda linha verifica se o resultado é ímpar.


1

MATL , 8 , 7 bytes

13Y2mso

Experimente online!

Explicação:

13Y2    % Push the string 'aeiouAEIOU', a predefined literal. 
    m   % For each char of the input that is in that string, push a one. For every other element, push a zero.
     s  % Sum this array
      o % Mod 2

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.