Codegolf — Подсчитайте Количество Гласных В Каждом Слове Строки

  • Автор темы Подмастерье
  • Обновлено
  • 22, Oct 2024
  • #1

Это довольно простая задача.

Испытание

Ввод будет содержать строку (не

 This is the first test case     --> 1 1 1 1 1 2
one plus two equals three       --> 2 1 1 3 2
aeiou AEIOU                     --> 5 5
psst                            --> 0
the quick brown fox jumped over the lazy dog --> 1 2 1 1 2 2 1 1 1
 
or empty) of maximum length 100. Output the number of vowels in each word of the string, separated by spaces.

Правила

  • Длина строки не будет превышать 100 символов.
  • Строка будет содержать только алфавиты AEIOU , aeiou а также может содержать пробелы.
  • Входные данные должны потребляться от stdin or command line arguments.
  • Вывод должен быть выведен в stdout .
  • Вы можете написать полную программу или функцию, которая принимает входные данные из stdin and outputs the result.
  • Гласные, которые ваша программа/функция должна считать: a-z and A-Z .

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

null

Подсчет очков

Это , поэтому побеждает самое короткое представление (в байтах).

#код-гольф #код-гольф #строка #номер

Подмастерье


Рег
06 May, 2007

Тем
88

Постов
174

Баллов
634
  • 26, Oct 2024
  • #2

С, 113 108 103 96 байт

Спасибо @андреа-биондо для особенно приятной экономии 5 байт.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
$ ./vowelc "This is the first test case"
1 1 1 1 1 2 
$ ./vowelc "one plus two equals three"
2 1 1 3 2 
$ ./vowelc "aeiou AEIOU"
5 5 
$ ./vowelc "psst"                     
0

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

Самое интересное, пожалуй, в том, что

 
 K 

