Прогруз і Кольф


76

Ви коли-небудь захоплювались створенням класних хештегів Twitter, таких як #brexit або #brangelina ? цей гольф для вас.


Напишіть програму, яка приймає два рядки A & B як вхідні та об'єднує їх відповідно до наступного алгоритму:

  1. нехай nбуде кількість груп голосних в А (наприклад, britainмає 2 групи голосних: iв положенні 3 і aiв положенні 5).
    • якщо n = 1: обрізати A, починаючи з першого положення групи голосних (приклад: bill=> b)
    • якщо n> 1: обрізати A, починаючи з його n-1го-групи голосних (приклад: programming=> progr, britain=> br)
  2. видалити всі приголосні на початку B ( jennifer=> ennifer)
  3. об'єднати модифіковані A & B

Голосні звуки є aeiou; приголосні є bcdfghjklmnpqrstvwxyz.

Вхідні дані

Можна припустити, що вхідні рядки є малі і містять принаймні одну голосну і одну приголосну.

Приклади

brad + angelina      => brangelina
britain + exit       => brexit
ben + jennifer       => bennifer
brangelina + exit    => brangelexit
bill + hillary       => billary
angelina + brad      => angelad
programming + puzzle => progruzzle
code + golf          => colf
out + go             => o

65
Новий тестовий випадок? donald trump.
Стюі Гріффін

5
Це по суті портмантеа .
mbomb007


1
@ETHproductions, здається, створює багато різних комбінацій, таких якDjango + Angular = Djular
Pureferret

Що таке "n-1-та група голосних груп"
l4m2

Відповіді:


24

Ruby, 44 43 40 + 1 = 41 байт

+1 байт для -pпрапора Займає розділений пробілом вхід на STDIN.
-1 байт завдяки Мартіну
Ендеру -2 байти завдяки гістократу

sub /([aeiou]+([^aeiou]*)){,2} \g<2>/,""

Спробуйте в Інтернеті!

GNU sed, 39 37 + 1 = 38 байт

+1 байт для -Eпрапора Займає розділений пробілом вхід на STDIN.
-1 байт завдяки Мартіну Ендеру

s/([aeiou]+[^aeiou]*){,2} [^aeiou]*//

Спробуйте в Інтернеті!

Не публікувати це як окрему відповідь, оскільки це буквально те саме рішення.


Гарний вираз! Майте на увазі, якщо я використовую її частину у своїй відповіді JS?
ETHproductions

Звичайно, збожеволіти.
Йорданія

3
Ви можете [^aeiou]/([aeiou]+([^aeiou]*)){,2} \g<2>/
пограти в регекс


1
@Anko Дивіться у цій відповіді "Спеціальні виклики" . TL; DR: Тільки рахують байти на додаток до виклику за замовчуванням. Викликання за замовчуванням для Ruby - ruby -e "...". Для цього це ruby -pe "..."так, тому він додає лише один байт.
Йорданія

12

MATL, 31 30 байт

t13Y2XJmFwhdl=fql_):)itJmYsg)h

Спробуйте в Інтернеті

Пояснення

t       % Implicitly grab the input and duplicate it
13Y2    % Push the string literal 'aeiouAEIOU'
XJ      % Store this in clipboard J for later use
m       % Check which characters from the input are vowels (true for vowel)
Fwh     % Prepend FALSE to this logical array
dl=     % Compute the difference and find where we went from not-vowel to vowel
f       % Find the indices of these transitions
q       % Subtract 1 to get the location of the last consonant in each transition
l_)     % Get the next-to-last one of these
:)      % Grab the first string up to this location

% Now for the second component!

it      % Explicitly grab the input and duplicate
J       % Retrieve the string literal 'aeiouAEIOU' from clipboard J
m       % Find where the vowels are (true for vowel)
Ys      % Compute the cumulative sum along the array. The result will be 0
        % for all characters before the first vowel and non-zero after
g)      % Convert to logical and use this as an index so any characters
        % after the first value are retrieved

% Now to combine them

h       % Horizontally concatenate the first and second pieces together
        % Implicitly display the result

