Это странное слово?


29

Вызов

Учитывая одно слово в качестве входных данных, определить, является ли слово нечетным или четным.

Нечетные и четные слова

Предположим, общие правила:

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

В алфавите нечетные буквы:

aeiou

И четные буквы:

bcdfghjklmnpqrstvwxyz

То же относится и к заглавным буквам ( AEIOUнечетные и BCDFGHJKLMNPQRSTVWXYZчетные).

Затем вы «добавляете» каждую букву в слове вместе. Например, слово catsэквивалентно:

even + odd + even + even

Что упрощает до:

odd + even

Что упрощает дальше:

odd

Так что слово catsстранное.

Примеры

Input:  trees
Output: even

Input:  brush
Output: odd

Input:  CAts
Output: odd

Input:  Savoie
Output: even

Input:  rhythm
Output: even

правила

Весь ввод будет одним словом, которое будет содержать только алфавитные символы.

Если слово нечетное, выведите истинное значение. Если слово четное, выведите значение фальси.

выигрыш

Самый короткий код в байтах побеждает.


1
Не могли бы вы добавить пример слова без каких-либо нечетных букв.
Хеди

@ Хеди, я добавил один, ритм
бета-распад

7
Ex CuSe вас. «Нечетное слово ™ » уже зарегистрировано на JLee. Это несанкционированное использование термина. : P
Деусови

2
Это умоляет о подаче регулярных выражений
Рохан Джунджхунвала

2
Гарантируется, что ввод содержит только буквы алфавита?
DJMcMayhem

Ответы:



18

EXCEL, 79 байт:

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

вход:
эта функция может быть размещена в любом месте, кроме А1.
Поместите слово в вопрос А1.

Выход: 0, если четный, 1, если нечетный.


13

JavaScript (ES6), 34 41 33 32 байта

Сохранено 1 байт благодаря Арно:

s=>~s.split(/[aeiou]/i).length&1
  • Нечетное слово: возвращает 1
  • Четные слова: возврат 0


Предыдущие решения:

33 байта благодаря Арно:

s=>s.split(/[aeiou]/i).length&1^1
  • Нечетное слово: возвращает 1
  • Четные слова: возврат 0

Другой способ без побитовых операторов:

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

41 байт:

(s,a=s.match(/[aeiou]/ig))=>a&&a.length%2
  • Нечетное слово: возвращает 1
  • Четные слова с нечетными буквами: возвращает 0
  • Четные слова без нечетных букв: возвращает null

42 байта для возврата 0вместо null:

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

34 байта, разбиваются на слова без лишних букв:

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

Сохранено 2 байта благодаря Shaun H

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

1
Этот метод ломается, когда слово не имеет гласных. Тем не менее, f=не требуется, и вызов exec для объекта regex короче. s=>/[aeiou]/ig.exec(s).length%2
Шон Х

У меня нет такого же результата с execс gфлагом.
Хеди

черт возьми, да, игнорируй это, f = все еще не нужен, хотя
Shaun H

Не могли бы вы сделать s=>s.split(/[aeiou]/i).length&1^1?
Арнаулд

1
s=>~s.split(/[aeiou]/i).length&1на самом деле на один байт короче.
Арнаулд

8

Brain-Flak 206 196 192 178 + 3 = 181 байт

Попробуйте онлайн!

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

Это требует -c флаг работал в режиме ASCII, добавляя дополнительные 3 байта к длине программы.

Ungolfed

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

объяснение

Сначала сохраните высоту стека для будущих целей

