Progruzzle & Colf


76

เคยลองสร้างแฮชแท็ก Twitter ที่ยอดเยี่ยมเช่น#brexitหรือ#brangelinaหรือไม่ กอล์ฟนี้เหมาะสำหรับคุณ


เขียนโปรแกรมที่ยอมรับสองสตริง A & B เป็นอินพุทและผสานมันตามอัลกอริทึมต่อไปนี้:

  1. อนุญาตnเป็นจำนวนกลุ่มเสียงสระใน A (เช่นbritainมีกลุ่มเสียงสระ 2 กลุ่ม: iในตำแหน่งที่ 3 และaiในตำแหน่งที่ 5)
    • ถ้า n = 1: ตัดปลาย A เริ่มต้นที่ตำแหน่งกลุ่มเสียงสระแรก (ตัวอย่าง: bill=> b)
    • ถ้า n> 1: truncate A เริ่มต้นที่n-1ตำแหน่งกลุ่มเสียงสระ th (ตัวอย่าง: programming=> progr, britain=> br)
  2. ลบพยัญชนะทั้งหมดที่จุดเริ่มต้นของ B ( jennifer=> ennifer)
  3. เชื่อมต่อ A&B ที่แก้ไข

สระคือaeiou; bcdfghjklmnpqrstvwxyzพยัญชนะ

อินพุต

คุณสามารถสมมติว่าสตริงอินพุตเป็นตัวพิมพ์เล็กและมีเสียงสระอย่างน้อยหนึ่งเสียงและหนึ่งตัวอักษร

ตัวอย่าง

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
กรณีทดสอบใหม่ donald trump.
Stewie Griffin

5
เหล่านี้เป็นหลักportmanteaus
mbomb007


1
@ETHproductions ดูเหมือนว่าจะให้ชุดค่าผสมที่แตกต่างกันมากเช่นDjango + Angular = Djular
Pureferret

"ตำแหน่งกลุ่มเสียงสระ n-1th" คืออะไร
l4m2

คำตอบ:


24

Ruby, 44 43 40 + 1 = 41 ไบต์

+1 ไบต์สำหรับการ-pตั้งค่าสถานะ ใช้อินพุตที่คั่นด้วยช่องว่างบน STDIN
-1 ไบต์ขอบคุณ Martin Ender
-2 ไบต์ขอบคุณ histocrat

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

ลองออนไลน์!

รุ่น GNU, 39 37 + 1 = 38 ไบต์

+1 ไบต์สำหรับการ-Eตั้งค่าสถานะ ใช้อินพุตที่คั่นด้วยช่องว่างบน STDIN
-1 ไบต์ขอบคุณ Martin Ender

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

ลองออนไลน์!

ไม่โพสต์คำตอบนี้เป็นคำตอบแยกต่างหากเพราะเป็นคำตอบเดียวกัน


Nice regex! ถ้าฉันใช้บางส่วนในคำตอบ JS ของฉัน
ETHproductions

แน่นอนว่ามันบ้าไปแล้ว
Jordan

3
คุณสามารถเล่นกอล์ฟ regex ได้มากขึ้นโดยการจับภาพใน[^aeiou]ฐานะ subexpression:/([aeiou]+([^aeiou]*)){,2} \g<2>/
ประวัติศาสตร์


1
@Anko ดู "คำร้องขอพิเศษ" ในคำตอบนี้ TL; DR: นับจำนวนไบต์เท่านั้นนอกเหนือจากการเรียกใช้เริ่มต้น ruby -e "..."ภาวนาเริ่มต้นสำหรับทับทิม สำหรับอันนี้มันruby -pe "..."เพิ่มแค่หนึ่งไบต์เท่านั้น
Jordan

12

MATL, 31 30 ไบต์

t13Y2XJmFwhdl=fql_):)itJmYsg)h

ลองออนไลน์

คำอธิบาย

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
ฉันมักจะโค่นรหัสความสุขเสมอ
Andras Deak

12

JavaScript (ES6), 81 73 72 ไบต์

บันทึกแล้ว 8 ไบต์ขอบคุณ @Jordan, 1 ขอบคุณ @DavidConrad

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

แม้ว่าจะ.matchส่งคืนอาร์เรย์ แต่array+arrayส่งกลับสตริงที่มีเนื้อหาของอาร์เรย์ที่ต่อกัน (เช่น[0]+[1]ส่งคืน"01")

ตัวอย่างการทดสอบ

โซลูชันทับทิมที่ยอดเยี่ยมของจอร์แดนจะอยู่ที่ 53 ไบต์ใน JS:

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

อาจจะเพิ่งโยนบิตการแข่งขันและใช้แทนที่?
Conor O'Brien

@ ConorO'Brien นั่นรู้สึกเหมือนขโมยคำตอบของจอร์แดน: /
ETHproductions

คุณอ่านใจฉันอย่างแท้จริง และใช่มันเป็นเรื่องจริง
Conor O'Brien

1
Curry (a,b)=>to a=>b=>save 1 byte
David Conrad

7

เยลลี่ , 23 22 ไบต์

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

TryItOnline

อย่างไร?

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"

อธิบายอย่างสวยงาม!
Pureferret

5

PowerShell v2 +, 76 ไบต์

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

เห็นได้ชัดว่านี่คือ regex ยอดนิยม ... ;-)

