Progruzzle & Colf

76

Hast du schon mal Lust gehabt , coole Twitter-Hashtags wie #brexit oder #brangelina zu erstellen ? Dieser Golf ist für Sie.


Schreiben Sie ein Programm, das zwei Strings A & B als Eingabe akzeptiert und diese nach folgendem Algorithmus zusammenführt:

  1. sei ndie Anzahl der Vokalgruppen in A (zB britainhat 2 Vokalgruppen: iin Position 3 und aiin Position 5).
    • wenn n = 1: A ab der ersten Vokalgruppenposition abschneiden (Beispiel: bill=> b)
    • wenn n> 1: A ab der n-1Position der Vokalgruppe abschneiden (Beispiel: programming=> progr, britain=> br)
  2. entferne alle Konsonanten am Anfang von B ( jennifer=> ennifer)
  3. Verketten Sie die modifizierten A & B

Vokale sind aeiou; Konsonanten sind bcdfghjklmnpqrstvwxyz.

Eingang

Sie können davon ausgehen, dass die Eingabezeichenfolgen klein geschrieben sind und mindestens einen Vokal und einen Konsonanten enthalten.

Beispiele

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
quelle
65
Neuer Testfall? donald trump.
Stewie Griffin
5
Dies sind im Wesentlichen Portmanteaus .
mbomb007
3
Related
ETHproductions
1
@ETHproductions dies scheint sehr unterschiedliche Kombinationen Django + Angular = Djular
hervorzubringen
Was ist "n-1. Vokalgruppenposition"
l4m2

Antworten:

24

Ruby, 44 43 40 + 1 = 41 Bytes

+1 Byte für -pFlag. Übernimmt eine durch Leerzeichen getrennte Eingabe für STDIN.
-1 Byte dank Martin Ender
-2 Byte dank Histokrat

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

Probieren Sie es online!

GNU sed, 39 37 + 1 = 38 Bytes

+1 Byte für -EFlag. Übernimmt eine durch Leerzeichen getrennte Eingabe für STDIN.
-1 Byte dank Martin Ender

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

Probieren Sie es online!

Dies nicht als separate Antwort zu posten, da es buchstäblich dieselbe Lösung ist.

Jordan
quelle
Schöner Regex! Stört es mich, wenn ich einen Teil davon in meiner JS-Antwort verwende?
ETHproductions
Sicher, verrückt werden.
Jordanien
3
Sie können die Regex ein bisschen mehr Golf spielen, indem Sie die [^aeiou]als Unterausdruck erfassen :/([aeiou]+([^aeiou]*)){,2} \g<2>/
Histokrat
1
@Anko Siehe "Spezielle Aufrufe" in dieser Antwort . TL; DR: Zähle nur Bytes zusätzlich zum Standardaufruf. Der Standardaufruf für Ruby lautet ruby -e "...". Dafür ist es ruby -pe "...", also fügt es nur ein Byte hinzu.
Jordanien
12

MATL, 31 30 Bytes

t13Y2XJmFwhdl=fql_):)itJmYsg)h

Probieren Sie es online

Erläuterung

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
quelle
1
Ich habe immer happy code
Andras Deak
12

JavaScript (ES6), 81 73 72 Byte

8 Bytes dank @Jordan, 1 dank @DavidConrad gespeichert

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

Obwohl .matchein Array zurückgegeben wird, wird array+arrayeine Zeichenfolge mit dem Inhalt der verketteten Arrays zurückgegeben (dh [0]+[1]zurückgegeben "01").

Testschnipsel

Jordans exzellente Ruby-Lösung wäre 53 Bytes in JS:

x=>x.replace(/([aeiou]+[^aeiou]*){1,2} [^aeiou]*/,"")
ETHproductions
quelle
Vielleicht könnte man das Streichholz einfach wegwerfen und einen Ersatz verwenden?
Conor O'Brien
@ ConorO'Brien Das fühlt sich an wie Jordaniens Antwort zu stehlen: /
ETHproductions
Sie haben meine Gedanken buchstäblich gelesen. Und ja, das stimmt
Conor O'Brien
1
Curry (a,b)=>um a=>b=>1 Byte zu sparen.
David Conrad
7

Jelly , 23 22 Bytes

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

TryItOnline

Wie?

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
quelle
Schön erklärt!
Pureferret
5

PowerShell v2 +, 76 Byte

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

Anscheinend ist dies ein beliebter Regex ... ;-)

Verwendet den -replaceOperator, um die entsprechenden Teile abzuziehen, und verknüpft dann die Ergebnisse miteinander. Fügt ein $zum ersten hinzu, um sicherzustellen, dass wir das Ende der Zeichenfolge ziehen, und fügt ein ^zum zweiten hinzu, um sicherzustellen, dass wir die Vorderseite der Zeichenfolge abziehen.