([]<...>

Тогда пока стек не пустой (предполагается, что ни один из символов не равен нулю)

{...}

Вычтите девяносто семь (и сохраните 3 для последующих оптимизаций)

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

Если это не ноль (то есть не а)

{...}

Вычтите 4 (и сохраните 4 для дальнейшей оптимизации)

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

Если это не ноль (т.е. не е)

{...}

Вычтите 4 (и сохраните 4 для дальнейшей оптимизации)

({}[({})])

Если это не ноль (то есть не я)

{...}

Вычтите 6 (и сохраните 6 для дальнейшей оптимизации)

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

Если это не ноль (т.е. не о)

{...}

Вычтите 6 (сохраните 6, потому что программа ожидает один позже)

({}[({})])

Если это не ноль (то есть не вы)

{...}

Переместите остаток в другой стек и положите ноль в активный стек, чтобы избежать всех if

({}<>)(<>)

После того, как все ifs были удалены, удалите ноль и шесть

{}{}

Как только все символы были обработаны, вычтите высоту смещения из первоначально сохраненной высоты.

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

Мод на двоих

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

Я думаю, что -cэто только +1 байт, так как когда-либо Perl ответ также добавляет только 1 байт / флаг.
ThreeFx

1
@ThreeFx Это потому, что perl -pe'code'всего на один байт длиннее perl -e'code'.
Деннис

8

C, 42 байта

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

Это работает с GCC 4.x на процессоре x86-64. Результаты могут отличаться в зависимости от настроек.

Проверьте это на repl.it .

За счет дополнительных 5 байтов можно избежать неопределенного поведения, поэтому код должен работать до тех пор, пока int имеет ширину не менее 32 бит.

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

Как это работает

По модулю 32 коды символов всех нечетных букв равны 1 , 5 , 9 , 15 и 21 . 2130466 - это 32-разрядное целое число, которое устанавливает биты в этих позициях и не устанавливает биты во всех остальных.

Когда f вызывается в строке, он сначала проверяет, является ли первый символ строки нулевым байтом (терминатор строки). Если она есть, *sдает 0 и F возвращает 0 . В противном случае *sвыведите символьный код буквы и будет выполнен правильный аргумент логического AND ( &&).

Для >>, GCC генерирует команду сдвига. На процессоре x86-64 соответствующая инструкция для 32-разрядного целого числа игнорирует все, кроме младших 5 битов правильного аргумента, что позволяет избежать уменьшения *sпо модулю 32 . Сдвиг вправо и последующее побитовое И с 1 извлекает бит 2130466 , соответствующий букве, который будет равен 1 тогда и только тогда, когда буква нечетная.

После этого мы увеличиваем указатель s (фактически отбрасывая первую букву), рекурсивно вызываем f для обезглавленной строки и берем побитовый XOR результата сверху и результата рекурсивного вызова.


Отличная мудрая работа!
Кейу Ган

Верните 0 в Ideone, правильно?
РосЛюП

@RosLuP Нет, это не правильно. Это работает на моем компьютере и на repl.it, хотя (возможно, потому что версия GCC совсем другая).
Деннис

Да, это определенно компилятор. С clang 3.7 он работает и на Ideone .
Деннис

7

Сед 44 (42 + 1 для -n) 43

-1 спасибо Нейлу

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

Принты oдля нечетных и ничего для четных


s/[aeiou][^aeiou]*[aeiou]//giможет сэкономить вам байт, если я посчитал правильно.
Нил

@ Нил Да! Я бы хотел, чтобы sed мог делать не жадный поиск.
Райли


6

Python, 42 байта

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

Не так много, чтобы объяснить здесь. Безымянная функция, которая возвращает 0 или 1.


6

Brain-Flak , 524, 446 , 422 байта

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

Попробуйте онлайн!

Ungolfed, более читаемая версия:

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

Версия Ungolfed, похоже, не работает (не может соответствовать ссылке TIO в комментарии; _;)
Wheat Wizard

6
«более удобным для чтения» «nough сказал
Рохан Jhunjhunwala

6

Желе , 13 12 11 байт

-1 байт благодаря @Luis Mendo (используйте для замены %2)
-1 байт благодаря @Dennis (используйте сжатие строк)

Œlf“¡ẎṢɱ»LḂ

Все тестовые случаи в TryItOnline

Как?

Œ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)

Не конкурирует, 5 байт (так как я только что добавил функцию Øc)

fØcLḂ

Тестовые случаи также в TryItOnline

То же, что и выше, но Øcдает гласные латинского алфавита,'AEIOUaeiou'


1
Я думаю, что вы можете заменить %2на
Луис Мендо

7
Euoi - это крик страстного восторга в древних баховских пирушках , так что вы можете использовать словарь и получать гласные как “¡ẎṢɱ».
Деннис

@Dennis - LOL конечно!
Джонатан Аллан

2
@Dennis Как именно это работает? Это просто базовое сжатие, чтобы получить индекс слова в гигантском словаре? Откуда взялась буква «а»?
DJMcMayhem

2
@DJMcMayhem - это сжатие base 250 с использованием словаря (который, я считаю, был только что взят с компьютера Денниса) с разделением между короткими (менее 6 символов) и длинными словами. Некоторый код для автоматизации процесса создания сжатых строк был написан Линн. Неиспользуемые 6 байтов являются символами, идентифицирующими строку Jelly “”«»‘’(также есть строка, состоящая из двух символов, но используемая в сжатых строках).
Джонатан Аллан

6

Haskell, 38 37 байт

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

Спасибо Angs за один байт!


Правда для странных, поэтому вы должны использовать oddвместо even. Сохраняет один байт!
Angs

@Angs умный :)
BlackCap

4

Python 3, 53 байта

Это может быть, вероятно, в дальнейшем:

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

Удалите пробелы между inи 'aeiou'и forи используйте sumдля сохранения 8 байт: lambda n:sum(x in'aeiou'for x in n.lower())&1(хотя, как вы можете видеть из поста DJMcMayhem, использование всех десяти гласных также короче)
Джонатан Аллан

1
Спасибо за советы! Я заметил некоторые пробелы немного позже, но, честно говоря, @DJMcMayhem и я придерживались идентичных подходов, так как он был лучшей версией, которую я могу представить для решения Python. sum()До этого гольфа я не знал о команде, поэтому еще раз кое-чему научился! Хорошего дня :)
L. Steer

4

Ява, 73

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

видел пару других java ответов, иначе бы не поделился. Спасибо Phaeze за сохранение байта.


