Progruzzle i Colf

76

Czy kiedykolwiek miałeś ochotę stworzyć fajne hashtagi typu twitter, takie jak #brexit lub #brangelina ? ten golf jest dla ciebie.


Napisz program, który akceptuje dwa ciągi A i B jako dane wejściowe i scala je zgodnie z następującym algorytmem:

  1. niech nbędzie liczbą grup samogłosek w A (np. britainma 2 grupy samogłosek: iw pozycji 3 iai na pozycji 5).
    • if n = 1: obetnij A zaczynając od pierwszej pozycji grupy samogłosek (przykład: bill=>b )
    • jeśli n> 1: obetnij A zaczynając od n-1pozycji grupy samogłoskowej (przykład: programming=> progr, britain=> br)
  2. usuń wszystkie spółgłoski na początku B ( jennifer=> ennifer)
  3. połączyć zmodyfikowane A i B

Samogłoski są aeiou; spółgłosek sąbcdfghjklmnpqrstvwxyz .

Wejście

Możesz założyć, że łańcuchy wejściowe są pisane małymi literami i zawierają co najmniej jedną samogłoskę i jedną spółgłoskę.

Przykłady

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
Arnaud
źródło
65
Nowy przypadek testowy? donald trump.
Stewie Griffin,
5
Są to zasadniczo portmanteaus .
mbomb007,
3
Powiązane
ETHproductions
1
@ETHproductions wydaje się, że produkuje to bardzo różne kombinacje, takie jakDjango + Angular = Djular
Pureferret
Co to jest „n-1 pozycja grupy samogłosek”
l4m2

Odpowiedzi:

24

Rubinowy, 44 43 40 + 1 = 41 bajtów

+1 bajt dla -pflagi. Pobiera wejście oddzielone spacją w STDIN.
-1 bajt dzięki Martin Ender
-2 bajty dzięki histocrat

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

Wypróbuj online!

GNU sed, 39 37 + 1 = 38 bajtów

+1 bajt dla -Eflagi. Pobiera wejście oddzielone spacją w STDIN.
-1 bajt dzięki Martin Ender

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

Wypróbuj online!

Nie publikowanie tego jako oddzielnej odpowiedzi, ponieważ jest to dosłownie to samo rozwiązanie.

Jordania
źródło
Ładne wyrażenie regularne! Czy mogę użyć części tego w mojej odpowiedzi JS?
ETHprodukcje
Jasne, oszalej.
Jordan
3
Możesz [^aeiou]/([aeiou]+([^aeiou]*)){,2} \g<2>/
zagrać w
1
@ Ana Patrz „Specjalne zaproszenia” w tej odpowiedzi . TL; DR: oprócz domyślnego wywołania liczą się tylko bajty. Domyślne wywołanie dla Ruby to ruby -e "...". W tym ruby -pe "..."celu dodaje tylko jeden bajt.
Jordan
12

MATL, 31 30 bajtów

t13Y2XJmFwhdl=fql_):)itJmYsg)h

Wypróbuj online

Wyjaśnienie

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
Suever
źródło
1
Zawsze popieram szczęśliwy kod
Andras Deak
12

JavaScript (ES6), 81 73 72 bajty

Zaoszczędzono 8 bajtów dzięki @Jordan, 1 dzięki @DavidConrad

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

Mimo że .matchzwraca tablicę, array+arrayzwraca ciąg znaków z zawartością połączonych tablic (tzn. [0]+[1]Zwraca "01").

Testowy fragment kodu

Doskonałe rozwiązanie Ruby dla Jordana miałoby 53 bajty w JS:

x=>x.replace(/([aeiou]+[^aeiou]*){1,2} [^aeiou]*/,"")
ETHprodukcje
źródło
Może po prostu wyrzucisz kawałek zapałki i użyjesz zamiennika?
Conor O'Brien
@ ConorO'Brien To trochę przypomina kradzież odpowiedzi Jordana: /
ETHproductions
Dosłownie czytasz mi w myślach. I tak, to prawda
Conor O'Brien
1
Currying (a,b)=>do a=>b=>oszczędza 1 bajt.
David Conrad,
7

Galaretka , 23 22 bajtów

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

TryItOnline

W jaki sposób?

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"
Jonathan Allan
źródło
Pięknie wyjaśnione!
Pureferret
5

PowerShell v2 +, 76 bajtów

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

Najwyraźniej jest to popularne wyrażenie regularne ... ;-)

Używa -replaceoperatora, aby pobrać odpowiednie elementy, a następnie łączy wyniki razem. Dodaje a $do pierwszego, aby upewnić się, że wyciągamy koniec sznurka, i dodaje ^do drugiego, aby upewnić się, że ściągamy przód sznurka.

AdmBorkBork
źródło
4

Siatkówka , 35 bajtów

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

Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).

Po prostu usuwa wszystkie dopasowania wyrażenia regularnego w pierwszym wierszu.

