Progruzzle & Colf


76

Hai mai pensato di creare fantastici hashtag di Twitter come #brexit o #brangelina ? questo golf è per te.


Scrivi un programma che accetta due stringhe A e B come input e le unisce secondo il seguente algoritmo:

  1. lasciare che nsia il numero di gruppi vocali in A (es britainha 2 vocali gruppi: iin posizione 3 e aiin posizione 5).
    • se n = 1: troncare A a partire dalla prima posizione del gruppo vocale (esempio: bill=> b)
    • se n> 1: tronca A iniziando dalla posizione del suo n-1gruppo vocale (esempio: programming=> progr, britain=> br)
  2. rimuove tutte le consonanti all'inizio di B ( jennifer=> ennifer)
  3. concatenare A e B modificati

Le vocali sono aeiou; le consonanti sono bcdfghjklmnpqrstvwxyz.

Ingresso

Puoi presumere che le stringhe di input siano minuscole e contengano almeno una vocale e una consonante.

Esempi

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
Nuovo caso di test? donald trump.
Stewie Griffin,

5
Questi sono essenzialmente portmanteaus .
mbomb007,


1
@ETHproductions sembra produrre combinazioni molto diverse, comeDjango + Angular = Djular
Pureferret,

Che cos'è "n-
1a

Risposte:


24

Rubino, 44 43 40 + 1 = 41 byte

+1 byte per -pflag. Accetta input separati da spazio su STDIN.
-1 byte grazie a Martin Ender
-2 byte grazie all'istocratico

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

Provalo online!

GNU sed, 39 37 + 1 = 38 byte

+1 byte per -Eflag. Accetta input separati da spazio su STDIN.
-1 byte grazie a Martin Ender

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

Provalo online!

Non pubblicare questo come una risposta separata perché è letteralmente la stessa soluzione.


Bella regex! Ti dispiace se ne uso parte nella mia risposta JS?
ETHproductions,

Certo, impazzisci.
Giordania,

3
Puoi giocare a golf con la regex un po 'di più catturando [^aeiou]come sottoespressione:/([aeiou]+([^aeiou]*)){,2} \g<2>/
histocrat,


1
@Anko Vedi "Invocazioni speciali" in questa risposta . TL; DR: conta solo i byte oltre alla chiamata predefinita. L'invocazione predefinita per Ruby è ruby -e "...". Per questo è ruby -pe "...", quindi aggiunge solo un byte.
Giordania,

12

MATL, 31 30 byte

t13Y2XJmFwhdl=fql_):)itJmYsg)h

Provalo online

Spiegazione

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
Valuto sempre il codice felice
Andras Deak,

12

JavaScript (ES6), 81 73 72 byte

8 byte salvati grazie a @Jordan, 1 grazie a @DavidConrad

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

Anche se .matchrestituisce un array, array+arrayrestituisce una stringa con il contenuto degli array concatenati (ovvero [0]+[1]restituisce "01").

Test snippet

L'eccellente soluzione Ruby della Giordania sarebbe 53 byte in JS:

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

Forse potresti semplicemente buttare via la partita e usare un rimpiazzo?
Conor O'Brien,

@ ConorO'Brien Quel tipo sembra rubare la risposta di Jordan: /
ETHproductions

Mi hai letteralmente letto nella mente. E sì, è vero
Conor O'Brien il

1
Currying (a,b)=>per a=>b=>salvare 1 byte.
David Conrad,

7

Gelatina , 23 22 byte

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

TryItOnline

Come?

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"

Splendidamente spiegato!
Pureferret,

5

PowerShell v2 +, 76 byte

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

Apparentemente questo è un regex popolare ... ;-)

Utilizza l' -replaceoperatore per estrarre i pezzi appropriati, quindi concatena i risultati insieme. Aggiunge a $a al primo per assicurarci di tirare la fine della stringa e aggiunge ^a al secondo per assicurarci di togliere la parte anteriore della stringa.


4

Retina , 35 byte

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

Provalo online!(La prima riga abilita una suite di test separata da avanzamento riga.)

Rimuove semplicemente tutte le partite della regex sulla prima riga.


1
Hai in programma di aggiungere classi vocaliche e non vocaliche? ;-)
ETHproductions,

@ETHproductions Se potessi mai essere disturbato dall'implementare il mio sapore regex (o almeno tokenizzarlo in modo che possa essere trasferito in regex .NET), certo! : P
Martin Ender,

Ruby può fare backreferences di pattern (stesso pattern che può corrispondere a una diversa sequenza di caratteri). Questi sarebbero utili qui. Ad esempio, le parentesi corrispondenti sono abbinate /^((\(\g<1>\))*)$/in Ruby.
John Dvorak,

1
@JanDvorak Peccato che Retina sia scritta in .NET, eh? ;) Ho preso in considerazione l'idea di raggrupparlo con github.com/ltrzesniewski/pcre-net in modo da poter cambiare sapore, ma non ci sono ancora riuscito e alcune altre funzionalità si basano sempre più sul comportamento di corrispondenza specifico di .NET.
Martin Ender,

1
È ora di abbandonare il comportamento specifico .net e riscrivere tutto in Ruby? Ruby è comunque meglio :-)
John Dvorak,

4

Gomma alla cannella, 23 byte

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

Provalo online.

Spiegazione

Questo si decomprime a d([aeiou]+[^aeiou]*)([aeiou]+[^aeiou]*)? [^aeiou]*, che delimina tutto ciò che corrisponde a quella regex. (Si noti che il golfista Jordan si d([aeiou]+[^aeiou]*){,2} [^aeiou]*comprime a 24 byte a causa della mancanza di elementi ripetuti da comprimere.)


Sarebbe d[aeiou]+[^aeiou]*[aeiou]*[^aeiou]* [^aeiou]*più breve?
ETHproductions,

@ETHproductions L'ho provato, era lo stesso conteggio dei byte :(
uno spaghetto il

3

PHP, 95 byte

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

con preg_match anziché preg_filter 110 byte

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

1
Puoi usare +invece di {1,2}.
Tito,

@Titus era più importante eliminare il bug per 1 caso e ora posso provare a
giocarci

Utilizzare $v=aeiou;per salvarne altri 3.
Tito,

@Titus Ho avuto la stessa idea ma con una piccola variante. Grazie
Jörg Hülsermann,

3

Lua, 66 byte

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

2

Perl 5, 39 byte

38, più 1 per -peanziché-e

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

Punta del cappello.


Come la risposta sed collegata all'interno, ma potremmo anche averla in Perl.
msh210,

2

Python 2, 139 byte

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]:]

Questo è stato difficile.

Dai un'occhiata su repl.it


2

Lithp , 65 byte

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

Questa è sostanzialmente una porta della risposta JavaScript sopra, nel mio linguaggio di programmazione funzionale Lisp-ish.

Esempio di utilizzo:

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

Nessun interprete online ancora. Ne fornirò uno presto. Non sarà difficile, la mia lingua è scritta in JavaScript.

Invece, questa soluzione puzzle è implementata come esempio funzionante per la mia lingua. Può essere eseguito con il seguente comando:

node run.js l_src/progruzzle-colf.lithp

2

Haskell, 111 108 byte

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

Questa soluzione non regex si è rivelata più lunga del previsto. Ideone lo stesso.



1

Japt , 18 byte

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

Provalo online!

Porta diretta della soluzione JS corta che è a sua volta il porto della soluzione Ruby della Giordania .

Come funziona

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.