Progruzzle ve Colf


76

#Brexit veya #brangelina gibi harika twitter hashtag'leri yaratmayı hiç hayal ettin mi? bu golf tam size göre.


İki A & B dizesini giriş olarak kabul eden ve bunları aşağıdaki algoritmaya göre birleştiren bir program yazın:

  1. nA'daki ünlü grupların sayısı olsun (ör. britain2 ünlü grup var: i3 ve ai5).
    • Eğer n = 1 ise: A ilk kısma grubu konumundan başlayarak A'yı keser (örnek: bill=> b)
    • eğer n> 1: A n-1kesesini sesli harf grubu pozisyonundan başlayarak (örneğin: programming=> progr, britain=> br)
  2. B'nin başındaki tüm ünsüzleri kaldırın ( jennifer=> ennifer)
  3. değiştirilen A & B'yi birleştirmek

Ünlüler aeiou; ünsüzler vardır bcdfghjklmnpqrstvwxyz.

Giriş

Giriş dizelerinin küçük harf olduğunu ve en az bir ünlü ve bir ünsüz içerdiğini varsayabilirsiniz.

Örnekler

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
Yeni test davası? donald trump.
Stewie Griffin

5
Bunlar esasen portmanteaustur .
mbomb007


1
@ETHproductions, bunun gibi çok farklı kombinasyonlar ürettiği görülüyorDjango + Angular = Djular
Pureferret

"N-
1'inci

Yanıtlar:


24

Ruby, 44 43 40 + 1 = 41 bayt

-pBayrak için +1 bayt . STDIN'de boşlukla ayrılmış girdi alır.
Martin Ender-1 bayt teşekkürler
Histocrat-2 bayt sayesinde

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

Çevrimiçi deneyin!

GNU sed, 39 37 + 1 = 38 bayt

-EBayrak için +1 bayt . STDIN'de boşlukla ayrılmış girdi alır.
Martin Ender sayesinde -1 bayt

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

Çevrimiçi deneyin!

Bunu ayrı bir cevap olarak göndermemek, çünkü tam anlamıyla aynı çözüm.


Güzel regex! JS yanıtımda bunun bir kısmını kullanırsam sorun olur mu?
ETHProductions

Tabii, çıldır.
Ürdün

3
[^aeiou]/([aeiou]+([^aeiou]*)){,2} \g<2>/
Alt ifadeyi


1
@Anko Bu cevapta "Özel çağrılar" bölümüne bakınız . TL; DR: Varsayılan başlatmaya ek olarak yalnızca baytları sayar. Ruby için varsayılan başlatma ruby -e "...". Bunun için ruby -pe "...", sadece bir bayt ekler.
Ürdün

12

MATL, 31 30 bayt

t13Y2XJmFwhdl=fql_):)itJmYsg)h

Çevrimiçi Deneyin

açıklama

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
Hep mutlu kodu upvote
Andras Deak

12

JavaScript (ES6), 81 73 72 bayt

@Jordan, 1DavidConrad sayesinde 1 bayt kaydedildi

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

.matchBir dizi döndürse bile , array+arraybirleştirilmiş dizilerin içeriğini içeren bir dize [0]+[1]döndürür (yani döndürür "01").

Test snippet'i

Jordan'ın mükemmel Ruby çözümü JS'de 53 byte olacaktır:

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

Belki sadece maç bit fırlatmak ve yerine kullanabilirsiniz?
Conor O'Brien,

@ ConorO'Brien Bu Jordan'ın cevabını çalmak gibi hissettiriyor: /
ETHproductions

Kelimenin tam anlamıyla aklımı okudun. Ve evet, bu doğru
Conor O'Brien

1
Currying (a,b)=>için a=>b=>1 bayt kaydeder.
David Conrad

7

Jöle , 23 22 bayt

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

TryItOnline

Nasıl?

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"

Güzelce açıkladı!
Pureferret 27:16

5

PowerShell v2 +, 76 bayt

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

Görünüşe göre bu popüler bir regex ... ;-)