Martin Ender
źródło
1
Jakieś plany dodania klas samogłosek i innych niż samogłoski? ;-)
ETHproductions
@ETHproductions Jeśli kiedykolwiek będę miał problem z wdrożeniem własnego smaku wyrażenia regularnego (lub przynajmniej go tokenizuje, aby można go było przetransponować do wyrażenia regularnego .NET), na pewno! : P
Martin Ender
Ruby może tworzyć odwołania do wzorca (ten sam wzorzec, który może pasować do innej sekwencji znaków). Przydałyby się tutaj. Na przykład pasujące nawiasy są dopasowane /^((\(\g<1>\))*)$/w Ruby.
John Dvorak
1
@JanDvorak Szkoda, że ​​Retina jest napisana w .NET, co? ;) Zastanawiałem się nad dołączeniem go do github.com/ltrzesniewski/pcre-net , abyś mógł zmieniać smaki, ale jeszcze się do tego nie przyzwyczaiłem , a niektóre inne funkcje w coraz większym stopniu polegają na dopasowaniu specyficznym dla platformy .NET.
Martin Ender
1
Czas porzucić zachowanie specyficzne dla .net i przepisać wszystko w Ruby? Ruby i tak jest lepszy :-)
John Dvorak
4

Guma cynamonowa, 23 bajty

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

Wypróbuj online.

Wyjaśnienie

To dekompresuje do d([aeiou]+[^aeiou]*)([aeiou]+[^aeiou]*)? [^aeiou]*, co dusuwa wszystko pasujące do tego wyrażenia regularnego. (Należy pamiętać, że golfista Jordana d([aeiou]+[^aeiou]*){,2} [^aeiou]*kompresuje do 24 bajtów z powodu braku powtarzających się elementów do skompresowania).

spaghetto
źródło
Byłby d[aeiou]+[^aeiou]*[aeiou]*[^aeiou]* [^aeiou]*krótszy?
ETHproductions
@ETHproductions Próbowałem tego, to była ta sama liczba bajtów :(
spaghetto
3

PHP, 95 bajtów

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

z preg_match zamiast preg_filter 110 bajtów

$t="aeiou]";($p=preg_match)("#(.*?)([$t+[^$t*){1,2}$#",$argv[1],$m);$p("#[$t.*#",$argv[2],$n);echo$m[1].$n[0];
Jörg Hülsermann
źródło
1
Możesz użyć +zamiast {1,2}.
Tytus
@Titus ważniejsze było wyeliminowanie błędu dla 1 przypadku, a teraz mogę spróbować zagrać w golfa
Jörg Hülsermann
Użyj, $v=aeiou;aby zapisać 3 kolejne.
Tytus
@Titus Miałem ten sam pomysł, ale z pewnym wariantem. Dziękuję
Jörg Hülsermann
3

Lua, 66 bajtów

$ cat merge.lua
print(((...):gsub(("[]+[^]*[]*[^]*+[^]*"):gsub("]","aeiou]"),"")))
$ lua merge.lua brad+angelina
brangelina
$ lua merge.lua programming+puzzle
progruzzle
Egor Skriptunoff
źródło
2

Perl 5, 39 bajtów

38, plus 1 za -pezamiast-e

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

Czapka z daszkiem.

msh210
źródło
Taka sama jak odpowiedź sed związana z wewnątrz, ale równie dobrze możemy mieć ją również w Perlu.
msh210,
2

Python 2, 139 bajtów

n=lambda a,b:a[:a.index(([l for l in[[l,"!"][i!=0and a[i-1]in v]for i,l in enumerate(a)]if l in v]*2)[-2])]+b[sorted([(b+v).index(c)for c in v])[0]:]

Ten był trudny.

Sprawdź to na repl.it

Quelklef
źródło
2

Lithp , 65 bajtów

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

Jest to w zasadzie część powyższej odpowiedzi JavaScript w moim funkcjonalnym języku programowania Lisp.

Przykładowe użycie:

(
    % 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"))
)

Nie ma jeszcze tłumacza online. Niedługo dostarczę. To nie będzie trudne, mój język jest napisany w JavaScript.

Zamiast tego to rozwiązanie łamigłówek zostało zaimplementowane jako działający przykład dla mojego języka. Można go uruchomić za pomocą następującego polecenia:

node run.js l_src/progruzzle-colf.lithp
Andrakis
źródło
2

Haskell, 111 108 bajtów

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

To rozwiązanie niebędące wyrażeniem regularnym okazało się dłuższe niż oczekiwano. W każdym razie ideone.

Laikoni
źródło
1

Jq 1,5 , 45 bajtów

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

Nic specjalnego, tylko port perlowego rozwiązania msh210 w PCRE jq.

Wypróbuj online!

jq170727
źródło
1

Japt , 18 bajtów

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

Wypróbuj online!

Bezpośredni port krótkiego rozwiązania JS, który z kolei jest portem Jordańskiego rozwiązania Ruby .

Jak to działa

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.
Bubbler
źródło