1
Я думаю, что вы можете сохранить байт с%2>0
JustinM - Восстановить Монику

4

C 52 байта

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

главное и результат:

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

*/

я пытаюсь использовать int в качестве указателей, но он не компилируется там, где использование переадресации * ... решение, напечатанное здесь первым, было неверным ...
RosLuP

h(o){return~-o?1^h(1+strpbrk(o,"aeiouAEIOU")):1;}экономит 3 байта.
Деннис

s; h (o) {s = ~ -o? 1 ^ h (1 + strpbrk (o, "aeiouAEIOU")): 1;} результат находится в глобальной переменной s ...
RosLuP

К сожалению, это запрещено. Функции должны быть многоразовыми, и это сломается, если вы будете использовать их более одного раза. Кроме того, сохранение выходных данных в переменной не допускается, если только вы не берете местоположение в качестве пользовательского ввода.
Деннис

Я думаю, что в этом случае повторное использование возможно, потому что начальное значение s сейчас не важно ... хорошо, хорошо, теперь я думаю, что что-то может пойти не так ... Спасибо
RosLuP



3

Vim, 32, 31 , 29 нажатий клавиш

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

Поскольку V-интерпретатор обратно совместим, вы можете попробовать его онлайн! Прямо здесь.

Один Три байта сохранен благодаря m-chrzan!


1
Вы можете сделать s/.../giвместо s/\c.../g?
m-chrzan

@ m-chrzan Воу, отличный совет. Благодарность!
DJMcMayhem

Также, '<C-r>"'-> @".
m-chrzan

1
Я узнал около @"15 минут назад. Лучший совет Vim, который у меня есть, это использовать :help fooи /документацию: P.
m-chrzan

2
Ну, так как мы говорим о гольфе, :h fooэто короче. : P
DJMcMayhem

3

Ява 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

тусклый , 14 байтов (не конкурирующий)

ar[aeiou]}et}T

Я думал, что это будет весело, простая задача для нового языка.

объяснение

  • a - вставить новый массив в матрицу
  • r[aeiou]} - подсчитать вхождения всех значений, соответствующих регулярному выражению "[aeiou]" в первом массиве (поскольку первый массив содержит входные данные), игнорируя регистр, и перенести это значение в конец последнего массива.
  • e - если последнее число в последнем массиве является четным (которое мы устанавливаем для числа вхождений), выполняйте следующие операции вплоть до закрывающей скобки ("}")
  • t - остановить выполнение, очистить матрицу и установить первое значение равным false
  • }- конец eблока кода
  • T - остановить выполнение, очистить матрицу и установить для первого значения значение true

Попробуйте онлайн!

Используйте поле ввода для ввода слова.

Я скоро добавлю документацию ...


2

PowerShell v2 +, 45 42 байта

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

Принимает ввод $args[0], передает его -replaceдля удаления всех не гласных символов, принимает полученный результат .lengthи%2 проверяет, является ли он нечетным / четным.

Примеры

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 байт

2|+/@e.&'aeiouAEOIU'

Прямой подход

объяснение

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

Ха-ха, я только что опубликовал ответ J (теперь удален) на 1 байт длиннее этого. Хорошая работа!
Конор О'Брайен

Где команда для «ввода ввода»?
Рослуп

@RosLuP Это глагол (функция), который принимает один аргумент в качестве входных данных. J использует молчаливое программирование, поэтому команды объединяются в цепочку и неявно передают значения
миль

2

Japt, 7 байт

1&Uè"%v

Проверьте это онлайн!Выходы 1 для нечетных, 0 для четных.

Как это работает

         // 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

Октава, 34 байта

@(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

Это на 6 байт короче, чем традиционный подход, использующий ismember , @(s)mod(sum(ismember(s,'aeiouAEIOU')),2)и два байта короче , чем регулярное выражение подхода: @(s)mod(nnz(regexpi(s,'[aeiou]')),2).

Проверьте это здесь .


2

PHP, 41 байт

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

Это выводит -1 для правды и 0 для фальси.




2

C # 64 62 56 50 байт

s=>1>s.Split("aeiouAEIOU".ToCharArray()).Length%2;
  • Мы уже используем linq, поэтому Contains сохраняет 2 байта над IndexOf
  • Использование метода перегрузки Count сохраняет 6 байтов
  • Спасибо @Milk за предложенный аккуратный метод и сохранение еще 6 байтов

Анонимная функция, которая берет строку и считает нечетные буквы, затем возвращает true, если их нечетное число, или false, если их нет.

Это новое решение разбивает строку на любой из символов в данном массиве символов. Механика этого переворачивает значение %2результата; 0 теперь нечетное, а 1 четное, следовательно 1>.

Попробуйте онлайн здесь!


string.Split()Для подсчета гласных требуется всего 50 байтов , а LINQ вам не нужен. s=>1>s.Split("aeiouAEIOU".ToCharArray()).Length%2;
молоко

@milk Спасибо за это, очень аккуратное решение.
ДжастинМ - Восстановить Монику



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.