Codegolf - Ла-Ла-Лэнд... Нет, Подожди, Му-Му, Лунный Свет

  • Автор темы Anonymous
  • Обновлено
  • 22, Oct 2024
  • #1

Этот вызов — дань уважения победителю премии «Оскар» за лучший фильм 2017 года. Ла Ла Ленд Лунный Свет!


Напишите функцию/программу, которая принимает строку, содержащую только буквы.

 Land
La La Land

Moonlight
Moo Moo Moonlight

quEueIng
quEueI quEueI quEueIng

This isn't a single word.
Thi Thi This isn't a single word.

It's fun to play golf
I I It's fun to play golf

Ooo
Ooo Ooo Ooo

I'm okay
I I I'm okay

Hmm, no. There will be at least one vowel, but it can be anywhere.
Hmm, no Hmm, no Hmm, no. There will be at least one vowel, but it can be anywhere.

Why is y a vowel?
Why Why Why is y a vowel?
 
, the four symbols that are common in every day sentences .,'? и пробелы и выводит строку в стиле Ла-Ла-Лэнда.

Чтобы быть более конкретным, возьмите буквы до первой группы гласных включительно и распечатайте/выведите их дважды, добавляя каждый раз пробел, затем распечатайте/выведите всю строку. й — гласная в этом вызове. Пунктуация и заглавные буквы должны быть сохранены.

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

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

[A-Za-z]

Таким образом, побеждает самый короткий код на каждом языке. Пояснения приветствуются, а также на основных языках.

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

Anonymous


Рег
22 Nov, 2007

Тем
90

Постов
186

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

Сед 30 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 *d="AEIOUYaeiouy";b;
f(char*a){

b=strcspn(a,d);

write(printf(" "),a,write(1,a,b+strspn(a+b,d)));

printf(" %s",a);
}
 
||answer||

05AB1E, 23 19 18 байт

Сэкономлено 1 байт благодаря Оккс.

strcspn()

Попробуйте онлайн! или как Тестовый набор

Объяснение

strspn() ||answer||

Желе, 24 22 20 19 14 байты

-5 байт, используя трюк Эмигны блестящий ответ (найдите 10 в списке isVowel)

*d="AEIOUYaeiouy";b;f(char*a){b=strcspn(a,d);write(printf(" "),a,write(1,a,b+strspn(a+b,d)));printf(" %s",a);}

Попробуйте онлайн! (не совсем уверен, как создать набор тестов для этой полной программы)


15 байтовая альтернатива:

Здесь это полный набор тестов.

Как?

, ||answer||

Питон, 61 байт

Вот и появился первый язык, не основанный на регулярных выражениях (с использованием регулярных выражений).

Сэкономлен 1 байт благодаря Нилу.

 

Nic_k


Рег
18 Mar, 2020

Тем
82

Постов
178

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

JavaScript (ES6), 40 46

Редактировать Сохранено 5+1 байт, спасибо @Arnauld

Слишком долго по сравнению с другими, использующими тот же трюк (как обычно)

,
 

Vov66


Рег
26 Apr, 2006

Тем
62

Постов
220

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

Пакетный, 180 байт