1
Я завжди прихиляюсь до щасливого коду
Andras Deak

12

JavaScript (ES6), 81 73 72 байт

Збережено 8 байт завдяки @Jordan, 1 завдяки @DavidConrad

a=>b=>a.match(/.*?(?=(?:[aeiou]+[^aeiou]*){1,2}$)/)+b.match(/[aeiou].*/)

Навіть незважаючи на те, що .matchповертає масив, array+arrayповертає рядок із вмістом масивів, об'єднаних (тобто [0]+[1]повертає "01").

Фрагмент тесту

Прекрасне рішення Ruby в Йорданії складе 53 байти в JS:

x=>x.replace(/([aeiou]+[^aeiou]*){1,2} [^aeiou]*/,"")

Можливо, можна просто викинути біт матчу та використати заміну?
Conor O'Brien

@ ConorO'Brien Це щось схоже на крадіжку відповіді Джордана: /
ETHproductions

Ви досить буквально читаєте мою думку. І так, це правда
Conor O'Brien

1
Каррінг (a,b)=>до a=>b=>зберігає 1 байт.
Девід Конрад

7

Желе , 23 22 байти

eۯcT
ǵḟ‘-ị’
Ç⁸ḣ⁹ÑḢ⁹ṫ

TryItOnline

Як?

eۯcT    - Link 1, vowel indexes: s   e.g. "colouring"
  Øc     - yield vowels, "AEIOUaeiou"
e€       - in for each                     [0,1,0,1,1,0,1,0,0]
    T    - truthy indexes (1-based)        [2,4,5,7]

ǵḟ‘-ị’  - Link 2, n-1th or only vowel group index start - 1: s
 µ       - monadic chain separation
Ç        - call last link (1) as a monad   [2,4,5,7]
   ‘     - increment                       [3,5,6,8]
  ḟ      - filter out                      [2,4,7]
    -    - -1
     ị   - index value                     [4]
               (Jelly is 1-based and has modular indexing,
                so the last but one item is at index -1,
                and when there is only 1 item in the list it is also at index -1)
      ’  - decrement                       [3]

Ç⁸ḣ⁹ÑḢ⁹ṫ - Main link: a, b                      e.g. "colouring", "pencils"
Ç        - call last link (2) as a monad with a      [3]
 ⁸       - link's left argument, a
  ḣ      - head a[:y]                                "col"
   ⁹  ⁹  - link's right argument, b
    Ñ    - call next link (1) as a monad                          [2,5]
     Ḣ   - pop head                                               [2]
       ṫ - tail b[y-1:]                                           "encils"
         - implicit print                            "colencils"

Красиво пояснено!
Pureferret

5

PowerShell v2 +, 76 байт

param($n,$m)($n-replace'([aeiou]+[^aeiou]*){1,2}$')+($m-replace'^[^aeiou]*')

Мабуть, це популярний регекс ... ;-)

Використовує -replaceоператор, щоб витягнути відповідні фрагменти, а потім об'єднати результати разом. Додає а $до першого, щоб перетягнути кінець рядка, а ^другий додає а, щоб перетягнути передню частину струни.


4

Сітківка , 35 байт

([aeiou]+[^aeiou]*){1,2} [^aeiou]*

Спробуйте в Інтернеті! (Перший рядок включає тестовий набір, відокремлений виведенням ліній.)

Просто вилучає всі збіги регулярного виразу на першому рядку.


1
Будь-які плани додавати класи голосних і неголосних? ;-)
ETHproductions

@ETHproductions Якщо я можу коли-небудь потрудитися реалізувати власний аромат регексу (або принаймні позначити його, щоб він міг бути перекладений у .NET regex), обов'язково! : P
Мартін Ендер

Ruby може робити зворотні посилання шаблону (той же візерунок, який може відповідати різній послідовності символів). Тут було б корисно. Наприклад, відповідні дужки узгоджуються /^((\(\g<1>\))*)$/в Ruby.
Джон Дворак

