Progruzzle & Colf


76

Pernah membayangkan membuat hashtag keren seperti #brexit atau #brangelina ? golf ini untukmu.


Tulis program yang menerima dua string A & B sebagai input dan gabungkan mereka sesuai dengan algoritma berikut:

  1. biarkan nmenjadi jumlah grup vokal di A (misalnya britainmemiliki 2 grup vokal: idi posisi 3 dan aidi posisi 5).
    • jika n = 1: memotong A mulai dari posisi grup vokal pertamanya (contoh: bill=> b)
    • jika n> 1: memotong A mulai dari n-1posisi grup vokal ke -3 (contoh: programming=> progr, britain=> br)
  2. hapus semua konsonan di awal B ( jennifer=> ennifer)
  3. menggabungkan A & B yang dimodifikasi

Vokal adalah aeiou; konsonan adalah bcdfghjklmnpqrstvwxyz.

Memasukkan

Anda dapat mengasumsikan string input lebih kecil dan mengandung setidaknya satu vokal dan satu konsonan.

Contohnya

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
Kasing uji baru? donald trump.
Stewie Griffin

5
Ini pada dasarnya adalah portmanteaus .
mbomb007


1
@ ETHproduksi ini tampaknya menghasilkan kombinasi yang jauh berbeda, sepertiDjango + Angular = Djular
Pureferret

Apa itu "posisi grup vokal ke-1"
14m2

Jawaban:


24

Ruby, 44 43 40 + 1 = 41 byte

+1 byte untuk -pbendera. Mengambil input yang dipisahkan ruang pada STDIN.
-1 byte terima kasih kepada Martin Ender
-2 byte terima kasih kepada histocrat

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

Cobalah online!

GNU sed, 39 37 + 1 = 38 byte

+1 byte untuk -Ebendera. Mengambil input yang dipisahkan ruang pada STDIN.
-1 byte terima kasih kepada Martin Ender

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

Cobalah online!

Tidak memposting ini sebagai jawaban terpisah karena secara harfiah solusi yang sama.


Regex bagus! Keberatan jika saya menggunakan sebagian dari itu dalam jawaban JS saya?
ETHproduk

Tentu, jadi gila.
Jordan

3
Anda bisa bermain golf regex sedikit lebih dengan menangkap [^aeiou]sebagai subekspresi:/([aeiou]+([^aeiou]*)){,2} \g<2>/
histokrat


1
@Anko Lihat "Doa khusus" dalam jawaban ini . TL; DR: Hanya hitung byte di samping permintaan default. Doa standar untuk Ruby adalah ruby -e "...". Untuk ini ruby -pe "...", jadi hanya menambah satu byte.
Jordan

12

MATL, 31 30 byte

t13Y2XJmFwhdl=fql_):)itJmYsg)h

Cobalah secara Online

Penjelasan

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
Saya selalu mendukung kode senang
Andras Deak

12

JavaScript (ES6), 81 73 72 byte

Disimpan 8 byte berkat @Jordan, 1 terima kasih ke @DavidConrad

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

Meskipun .matchmengembalikan array,array+array mengembalikan string dengan isi array yang disatukan (yaitu [0]+[1]mengembalikan "01").

Cuplikan tes

Solusi Ruby unggulan Jordan adalah 53 byte di JS:

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

Mungkin bisa membuang sedikit pertandingan dan menggunakan pengganti?
Conor O'Brien

@ ConorO'Brien Itu agak terasa seperti mencuri jawaban Jordan: /
ETHproduksi

Anda benar-benar membaca pikiran saya. Dan ya, itu benar
Conor O'Brien

1
Currying (a,b)=>untuk a=>b=>menyimpan 1 byte.
David Conrad

7

Jelly , 23 22 byte

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

TryItOnline

Bagaimana?

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"

Dijelaskan dengan indah!
Pureferret

5

PowerShell v2 +, 76 byte

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

Rupanya ini adalah regex yang populer ... ;-)

Menggunakan -replaceoperator untuk menarik bagian-bagian yang sesuai, lalu merangkai-bersama hasilnya. Menambahkan a $ke yang pertama untuk memastikan kami menarik ujung tali, dan menambahkan a ^ke yang kedua untuk memastikan kami menarik bagian depan tali.


4

Retina , 35 byte

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

Cobalah online! (Baris pertama memungkinkan suite tes yang dipisahkan dengan linefeed.)

Cukup hapus semua kecocokan regex di baris pertama.


1
Adakah rencana untuk menambahkan kelas vokal dan non-vokal? ;-)
ETHproduk

@ ETHproductions Jika saya pernah bisa repot untuk menerapkan rasa regex saya sendiri (atau setidaknya tokenise sehingga dapat dialihkan ke .NET regex), tentu saja! : P
Martin Ender

Ruby dapat melakukan referensi pola (pola yang sama yang dapat cocok dengan urutan karakter yang berbeda). Ini akan berguna di sini. Misalnya, tanda kurung yang cocok cocok dengan /^((\(\g<1>\))*)$/di Ruby.
John Dvorak

1
@ JanDvorak Sayang sekali Retina ditulis dalam .NET, ya? ;) Saya memang mempertimbangkan untuk menggabungkannya dengan github.com/ltrzesniewski/pcre-net sehingga Anda dapat beralih rasa, tetapi belum sempat melakukannya, dan beberapa fitur lainnya semakin mengandalkan perilaku pencocokan khusus-NET.
Martin Ender

1
Saatnya menjatuhkan perilaku .net khusus dan menulis ulang semuanya di Ruby? Bagaimanapun, Ruby lebih baik :-)
John Dvorak

4

Cinnamon Gum, 23 byte

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

Cobalah online.

Penjelasan

Ini didekompresi ke d([aeiou]+[^aeiou]*)([aeiou]+[^aeiou]*)? [^aeiou]*, yang dmenghapus apa pun yang cocok dengan regex itu. (Perhatikan bahwa pegolf Jordan d([aeiou]+[^aeiou]*){,2} [^aeiou]*mengompres hingga 24 byte karena kurangnya elemen berulang untuk kompres.)


Apakah d[aeiou]+[^aeiou]*[aeiou]*[^aeiou]* [^aeiou]*akan lebih pendek?
ETHproduksi

@ ETHproductions Saya mencobanya, itu adalah jumlah byte yang sama :(
spaghetto

3

PHP, 95 Bytes

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

dengan preg_match alih-alih 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];

1
Anda bisa menggunakan +bukan {1,2}.
Titus

@Titus lebih penting adalah untuk menghilangkan bug untuk 1 kasus dan sekarang saya dapat mencoba untuk menurunkannya
Jörg Hülsermann

Gunakan $v=aeiou;untuk menyimpan 3 lagi.
Titus

@Itus saya punya ide yang sama tetapi dengan sedikit varian. Terima Kasih
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, ditambah 1 sebagai -peganti-e

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

Ujung topi.


Sama seperti jawaban sed yang ditautkan ke dalam, tetapi kita mungkin juga memilikinya di 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]:]

Yang ini sulit.

Lihat di repl.it


2

Lithp , 65 byte

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

Ini pada dasarnya adalah port dari jawaban JavaScript di atas, dalam bahasa pemrograman fungsional Lisp-ish saya.

Contoh penggunaan:

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

Belum ada juru bahasa online. Saya akan memberikan satu segera. Tidak akan sulit, bahasa saya ditulis dalam JavaScript.

Alih-alih, solusi teka-teki ini diterapkan sebagai contoh kerja untuk bahasa saya. Itu dapat dijalankan dengan perintah berikut:

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

Solusi non-regex ini ternyata lebih lama dari yang diharapkan. Tetap ide saja.



1

Japt , 18 byte

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

Cobalah online!

Port langsung dari solusi JS pendek yang pada gilirannya adalah port dari solusi Ruby Jordan .

Bagaimana itu bekerja

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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.