⊢(

Реализует конечный автомат. 1⍳⍨ keeps track of whether we've ever seen a vowel, so if the current letter isn't a vowel we know whether to output or continue with the next letter.

 

Cybermathic


Рег
29 May, 2006

Тем
74

Постов
204

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

PowerShell, 46 47 41 39 38 байт

1 0⍷

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

Спасибо Маартену Бамелису за исправление ошибки.

Сэкономлено 6 байт благодаря Rynant

Сэкономлено 2 3 байта благодаря Джоуи.

 

SHKoder


Рег
03 Oct, 2006

Тем
83

Постов
199

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

Руби, 31 32 30 байт

'aeiouy'∊⍨

Два байта сэкономлены благодаря GB и Cyoce.

 

NemoS


Рег
28 May, 2016

Тем
64

Постов
192

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

PHP, 55 54 байта

Примечание: в закодированной версии используется кодировка IBM-850.

' ',⍨

Запустите так:

819⌶

Объяснение

Просто замена регулярного выражения на неактивное совпадение с любым символом в начале строки, за которым следует любое количество гласных (используйте ⊢(↑,' ',↑,' ',⊢)⍨1⍳⍨1 0⍷'aeiouy'∊⍨' ',⍨819⌶ option для нечувствительности к регистру). Затем эта группа захвата печатается дважды, а затем вся строка.

Твики

  • Сохранено байт с помощью & & & to make [aeiouy]+ доступен (спасибо, Титус)
 

Luda12345


Рег
01 Mar, 2010

Тем
63

Постов
184

Баллов
529
  • 26, Oct 2024
  • #10

С, 202 196 195 193 190 180

$1

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


Осталось гольфу:

• Свернуть два файла printf в один.

• Печать моего пробела можно изменить на $0 logic I'm sure.

•Я использую условные предложения, которые можно каким-то образом удалить.

ans('Land') can likely be shortened.

•[A-Y] условная проверка, если ans which is usually un-necessary, though I'm currently stuck on that one (tried switching if-else and ditching the @(x)regexprep(x,'(^.*?[aeiouyAEIOUY]+)','$1 $1 $1') в целом, но для этого потребуется добавить больше {скобок} и увеличить размер байта)


Уловки, которые я использовал, чтобы справиться с этой задачей:

•Объединен двойной поиск строки цикла с использованием модуля для оси X и целочисленного деления для оси Y (входная строка и строка гласных). (Ось X повторяется дважды перед повторением один раз по оси Y; первый раз с [A-Z] и второй раз с [a-z] с использованием дифференциала символьного значения 32.

•Обойдена необходимость использования «[A-Y] и [a-y]», просто беря расстояние между наборами символов и по модулю 32. Таким образом, если расстояние равно 0 (A-A) или если расстояние равно 32 (a-A)

• Повторное использование целочисленных переменных, которые больше не используются в качестве логических переменных.

• Рекурсивный вызов функции с той же строкой для ее обработки и исключения второго цикла for.

• Установите значения BOOL в соответствии с логикой установки другой переменной. (например, bool = i=5;), чтобы выбить обоих одним выстрелом.

• Тройное пусто-истинное злоупотребление эксплойтом. (ССАГПЗ)


Читабельный формат:

w=input();a='';v=0 for i in w: if i in 'aeiouyAEIOUY': v=1 elif v: break a+=i a+=' ';print(a*2+w)

Скинул 10 байт благодаря Кейю Гану (в комментариях)

 

Fkosyachenko


Рег
01 Nov, 2008

Тем
71

Постов
196

Баллов
561
  • 26, Oct 2024
  • #11

MATL, 33 байта

i1`.*?[aeiouy]+ $0 $0 $0

Попробуйте это в МАТЛ Онлайн

Объяснение

y ||answer||

В, 21, 20 байт

l1~V\y+L{$0R+f2<ssDQdJ

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

Объяснение:

main(){char s[] = "queueing"; f(s);}

Шестнадцатеричный дамп:

#define v(x)while(x strchr("AEIOUY",*s&95))++s; a;f(s,t)char*s,*t;{t=s;v(!)v()a=*s;*s=0;printf("%s %s ",t,t);*s=a;puts(t);}

Альтернативная версия (21 байт):

java.util.regex.Pattern.CASE_INSENSITIVE

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

Здесь используется нелепое сжатие регулярных выражений, и ему все равно удается надрать задницу другим языкам игры в гольф. Для справки, это примерно две трети длины обычной «несжатой» версии, а именно:

2

Объяснение:

import java.util.regex.*; public class LaLaLandNoWaitMooMooMoonlight { public static void main(String[] args) { for (String[] strings : new String[][] { { "Land", "La La Land" }, { "Moonlight", "Moo Moo Moonlight" }, { "queueing", "queuei queuei queueing" }, { "This isn't a single word.", "Thi Thi This isn't a single word." }, { "It's fun to play golf", "I I It's fun to play golf" }, { "Ooo", "Ooo Ooo Ooo" }, { "I'm okay", "I I I'm okay" }, { "Hmm, no. There will be at least one vowel, but it can be anywhere.", "Hmm, no Hmm, no Hmm, no. There will be at least one vowel, but it can be anywhere." } }) { final String input = strings[0]; final String expected = strings[1]; final String actual = f(s -> { java.util.regex.Matcher m = java.util.regex.Pattern.compile("([^aeiouy]*[aeiouy]+)", 2).matcher(s); m.find(); return m.group() + " " + m.group() + " " + s; } , input); System.out.println("Input: " + input); System.out.println("Expected: " + expected); System.out.println("Actual: " + actual); System.out.println(); } } private static String f(java.util.function.Function<String, String> function, String input) { return function.apply(input); } }

Вот шестнадцатеричный дамп:

import java.util.regex.*;s->{Matcher m=Pattern.compile("([^aeiouy]*[aeiouy]+)",2).matcher(s);m.find();return m.group()+" "+m.group()+" "+s;} ||answer||

Питон 3, 75 68 байт

TRUE

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

Объяснение:

Работает путем генерации логического значения для каждого символа во входной строке в зависимости от того, является ли он гласной, и поиска наименьшего индекса T , the first non-vowel (excluding the first character). It returns the substring to this index twice,separated by spaces, and the original string.

 

DenNTRooT


Рег
28 Mar, 2006

Тем
92

Постов
205

Баллов
705
  • 26, Oct 2024
  • #12

Clojure, 192 188 181 байт

character

-4 байта путем встраивания c (whoops).

-7 байт за счет удаления некоторых пропущенных пробелов

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

См. код перед игрой в гольф:

character ||answer||

Питон 3, 101 96 байт

double

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

решение без регулярных выражений


Прокомментировал:

scan ||answer||

Ом, 19 байт (CP437), неконкурирующий

Новый язык, и поэтому мне пришлось добавить некоторые новые функции, чтобы это работало, что, к сожалению, делает его неконкурентоспособным (из-за лазеек).

sub("(.*?[aeiouy]+)","\\1 \\1 \\1",scan(,""),T,T)

Объяснение:

for(;$c=$argn[$i++];) // loop $c through input characters ($k+=$k^! // 2. !$k and vowel or $k and not vowel: increment $k trim($c,aeiouyAEIOUY) // 1. strip vowels -> vowel=false, non-vowel=true )>1 // 3. if $k>1 ? // do nothing :$w.=$c; // else append $c to $w echo"$w $w $argn"; // output ||answer||

PHP, 69 65 53 байта

-nR

требуется PHP 5.3 или новее. Запустить как трубу с ?1: or попробуйте несколько версий онлайн.

Сэкономлено 4 байта (и исправлен код) с регулярным выражением, украденным у @aross;
еще 10 с ?: instead of for(;$c=$argn[$i++];)($k+=$k^!trim($c,aeiouyAEIOUY))>1?:$w.=$c;echo"$w $w $argn"; и -F
и еще два с улучшенным регулярным выражением.

75 81 байт для версии без регулярного выражения:

preg_match

требуется PHP 5 или новее; заменять preg_filter with -F для более старого PHP. Беги с <?=preg_filter("#.*?[aeiouy]+#i","$0 $0 $0",$argn,1);

Авария

≡┬üC▓αy_ε;TF«u├DQüj Main wire, arguments: s ≡ Triplicate input ┬üC Push input, all lowercase with concatenated space character ▓ ; Map string into an array with... αy_ε Boolean: is element a vowel? TF«u Find first occurrence of [true, false] ├D Slice input up to that index and duplicate it Q Reverse stack üj Join on spaces, implicitly print ||answer||

Р, 49 байт

≡┬üC▓αy_ε;TF«u├DQüj

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

s=input() a='aAeEiIoOuUyY' v=i=0 for c in s: # for each character in the string w=c in a # w = True if the character is a vowel, else false # true is equivalent to 1 and false to zero # v*(w-1) evaluates only to true (-1 in this case) if v=1 (last character was a vowel) and w=0 (current character is not a vowel) if v*(w-1):break # if so, break the loop v=w;i+=1 # increase the counter and set v to w print(s[:i],s[:i],s) wait for a s=input() v=i=0 for c in s: w=c in'aAeEiIoOuUyY' if v*~-w:break v=w;i+=1 print(s[:i],s[:i],s) введите ввод, чтобы указать ему использовать (defn repeat-prefix-cons [phrase] (let [[first-letter] phrase ; Get first letter ; Function that checks if a lowercased character is a part of the vowel set vowel? #(#{\a \e \i \o \u \y} (Character/toLowerCase %)) ; cons(onant)? Negation of above cons? #(not (vowel? %)) ; Decide how to split it depending on if the first character is a vowel first-sp-pred (if (vowel? first-letter) vowel? cons?) ; Split off the first chunk of cons/vowels [pre1 r] (split-with first-sp-pred phrase) ; Split off the rest of the vowels [pre2 r2] (split-with vowel? r) ; Shortcut function that turns a list into a string (Basically (join "" some-list-of-strings) ) as #(apply str %)] (str ; ... then concat the prefix in front of the original phrase, and return (as ; ...then turn it back into a string since "repeat" returns a list... ^ (repeat 2 ; ... then repeat it twice (shame Clojure doesn't have string multiplication)... ^ (str (as pre1) (as pre2) \ ))) ; Concat the 2 prefix parts together with an space at the end... ^ phrase))) type we have to give it two arguments, first is the default , emtpy string for stdin, and for the second the R evaluation allow to use only first-sp-pred поскольку это не двусмысленно для (fn[p](let[[f] p v #(#{\a \e \i \o \u \y}(Character/toLowerCase %))[q r](split-with(if(v f)v #(not(v %)))p)[w _](split-with v r)as #(apply str %)](str(as(repeat 2(str(as q)(as w) \ )))p))) in this context.

0 stands for lambda s:(s[:[x in"aAeEiIoOuUyY"for x in s][1:].index(0)+1]+" ")*2+s и сохраните некоторый символ в качестве 4-го и 5-го параметра для sub, чтобы указать ему игнорировать регистр и использовать PCRE (жадность не совпадает с синтаксисом регулярных выражений R)

4 байта сохранено благодаря Самнер18 вместе с Тио ссылка на работающий код

 

Erocolioste10


Рег
09 May, 2007

Тем
79

Постов
194

Баллов
599
  • 26, Oct 2024
  • #13

Java 8, 147 140 байт

Гольф:

00000000: cde3 a883 5b61 6569 6f75 795d aba9 812f ....[aeiouy].../ 00000010: b120 b120 26 . . &

Негольфед:

Í " Replace on every line: ã " Case-insensitive ¨ © " Capture-group 1 <131> " Any character, any number of times (non-greedy) [aeiouy]« " A vowel, repeated once or more <129> " Followed by anything / " Replaced with: ± ± " Capture group one twice, with spaces between & " The whole matched pattern

Примечание: буквальный :%s/\v\c(.{-}[aeiou]).*/\1 \1 & in the code is the value of Í㨃[aeiouy]«©/± ± & .

 

Surok


Рег
14 Apr, 2006

Тем
69

Постов
190

Баллов
545
  • 26, Oct 2024
  • #14

С, 123 байта

00000000: e920 2fe3 5b61 6569 6f75 795d ab93 2e0a . /.[aeiouy].... 00000010: 33e4 7c3c 3.|<

Звоните как:

é " Insert a space / " Jump forward too... ã[aeiouy]«. " The first non-vowel after a vowel 3ä " Make three copies of | " Everything from the cursor to the first character < " Delete the space we inserted ||answer||

Пайк, 22 байта

é /ã[aeiouy]«“. 3ä|<

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

Это на 4 байта длиннее, чем должно было бы быть, если бы я реализовал более короткий способ получения гласных, включая % Implicitly grab input as a string '(^.*?[yY%s]+)' % Push this string literal (regex pattern) 13Y2 % Push the string literal 'AEIUOaeiuo' YD % Replace the '%s' in the string with 'AEIUOaeiuo' '$1 $1 $1' % Push the string literal to use for replacement which repeats % the first match 3 times YX % Perform regular expression matching and replacement % Implicitly display the result .

 

WilliamQual


Рег
13 Feb, 2014

Тем
73

Постов
198

Баллов
603
  • 26, Oct 2024
  • #16

Питон 3, 130 102 байт

i,j,k,m,n; f(char*a){ if((a[i/12]-"AEIOUY"[i++%6])%32==0) k=n=24-(i); else if(k&&!n--){ m=j=(i-13)/12; i=0; for(;i<j*2;) printf("%c%c",a[i%j],(i==j-1)?32:0),i++; printf(" %s", a); } m?:f(a); }

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

Не использует никаких функций и внешних библиотек! (Если только печать и ввод не считаются функциями, что они и делают).

Работает, проверяя, попадает ли она из согласных в начале названия в «зону гласных». Если он находится в «зоне гласных» и обнаруживает согласную, то печатает заголовок.

Сэкономлено 28 байт благодаря @LliwTelracs.

 

Dudkar


Рег
18 Mar, 2009

Тем
69

Постов
194

Баллов
559
  • 26, Oct 2024
  • #17

MATLAB/Октава, 58 51 байт

Сэкономлено 7 байт благодаря @HughNolan

==0

Создает анонимную функцию с именем ==0 which can be called by passing a string to it: j=(i-13)/12

Онлайн-демо

Для совместимости с MATLAB, %*c should be used in place of i,j,k,m,n;f(char*a){if((a[i/12]-"AEIOUY"[i++%6])%32==0)k=n=24-(i);else if(k&&!n--){m=j=(i-13)/12;for(i=0;i<j*2;)printf("%c%c",a[i%j],(i==j-1)*32),i++;printf(" %s", a);}m?:f(a);} в вышеуказанной функции.

 

Icelich


Рег
28 Apr, 2017

Тем
62

Постов
174

Баллов
514
  • 26, Oct 2024
  • #18

АПЛ (Диалог), 28 байт

{S:i/.*?<[aeiouy]>+/{$/xx 3}/} или 29 символов: s/.*?[aeiouy]+/$& $& $&/i

Просто ( -p or <!-- snippet demo: --> <input list=l oninput=console.log(f(this.value))> <datalist id=l><option value=Land> <option value=Moonlight> <option value=queueing> <option value="This isn't a single word."> <option value="It's fun to play golf"> <option value=Ooo> <option value="I'm okay."> <option value="Hmm, no. There will be at least one vowel, but it can be anywhere."> <option value="Why is y a vowel?"> ) PCRE без учета регистра Рзаменить

f= x=>(y=/.*?[aeiouy]+/i.exec(x)+' ')+y+x  the beginning
x=>(y=/.*?[aeiouy]+/i.exec(x)+' ')+y+x  zero or more characters (lazy)
$argn  one or more vowels

с

-R  the entire match thrice with spaces inbetween


Версия без RegEx, 43 байта

i

echo "This isn't a single word." | php -nR 'echo preg_filter(~ðэÎÐı└ñ×ÜûÉèåóÈÍðû,~█╬▀█╬▀█¤,$argn);'  lowercase

echo preg_filter("/^(.*?[aeiouy]+)/i","$1 $1 $0",$argn); echo preg_filter(~ðэÎÐı└ñ×ÜûÉèåóÈÍðû,~█╬▀█╬▀█¤,$argn); # Encoded  append a space

->s{(s[/.*?[aeiouy]+/i]+' ')*2+s}  which letters are vowels

$args-replace"^.*?[aeiouy]+",(,'$&'*3)  vowels that are followed by a non-vowel

g  index of first one

@echo off set/ps= set v=aeiouy set g=c set t= :l call set w=%%v:%s:~,1%=%% if %v%==%w% goto %g% set g=o :c set t=%t%%s:~,1% set s=%s:~1% goto l :o echo %t% %t% %t%%s% i`^.*?[aeiouy]+ $& $& $&  примените следующую неявную функцию со строкой в ​​качестве правого аргумента и указанным выше индексом в качестве левого аргумента

let f= x=>x.replace(/.*?[aeiouy]+/i,'$& $& $&') test=`Land La La Land Moonlight Moo Moo Moonlight queueing queuei queuei queueing This isn't a single word. Thi Thi This isn't a single word. It's fun to play golf I I It's fun to play golf Ooo Ooo Ooo Ooo I'm okay I I I'm okay Hmm, no. There will be at least one vowel, but it can be anywhere. Hmm, no Hmm, no Hmm, no. There will be at least one vowel, but it can be anywhere.` test.split(`\n\n`).forEach(z=>{ var [i,k]=z.split(`\n`),x=f(i); console.log(k==x ? 'OK':'KO',i+'\n'+x); })  that many characters taken from the string

x=>x.replace(/.*?[aeiouy]+/i,'$& $& $&')  followed by

import re;lambda x:re.sub('(.*?[aeiouy]+)',r'\1 \1 \1',x,1,2)  that many characters taken from the string

;⁶e€Øyw⁵ḣ@;⁶Ȯ; - Main link: string s ⁶ - space character ; - concatenate to s (for all vowel edge case) Øy - vowels + y yield e€ - exists in? for €ach (gives a list of isVowel identifiers) ⁵ - 10 w - index of first sublist (with implicit decimalisation of 10 to [1,0]) ḣ@ - head with reversed @rguments (start of word up to & including vowel group) ⁶ - space character ; - concatenate (start of word up to & including vowel group plus a space) Ȯ - print and yield (hence a full program... - ...the alternative ẋ2 repeats instead in order to return the result) ; - join with the input, s - implicit print (of the second repetition and input string)  followed by

;⁶e€Øyw⁵ḣ@;⁶ẋ2;  the string

 

BeZoN


Рег
28 Nov, 2003

Тем
90

Постов
208

Баллов
678
  • 26, Oct 2024
  • #19

С (ГКК), 111 110 байт

;⁶e€Øyw⁵ḣ@;⁶Ȯ;

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

Это просто использует библиотечные функции Dl # create a lowercase copy of implicit input ð« # append a space žO # push the vowels s # swap lowercase input to the top of the stack S # split into a list of chars å # check each char for membership in the vowel-string # (creates a list with 1 at the index of vowels and 0 for non-vowels) J # join to string Tk # find the index of 10 > # increment £ # take that many items from input D # duplicate this string ¹ # push input ðý # join the strings by space and Dlð«žOsSåJTk>£D¹ðý и использует порядок, в котором gcc оценивает параметры функции. Немного меньше играл в гольф

s/[^aeiouy]*[aeiouy]\+/& & &/i

Спасибо @gastropner за -1.

 

Alexxsvru


Рег
21 Nov, 2006

Тем
64

Постов
184

Баллов
524