ใช้-replaceโอเปอเรเตอร์เพื่อดึงชิ้นส่วนที่เหมาะสมออกจากนั้นเชื่อมต่อสตริงเข้าด้วยกัน เพิ่ม a $เข้ากับแรกเพื่อให้แน่ใจว่าเราดึงจุดสิ้นสุดของสตริงและเพิ่ม^ไปที่สองเพื่อให้แน่ใจว่าเราดึงออกจากด้านหน้าของสตริง


4

เรติน่า 35 ไบต์

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

ลองออนไลน์! (บรรทัดแรกเปิดใช้งานชุดทดสอบที่แยกบรรทัดด้วยฟีด)

เพียงลบการแข่งขันทั้งหมดของ regex ในบรรทัดแรก


1
มีแผนการใดที่จะเพิ่มคลาสเสียงสระและเสียงสระ ;-)
ETHproductions

@ ETHproductions ถ้าฉันเคยใส่ใจที่จะใช้รสชาติ regex ของฉันเอง (หรืออย่างน้อยก็ tokenise มันเพื่อให้มันสามารถ transpiled เพื่อ. NET regex) แน่นอน! : P
Martin Ender

Ruby สามารถทำ backreferences ของรูปแบบ (รูปแบบเดียวกันกับที่สามารถจับคู่กับลำดับของอักขระต่าง ๆ ) สิ่งเหล่านี้จะมีประโยชน์ที่นี่ ตัวอย่างเช่นวงเล็บที่ตรงกันจะถูกจับคู่ด้วย/^((\(\g<1>\))*)$/ใน Ruby
John Dvorak

1
@JanDvorak จอประสาทตาแย่มาก ๆ เขียนด้วย. NET เหรอ? ;) ฉันได้พิจารณาการรวมเข้ากับgithub.com/ltrzesniewski/pcre-netเพื่อให้คุณสามารถเปลี่ยนรสชาติได้ แต่ยังไม่ได้รับสิ่งนั้นและคุณลักษณะอื่น ๆ บางอย่างนั้นขึ้นอยู่กับพฤติกรรมการจับคู่เฉพาะของ. NET
Martin Ender

1
ได้เวลาทิ้งพฤติกรรมที่เฉพาะเจาะจง. net และเขียนทุกอย่างใน Ruby อีกครั้ง Ruby ดีกว่า anyways :-)
John Dvorak

4

หมากฝรั่งอบเชย, 23 ไบต์

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

ลองออนไลน์

คำอธิบาย

สิ่งนี้จะขยายตัวd([aeiou]+[^aeiou]*)([aeiou]+[^aeiou]*)? [^aeiou]*ซึ่งจะdลบสิ่งที่ตรงกับ regex (โปรดทราบว่านักกอล์ฟของจอร์แดนd([aeiou]+[^aeiou]*){,2} [^aeiou]*บีบอัดได้ถึง 24 ไบต์เนื่องจากขาดองค์ประกอบที่ต้องบีบอัดซ้ำ)


จะd[aeiou]+[^aeiou]*[aeiou]*[^aeiou]* [^aeiou]*สั้นกว่านี้ไหม?
ETHproductions

@ ETHproductions ฉันลองมันเป็นจำนวนไบต์เดียวกัน :(
ปาเก็ตตี้

3

PHP, 95 ไบต์

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

กับ preg_match แทน 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
คุณสามารถใช้แทน+ {1,2}
ติตัส

@Titus สำคัญมากขึ้นคือการกำจัดข้อผิดพลาด 1 กรณีและตอนนี้ฉันสามารถลองกอล์ฟมันลง
JörgHülsermann

ใช้$v=aeiou;เพื่อประหยัดอีก 3
ติตัส

@Titus ฉันมีความคิดเดียวกัน แต่มีความแตกต่างเล็กน้อย ขอบคุณ
JörgHülsermann

3

Lua, 66 ไบต์

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

2

Perl 5, 39 ไบต์

38, บวก 1 -peแทน-e

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

ปลายหมวก


เช่นเดียวกับคำตอบที่ไม่ดีที่เชื่อมโยงกับภายใน แต่เราก็อาจมีมันในภาษา Perl เช่นกัน
msh210


2

Lithp , 65 ไบต์

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

นี่เป็นพอร์ตของคำตอบ JavaScript ข้างต้นในภาษาการเขียนโปรแกรม Lisp-ish ของฉัน

ตัวอย่างการใช้งาน:

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

ยังไม่มีล่ามออนไลน์ ฉันจะให้เร็ว ๆ นี้ ไม่ยากภาษาของฉันเขียนด้วย JavaScript

แต่วิธีการแก้ปัญหาปริศนานี้ถูกนำมาใช้เป็นตัวอย่างการทำงานสำหรับภาษาของฉัน มันสามารถทำงานได้ด้วยคำสั่งต่อไปนี้:

node run.js l_src/progruzzle-colf.lithp

2

Haskell, 111 108 ไบต์

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

โซลูชันที่ไม่ใช่ regex นี้เปิดใช้งานนานกว่าที่คาดไว้ ยังไงก็เถอะ



1

Japt , 18 ไบต์

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

ลองออนไลน์!

พอร์ตโดยตรงของการแก้ปัญหา JS สั้นซึ่งเป็นในการเปิดพอร์ตของการแก้ปัญหาทับทิมจอร์แดน

มันทำงานอย่างไร

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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.