будет Ḳf€ØcL€ - Main link. Argument: s (a string) e.g. "aeiou AEIOU" Ḳ - Split the input on spaces ["aeiou", "AEIOU"] Øc - Generate the string "AEIOUaeiou" f€ - Filter out consonants from €ach ["aeiou", "AEIOU"] L€ - Length of €ach [5, 5] if Ḳf€ØcL€ является гласной ASCII (в верхнем или нижнем регистре) и "the quick brown fox" | vowels.ps1 for other characters vowels.ps1 . Подвыражение ($input-split'\s'|%{($_-split''-match'a|e|i|o|u').count})-join' ' maps data;infile stdin;file stdout;input c$@@;x=countc(c,'aeiou','i');put x@; и print' '.join(`sum(y in'aeiouAEIOU'for y in x)`for x in raw_input().split()) к f := [:s|s subStrings collect:[:w|(w count:#isVowel)]]. (f value: Stdin nextLine) print. , [:s|s subStrings do:[:w|(w count:#isVowel)print.' 'print]] and Stdin nextLine subStrings do:[:w|(w count:#isVowel)print.' 'print] to Stdin nextLine subStrings do:[:w|(w count:[:c|c isVowel])print.' 'print] , etc. When we add q){sum@'lower[" "vs x]in"aeiou"}"This is the first test case" 1 1 1 1 1 2i гласные соответствуют цифрам " "vs x / split x string by space lower[ ] / lower case in"aeiou" / check vowel sum@' / sum each booleans { } / lambda respectively, all of which are (conveniently) prime. In our range only such numbers will divide {sum@'lower[" "vs x]in"aeiou"} , т.е. только для гласных будет остаток {+/¨(∊∘'aeiou'⊢)¨' '(≠⊆⊢)⌊⍵} +/¨ ⍝ sum each word's vowel bit array (∊∘'aeiou'⊢)¨ ⍝ for each word, check for vowels ' '(≠⊆⊢) ⍝ split string on spaces ⌊⍵ ⍝ convert to lowercase be zero.

РЕДАКТИРОВАТЬ: Таким образом, можно рассмотреть выражение f=interact$unwords.map(show.length).filter(`elem`"aeiouAEIOU").words where $/=" ";while(<>){$n=()=/[aeiou]/gi;print"$n " как определение того, является ли персонаж *[aeiou]/_ Replace all vowels with underscores. (^| )[^_\s]+ |$/ 0 Replace words that have no vowels with a zero. [^_\s0]/ Remove all other letters. (_+)/(^^\1) Convert the underscore sequences into numbers (e.g. '___' to 3). is a vowel. In the comments @андреа-биондо отметил, что пара *[aeiou]/_ (^| )[^_\s]+ |$/ 0 [^_\s0]/ (_+)/(^^\1) can also be used in this expression to determine vowelhood. I'll leave the current explanation in terms of primes above, but the reason this shorter pairing works is again because in the range 28--53 the only numbers with prime factors entirely in the set of prime factors of 2016 are 28, 32, 36, 42, 48, which correspond precisely to the vowels.

EDIT2: еще 5 байт сохранено с тех пор. diff(find(regexprep([' ' input('','s') ' '],'[^aeiouAEIOU ]','')==' '))-1 can be shortened to u .

EDIT3: преобразован в цикл do- while, чтобы наконец получить его ниже 100 байт.

Тестовые случаи:

o ||answer||

Пиф, 17 байт

i

Прямое решение. Попробуйте онлайн: Демонстрация или Тестовый жгут

Объяснение:

e ||answer||

CJam, 21 19 байт

a

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

- (void)p:(NSString*)s{ NSArray*a=[s componentsSeparatedByString:@" "]; for (NSString*w in a) { int c=0; for (int i=0;i<w.length;i++) { if ([@"aeiouAEIOU" containsString: [w substringWithRange:NSMakeRange(i, 1)]]) { c++; } } NSLog(@"%d",c); } }

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

 

Albors


Рег
02 Aug, 2005

Тем
79

Постов
182

Баллов
607
  • 26, Oct 2024
  • #3

Р, 44 43 байта

-(void)p:(NSString*)s{NSArray*a=[s componentsSeparatedByString:@" "];for(NSString*w in a){int c=0;for(int i=0;i<w.length;i++){if([@"aeiouAEIOU"containsString:[w substringWithRange:NSMakeRange(i,1)]]){c++;}}NSLog(@"%d",c);}}

Ungolfed + объяснение:

$a = explode(' ',$argv[1]); foreach($a as $d) { preg_match_all('/[aeiou]/i', $d, $v); echo count($v[0]).' '; } ||answer||

Питон 3, 65 байт

foreach(explode(' ',$argv[1]) as$d){preg_match_all('/[aeiou]/i',$d,$v);echo count($v[0]).' ';}

Очень просто, вполне читабельно. import re print(*map(len,re.sub("[^aeiou ]","",input(),0,2).split(" "))) stands for word, s=function(x,y)strsplit(x,y)[[1]] write(unlist(Map(function(x)sum(x%in%s("AIUEOaiueo","")),Map(s,s(readLines("stdin")," "),"")),),stdout()) означает характер.

 

Carpinteyrofrv


Рег
21 Sep, 2015

Тем
85

Постов
195

Баллов
630
  • 26, Oct 2024
  • #4

Перл, 35 34 31

line=io.read() for word in line:lower():gmatch("%w+") do _,c=word:gsub("[aeiou]",'') io.write(c," ") end

~@W I.r():l():gm("%w+")_,c=W:g("[aeiou]",'')I.w(c,' ')$ characters Print@StringRiffle[ToString[#~StringCount~Characters@"aeiouAEIOU"]&/@StringSplit@InputString[]] для # Read a string from STDIN and split it into words s = split(readline()) # For each word in the string... for w in s # Get the number of vowels of any case in the word c = count(i -> i ∈ "aeiouAEIOU", w) # Print the number of vowels identified print(c, " ") end .

Как и во многих других кодах Perl, это работает справа налево. for w=split(readline()) print(count(i->i∈"aeiouAEIOU",w)," ")end will split the inputted line on whitespace. ${#x} запустит код между x=${w//[^aouieAOUIE]/} on each word that was split. for w in l переводит слово в нижний регистр. read l will give us the count of vowels. while read l;do for w in $l;do x=${w//[^aouieAOUIE]};echo -n ${#x}\ ;done;echo;done добавит к слову пробел. %{($_-replace"[^aeiou]",'').length} then prints all the words!

Запустить с:

print map-each n split input" "[c: 0 find-all n charset"aeiou"[++ c]c] ||answer||

Перл: 30 символов

(В некотором роде применяются правила: числа в выводе разделяются таким же количеством пробелов, как и входные слова.)

<pre id=O></pre>

Пример запуска:

// As requested by OP alert(prompt().replace(/\w+/g,w=>w.replace(/[^aeiou]/ig,'').length)) // Testable f=s=>s.replace(/\w+/g,w=>w.replace(/[^aeiou]/ig,'').length) test=[ ['This is the first test case','1 1 1 1 1 2'] ,['one plus two equals three','2 1 1 3 2'] ,['aeiou AEIOU', '5 5'] ] out=x=>O.innerHTML+=x+'\n' test.forEach(t=>{ r=f(t[0]) out('Test '+ ['Fail','OK'][0|r==t[1]] +'\nInput: '+ t[0] +'\nOutput: '+r +'\nCheck: '+t[1]+'\n') })

Перл: 27 символов

(Просто чтобы показать, насколько коротким было бы, если бы я не забыл о mad_gaksha@madlab /tmp/ $ ruby t.rb This is the first test case 1 1 1 1 1 2 's return value. Again. Now go and upvote хилемагия's отвечать что напомнило мне о $><<$*.map{|x|x.count'AIUEOaiueo'}*' ' 's return value. Again.)

s|\w+|lc($&)=~y/aeiou//|ge ||answer||

Рубин, 38 байт

y///

Использование:

y/// ||answer||

JavaScript (ES6), 68

Ввод/вывод через всплывающее окно. Запустите фрагмент в Firefox для проверки.

bash-4.3$ while read s; do printf '%-30s --> ' "$s"; perl -pe 's|\w+|@{[$&=~/[aeiou]/gi]}|ge' <<< "$s"; done < test-case.txt This is the first test case --> 1 1 1 1 1 2 one plus two equals three --> 2 1 1 3 2 aeiou AEIOU --> 5 5 psst --> 0 s|\w+|@{[$&=~/[aeiou]/gi]}|ge
 

Nikisina


Рег
30 Jun, 2014

Тем
66

Постов
216

Баллов
586
  • 26, Oct 2024
  • #5

Ребол - 70

echo 'aeiou AEIOU' | perl -nE'say map{lc=~y/aeiou//.$"}split' ||answer||

PowerShell, 35 байт

say

Немного скучно, но на этот раз действительно посоревноваться? (PowerShell по умолчанию не учитывает регистр, ух ты)

 

Seotop1


Рег
14 Apr, 2019

Тем
67

Постов
211

Баллов
596
  • 26, Oct 2024
  • #6

Баш - 85

.$"

Объяснение

  • =~y/aeiou// read one line from input
  • lc splits the line into words using whitespace separator
  • {} deletes all except vowels from the word
  • map is the length of resulting string === number of vowels
 

Byprolepaully


Рег
11 Dec, 2013

Тем
76

Постов
216

Баллов
616
  • 26, Oct 2024
  • #7

Юлия, 76 72 69 65 байт

split

Ungolfed + объяснение:

-n

Это будет включать в себя один конечный пробел, что, как мне сказали, является законным.

 

Salieyqoj


Рег
20 Aug, 2014

Тем
65

Постов
170

Баллов
495
  • 26, Oct 2024
  • #8

Математика, 95 байт

Не собираюсь выигрывать ни в каких конкурсах, но...

+1 ||answer||

гольфлуа, 55 байт

30

Базовое сопоставление гласных с образцом после принудительного ввода строчных букв. (Необработанный) эквивалент Lua будет

say map{lc=~y/aeiou//.$"}split ||answer||

Р, 139 байт

Чтение/запись stdout() ужасно

c ||answer||

Питон 3, 72 байта

Вдохновлено @randomra's отвечать. Это одинаковая длина

w ||answer||

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

print(*[sum(c in'aeiouAEIOU'for c in w)for w in input().split()])

PHP - 94

# Read a string from STDIN. scan() automatically constructs a vector # from input that contains spaces. The what= argument specifies that # a string will be read rather than a numeric value. Since it's the # second specified argument to scan(), we can simply do scan(,""). s <- scan(what = "") # For each word of the input, remove all consonants using gsub(), # which is vectorized over its input argument. g <- gsub("[^aeiou]", "", s, ignore.case = TRUE) # Print the number of remaining characters in each word to STDOUT # using cat(), which automatically separates vector values with a # single space. cat(nchar(g)) ||answer||

Версия без гольфа

cat(nchar(gsub("[^aeiou]","",scan(,""),T)))

Objective-C, 223 байта

Не самый компактный язык, но работает.

r{ }h e# Read the first word and enter a do-while loop el_ e# Convert the word into lower case and take a copy of it "aeiou" e# All small caps vowels - e# Remove all vowels from the copied word - e# Remove all non-vowels from the original word , e# At this point, we have a string with all vowels of the word e# Simply take its length S e# Put a space after the number of vowel r e# Read the next word. This serves as the truthy condition for the e# do-while loop for us as if there are no word left, this returns e# null/falsy and the do-while loop is exited ||answer||

Несжатая версия:

Матлаб, 73 байта

  • Ваша задача не очень понятна (но интересна). Я предполагаю r{el_"aeiou"--,Sr}h , z input r Z convert to lower-case c split at spaces m map each word d to: @"aeiou"d filter d for chars in "aeiou" l length jd join by spaces and implicitly print , jdml@"aeiou"dcrzZ , c%32+27 , (c-65&31)+28 .
  • Под «гласной» вы имеете в виду

Строка не содержит пробелов в начале или в конце.

(n,s) = (2016,28) ||answer||

Код:РС

, 50 байт

c

Это не совсем считается; rs был загружен примерно через 2 недели после публикации. Однако очевидно, что это все равно ничего не принесет, так что это все равно круто.

Живая демонстрация.

(n,s) = (124701951, 33) ||answer||

Реализация довольно проста:

!(n%((c-65&31)+s))

Перл, 60 45
Спасибо kirbyfan64sos за то, что сэкономил мне 15 байт — это действительно помогло!

Обратите внимание, что в конце вывода есть дополнительное пространство.

 

Aka623skestSoky


Рег
28 Oct, 2020

Тем
75

Постов
225

Баллов
660
  • 26, Oct 2024
  • #9
124701951%(...)

Хаскелл, 76 68 байт

Простая реализация, не уверен, есть ли здесь что-нибудь гольфное.

 

Per


Рег
28 Feb, 2005

Тем
82

Постов
215

Баллов
625
  • 26, Oct 2024
  • #11
33, 37, 41, 47, 53

КДБ(Q), 30 байт

33

Объяснение

2 ||answer||

Тест

Смолток - 66 72

'B'

Это в Smalltalk/X; имена stdin и stdout могут отличаться в squeak/pharo.

'b'

В Smalltalk/X (и многих других диалектах) символы понимают #value:, поэтому их можно сократить до 66 символов:

0

Если закодировано как функция, которая получает строку в качестве аргумента «s»:

'A' ||answer||

Конечно, в реальном коде можно было бы использовать служебную функцию «f», которая возвращает вектор счетчиков, и распечатать его. Однако формат вывода в этом случае не совсем соответствует задаче:

Питон 2, 76 байт

'a' ||answer||

Я сделал это до того, как увидел какое-либо другое решение, а затем проверил, чтобы найти два решения P3, которые короче :( Черт возьми, ограничения P2.

c-65&31

САС, 72

Ограничительный формат ввода-вывода для этого действительно вредит, поскольку здесь он отвечает за 25 байтов.

 

Crown_86


Рег
10 Oct, 2006

Тем
79

Постов
168

Баллов
573
  • 26, Oct 2024
  • #12
a-zA-Z

PowerShell, 65 байт 0

c

протестируйте, используя шаблон ниже, после сохранения как

Таким образом, это настоящий сценарий, а не просто фрагмент кода, тем самым удовлетворяющий ограничению:

«Ввод должен быть получен из аргументов стандартного ввода или командной строки».

 

Al.morozo2013


Рег
15 Nov, 2019

Тем
79

Постов
193

Баллов
608
  • 26, Oct 2024
  • #13
Желе 1

, 7 байт

Попробуйте онлайн! Найден с помощью г-н Кскодер в

чат

!(124701951%((c-65&31)+33))

Объяснение Если вывод должен main(a,v,c)char**v;{do{for(a=0;c=*v[1]++%32;2016%(c+27)||a++);printf("%d ",a);}while(v[1][-1]);} to the end

 

Josephea


Рег
01 Apr, 2014

Тем
80

Постов
179

Баллов
599
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно