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.