1
@JanDvorak Шкода, що Retina написана в .NET, так? ;) Я розглядав можливість поєднати його з github.com/ltrzesniewski/pcre-net, щоб ви могли перемикати смаки, але до цього ще не обійшлися , а деякі інші функції все частіше покладаються на поведінку відповідності .NET-відповідності.
Мартін Ендер

1
Час відмовитися від конкретної поведінки .net і переписати все на Ruby? Рубі все одно краще :-)
Джон Дворак

4

Кориця гумка, 23 байти

0000000: 64d3 884e 4ccd cc2f 8dd5 8e8e 8330 b434  d..NL../.....0.4
0000010: b108 d92b c0d9 00                        ...+...

Спробуйте в Інтернеті.

Пояснення

Це декомпресується до d([aeiou]+[^aeiou]*)([aeiou]+[^aeiou]*)? [^aeiou]*, що dвибирає все, що відповідає цьому регулярному вираженню. (Зверніть увагу, що гольфіст Йордану d([aeiou]+[^aeiou]*){,2} [^aeiou]*стискається до 24 байт через відсутність повторних елементів для стиснення.)


Чи d[aeiou]+[^aeiou]*[aeiou]*[^aeiou]* [^aeiou]*буде коротше?
ETHproductions

@ETHproductions Я спробував це, це те саме число байтів :(
спагето

3

PHP, 95 байт

$t="aeiou]";echo($p=preg_filter)("#([$t+[^$t*){1,2}$#","",$argv[1]).$p("#^[^$t*#","",$argv[2]);

з preg_match замість preg_filter 110 байт

$t="aeiou]";($p=preg_match)("#(.*?)([$t+[^$t*){1,2}$#",$argv[1],$m);$p("#[$t.*#",$argv[2],$n);echo$m[1].$n[0];

1
Ви можете використовувати +замість {1,2}.
Тит

@Titus важливіше було усунути помилку за 1 випадок, і тепер я можу спробувати пограти в гольф
Jörg Hülsermann

Використовуйте $v=aeiou;для збереження ще 3.
Тіт

@Titus У мене була така ж ідея, але з невеликим варіантом. Дякую
Йорг Хюльсерманн

3

Луа, 66 байт

$ cat merge.lua
print(((...):gsub(("[]+[^]*[]*[^]*+[^]*"):gsub("]","aeiou]"),"")))
$ lua merge.lua brad+angelina
brangelina
$ lua merge.lua programming+puzzle
progruzzle



2

Літп , 65 байт

#X::((replace X (regex "([aeiou]+[^aeiou]*){1,2} [^aeiou]*") ""))

В основному це порт відповіді JavaScript вище, моєю функціональною мовою програмування Lisp-ish.

Приклад використання:

(
    % Note, you can define this as a function, or assign it to a variable
    % and use the call function instead.
    (def f #X::((replace X (regex "([aeiou]+[^aeiou]*){1,2} [^aeiou]*") "")))
    (print (f "programming puzzle"))
)

Інтернетного перекладача поки немає. Я скоро його надам. Це не буде складно, моя мова написана на JavaScript.

Натомість це рішення головоломки реалізовано як робочий приклад для моєї мови. Його можна запустити за допомогою наступної команди:

node run.js l_src/progruzzle-colf.lithp

2

Haskell, 111 108 байт

v x=elem x"aeiou"
d=dropWhile
e=d v
k=d$not.v
r=reverse
f a|c<-e.k.e.k$a,""/=c=c|1<3=e.k$a
a!b=(r.f.r)a++k b

Таке рішення, що не регенерується, виявилося довше, ніж очікувалося. Ідеї ​​це все одно.



1

Japt , 18 байт

r/\v+\V*){1,2} \V*

Спробуйте в Інтернеті!

Прямий порт короткого JS-рішення, який, в свою чергу, є портом рішення Ruby в Йорданії .

Як це працює

Ur/\v+\V*){1,2} \V*/

Ur    Replace on the input...
/\v+\V*){1,2} \V*/  this regex with empty string.
      \v == [AEIOUaeiou], \V == [^AEIOUaeiou], `g` flag is on by default in Japt
      so the uncompressed regex is roughly /([aeiou]+[^aeiou]*){1,2} [^aeiou]*/g.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.