-replaceUygun parçaları çıkarmak için operatörü kullanır , ardından sonuçları bir araya getirir. İpin $sonunu aldığımızdan emin olmak için birinciye a ^, dize önünü çıkardığımızdan emin olmak için birinciye a ekler .


4

Retina , 35 bayt

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

Çevrimiçi deneyin! (İlk satır, satır besleme ayrılmış bir test takımı sağlar.)

Basitçe tüm satırdaki regex eşleşmelerini ilk satırda kaldırır.


1
Ünlü ve ünlü olmayan sınıfları ekleme planları var mı? ;-)
ETHproductions

@ETHporoductions Kendi regex lezzetimi uygulamak için hiç rahatsız olursam (veya en azından .NET regex'e dönüştürülebilmesi için tokenise alırsam), elbette! : P
Martin Ender

Ruby, desen geri dönüşleri yapabilir (farklı bir karakter dizisiyle eşleşebilen aynı desen). Bunlar burada faydalı olacaktır. Örneğin, eşleşen parantezler /^((\(\g<1>\))*)$/Ruby'de eşleştirilir .
John Dvorak

1
@JanDvorak Çok kötü Retina. NET'te yazılmıştır ha? ;) Tatları değiştirebilmeniz için github.com/ltrzesniewski/pcre-net ile paketlemeyi düşündüm , ancak bu durumla başa çıkamadım ve diğer bazı özellikler artan oranda .NET'e özgü eşleme davranışına dayanıyor.
Martin Ender

1
Net özel davranış bırakma ve Ruby'deki her şeyi yeniden yazma zamanı geldi mi? Ruby zaten daha iyi :-)
John Dvorak

4

Tarçınlı Sakız, 23 bayt

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

Çevrimiçi deneyin.

açıklama

Bu d([aeiou]+[^aeiou]*)([aeiou]+[^aeiou]*)? [^aeiou]*, do regex ile eşleşen herhangi bir şeyi silen dekompresyon yapar . (Jordan'ın golfçüsünün, d([aeiou]+[^aeiou]*){,2} [^aeiou]*sıkıştırılacak tekrarlanan elemanların eksikliğinden dolayı 24 bayta sıkıştırıldığını unutmayın.)


Daha d[aeiou]+[^aeiou]*[aeiou]*[^aeiou]* [^aeiou]*kısa olur mu?
ETHProductions

@ETHproductions Denedim, aynı bayt sayısıydı :(
bir

3

PHP, 95 Bayt

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

preg_filter yerine preg_match ile 110 Bayt

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

1
Sen kullanabilirsiniz +yerine {1,2}.
Titus

@Titus daha önemli bir hatayı ortadan kaldırmaktı ve şimdi golf
oynamak

$v=aeiou;3 tane daha tasarruf etmek için kullanın .
Titus

@Titus Aynı fikir vardı ama biraz değişken var. Teşekkür ederim
Jörg Hülsermann

3

Lua, 66 bayt

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

2

Perl 5, 39 bayt

38, artı 1 -peyerine-e

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

Şapka ucu.


İçiyle bağlantılı sed cevabı ile aynı, ancak Perl'de de olabilir.
msh210

2

Python 2, 139 bayt

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

Bu zordu.

Repl.it üzerinde kontrol edin


2

Lithp , 65 bayt

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

Bu, temelde Lisp-ish fonksiyonel programlama dilimde yukarıdaki JavaScript cevabının bir limanıdır.

Örnek kullanım:

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

Henüz çevrimiçi tercüman yok. Yakında bir tane vereceğim. Zor olmayacak, dilim JavaScript ile yazılmıştır.

Bunun yerine, bu bulmaca çözümü dilim için çalışan bir örnek olarak uygulanmaktadır. Aşağıdaki komutla çalıştırılabilir:

node run.js l_src/progruzzle-colf.lithp

2

Haskell, 111 108 bayt

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

Bu regex olmayan çözüm beklenenden daha uzun sürdü. Yine de deone.



1

Japt , 18 bayt

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

Çevrimiçi deneyin!

Doğrudan liman kısa JS çözeltisi sırayla limanı olan Jordan'ın Yakut çözümü .

Nasıl çalışır

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.