AdmBorkBork
quelle
4

Retina , 35 Bytes

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

Probieren Sie es online! (Die erste Zeile aktiviert eine durch Zeilenvorschub getrennte Testsuite.)

Entfernt einfach alle Übereinstimmungen des regulären Ausdrucks in der ersten Zeile.

Martin Ender
quelle
1
Gibt es Pläne, Vokal- und Nicht-Vokal-Klassen hinzuzufügen? ;-)
ETHproductions
@ETHproductions Wenn ich jemals die Mühe haben sollte, meine eigene Regex-Variante zu implementieren (oder sie zumindest so zu token, dass sie in .NET-Regex umgesetzt werden kann), dann sicher! : P
Martin Ender
Ruby kann Musterrückreferenzen durchführen (dasselbe Muster, das mit einer anderen Zeichenfolge übereinstimmen kann). Diese wären hier nützlich. Zum Beispiel werden übereinstimmende Klammern /^((\(\g<1>\))*)$/in Ruby mit übereinstimmen .
John Dvorak
1
@ JanDvorak Schade, dass Retina in .NET geschrieben ist, oder? ;) Ich habe darüber nachgedacht, es mit github.com/ltrzesniewski/pcre-net zu bündeln, damit Sie die Geschmacksrichtungen wechseln können, bin aber noch nicht dazu gekommen, und einige andere Funktionen hängen zunehmend vom .NET-spezifischen Übereinstimmungsverhalten ab.
Martin Ender
1
Zeit, das .net-spezifische Verhalten zu löschen und alles in Ruby neu zu schreiben? Ruby ist sowieso besser :-)
John Dvorak
4

Zimtgummi, 23 Bytes

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

Probieren Sie es online aus.

Erläuterung

Dies dekomprimiert nach d([aeiou]+[^aeiou]*)([aeiou]+[^aeiou]*)? [^aeiou]*, wodurch dalles gelöscht wird, was zu diesem regulären Ausdruck passt. (Beachten Sie, dass Jordaniens Golfspieler d([aeiou]+[^aeiou]*){,2} [^aeiou]*aufgrund des Fehlens wiederholter zu komprimierender Elemente auf 24 Byte komprimiert.)

ein Spaghetto
quelle
Wäre d[aeiou]+[^aeiou]*[aeiou]*[^aeiou]* [^aeiou]*noch kürzer?
ETHproductions
@ETHproductions Ich habe das versucht, es war die gleiche Byteanzahl :(
ein Spaghetto
3

PHP, 95 Bytes

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

mit preg_match statt preg_filter 110 Bytes

$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
quelle
1
Sie können +anstelle von verwenden {1,2}.
Titus
@Titus wichtiger war es, den Bug für 1 Fall zu beseitigen und jetzt kann ich versuchen, es nach unten zu spielen
Jörg Hülsermann
Verwenden Sie $v=aeiou;, um weitere 3 zu speichern.
Titus
@Titus Ich hatte die gleiche Idee, aber mit einer kleinen Variante. Vielen Dank
Jörg Hülsermann
3

Lua, 66 Bytes

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

Perl 5, 39 Bytes

38, plus 1 für -pestatt-e

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

Hutspitze.

msh210
quelle
Dasselbe wie die mit inside verknüpfte sed-Antwort, aber wir können es auch in Perl haben.
msh210
2

Python 2, 139 Bytes

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

Dieser war schwer.

Schau es dir auf repl.it an

Quelklef
quelle
2

Lithp , 65 Bytes

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

Dies ist im Grunde eine Portierung der obigen JavaScript-Antwort in meiner funktionalen Programmiersprache "Lisp-ish".

Anwendungsbeispiel:

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

Noch kein Online-Dolmetscher. Ich werde bald eine zur Verfügung stellen. Es wird nicht schwierig sein, meine Sprache ist in JavaScript geschrieben.

Stattdessen wird diese Rätsellösung als Arbeitsbeispiel für meine Sprache implementiert. Es kann mit dem folgenden Befehl ausgeführt werden:

node run.js l_src/progruzzle-colf.lithp
Andrakis
quelle
2

Haskell, 111 108 Bytes

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

Diese Nicht-Regex-Lösung erwies sich als länger als erwartet. Ideone es trotzdem.

Laikoni
quelle
1

Jq 1,5 , 45 Bytes

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

Nichts Besonderes, nur ein Port von msh210 ‚s Perl Lösung jq der PCRE.

Probieren Sie es online!

jq170727
quelle
1

Japt , 18 Bytes

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

Probieren Sie es online!

Direkter Port der kurzen JS-Lösung, die wiederum der Port von Jordans Ruby-Lösung ist .

Wie es funktioniert

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
quelle