ย้อนกลับพยัญชนะ


42

โปรแกรมควรใช้สายอักขระเป็นอินพุตและสลับพยัญชนะในขณะที่ยังคงคำสั่งของสระ ตัวอักษรทั้งหมดจะเป็นตัวพิมพ์เล็กดังนั้นคุณไม่ต้องกังวลเกี่ยวกับตัวกล่อง ตัวอย่างดังต่อไปนี้

  1. อินพุต: a test case. พยัญชนะที่นี่
    t,s,t,c,sพวกเขาควรจะมาในลำดับที่ตรงกันข้ามคือสอดกลับเข้าไปในสตริงไปอยู่ในตำแหน่งเดียวกับที่ตัวละครก่อนกลับรายการตั้งอยู่:s,c,t,s,ta sect sate

  2. อินพุต: well-done. ผลลัพธ์: nedl-lowe.

  3. อินพุต: reverse the consonants. ผลลัพธ์: setenne sne cohtosarvr.

นี่คือรหัสกอล์ฟทางออกที่สั้นที่สุดชนะ

Y ควรพิจารณาเสียงสระโดยไม่คำนึงว่ามันคืออะไรและไม่กลับด้าน

สิ่งใดรวมถึงตัวเลขเครื่องหมายวรรคตอนเครื่องหมายคำพูดและสัญลักษณ์อื่น ๆ ( @#$%^&*(){}[]\|/<>~-_+=`) อาจปรากฏในอินพุตได้

คำตอบ:


16

จอประสาทตา 22 21 20 17

O#^`[b-z-[eiouy]]

ลองออนไลน์!

1 ไบต์ต้องขอบคุณ Leaky Nun!

4 ไบต์ขอบคุณมาร์ติน!

Oหมายถึงการเรียงลำดับและ#หมายถึงการเรียงลำดับตามค่าตัวเลข เนื่องจากไม่มีอักขระที่ตรงกันจะไม่มีค่าตัวเลขตัวอักษรทั้งหมดมีน้ำหนักเท่ากัน: 0 ^หมายถึงการเรียงลำดับของค่าที่เรียงกลับซึ่งขอบคุณการเรียงแบบคงที่หมายถึงค่าจะถูกย้อนกลับ

-[...]หมายถึงการทำแตกต่าง setwise ระหว่างตัวละครคลาสด้านนอกและด้านในระดับนี้ นี้เป็นส่วนหนึ่งของ NET และคุณสามารถอ่านเพิ่มเติมได้ที่MSDN


ดีมาก. เป็น-[...]ที่เฉพาะเจาะจงกับจอประสาทตาหรือที่เฉพาะเจาะจงเพื่อ .net regexes หรือมันคือคุณลักษณะ regex ทั่วไปที่ผมเคยมองข้ามจนตอนนี้หรือไม่
บาดเจ็บทางดิจิทัล

@DigitalTrauma ด้วยไวยากรณ์นี้ฉันคิดว่ามันเฉพาะกับ. NET รสชาติอื่น ๆ มีลักษณะแยกระดับเช่นกัน [...&&[^...]]แต่แล้วฉันคิดว่าไวยากรณ์เป็นปกติ
Martin Ender

@MartinEnder ฉันจะต้องลองสิ่งเหล่านี้ด้วย sed และ grep ไม่น่าเป็นไปได้ที่จะมีมัน แต่บางที grep โหมด PCRE
บาดเจ็บทางดิจิทัล

1
Perl 6 ใช้<[b..z] - [eiouy]>หรือ<:Ll - [aeiouy]>ตั้งความแตกต่าง
แบรดกิลเบิร์ต b2gills

15

Python 2, 86 ไบต์

s='';c=()
for x in input():b='{'>x not in'aeiouy'<x;s+=b*'%s'or x;c=(x,)*b+c
print s%c

รับอินพุตเป็นสตริงในเครื่องหมายคำพูด iterates ผ่านการป้อนข้อมูลแทนที่แต่ละสอดคล้องกับใน%s stuple cเก็บพยัญชนะที่พบในลำดับที่กลับด้าน จากนั้นสตริงแทนที่การจัดรูปแบบ%s's ในกับพยัญชนะในsc

ขอบคุณ Sp3000 สำหรับการตรวจสอบคำพยัญชนะซึ่งบันทึก 4 ไบต์ทับรายการพยัญชนะ


1
นี้เป็นบิตที่สวยงามของสนามกอล์ฟรหัส :)
ลินน์

สง่างามและสั้นอย่างน่าประหลาดใจนี่เป็น Python
DevilApple227

9

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

Øaḟ“<1Ṛż»
e€¢œpżf¢Ṛ$

ลองออนไลน์!

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

Øaḟ“<1Ṛż»   Helper link. No arguments.

Øa          Yield the lowercase alphabet/
   “<1Ṛż»   Decompress that string, yielding "oui aye".
  ḟ         Filter; remove the characters from the right string from the left one.


e€¢œpżf¢Ṛ$  Main link. Argument: s (string)

  ¢         Call the helper link, yielding the string of all consonants.
e€          Test each character of s for membership.
   œp       Partition s at members/consonants.
         $  Combine the three links to the left into a monadic chain.
      f¢    Filter by presence in the consonant string.
        Ṛ   Reverse the result.
     ż      Zipwith; interleave chunks of non-consonants and reversed consonants.

6

JavaScript ES6, 82 81 80 78 ไบต์

บันทึกเป็นไบต์ด้วย Martin และ Leaky Nun แต่ละคนและ 2 ไบต์ถึง Neil!

a=>a.replace(r=/(?[_aeiouy])\w/g,e=>[...a].reverse().join``.match(r)[i++],i=0)

การทดสอบ

f=
a=>a.replace(r=/(?![aeiouy])[a-z]/g,e=>[...a].reverse().join``.match(r)[i++],i=0)
;
q.onchange=q.onkeydown=q.onkeyup=function(){
  o.innerHTML = "";
  o.appendChild(document.createTextNode(f(q.value)));
}
*{font-family:Consolas,monospace;}
<input autocomplete="off" id=q>
<div id=o></div>


1
นั่นเป็นการใช้ฟังก์ชันอาร์กิวเมนต์ที่แย่กว่า
Leun Nun

/(?![aeiouy])[a-z]/g
Leun Nun

จะ/(?[_aeiouy])\w/gทำงานอย่างไร
Neil

@Neil ไม่ว่าจะตรงกับ_ซึ่งเป็นสัญลักษณ์ที่ OP ต้องการเก็บไว้
Conor O'Brien

1
ในการสาธิตของคุณคุณสามารถเปลี่ยนq.onchange=q.onkeydown=q.onkeyup=เป็นq.oninput=...
Patrick Roberts

5

Python 2, 106 ไบต์

s=input()
b=[x for x in s if x in'bcdfghjklmnpqrstvwxz']*2
print''.join(x in b and b.pop()or x for x in s)

คาดว่าจะมีการป้อนข้อมูลเข้า"quotes"ซึ่งฉันคิดว่าได้รับอนุญาต


4

Pyke, 18 ไบต์

FD~c{IK_#~c{)oR@(s

ลองที่นี่!

หรือ 16 ไบต์ด้วยรุ่นใหม่:

(เปลี่ยนดังนั้นหากสำหรับคืนสตริงเอาต์พุตทั้งหมดและมีอินพุตสตริงให้ส่งคืนสตริงแทนรายการ)

FD~c{IK_#~c{)oR@

ลองที่นี่!

~c มีพยัญชนะ: bcdfghjklmnpqrstvwxz

F                - For i in input:
  ~c{I           -  if i in "bcdfghjklmnpqrstvwxz":
       _#~c{)    -    filter(reversed(input), <-- in "bcdfghjklmnpqrstvwxz")
             oR@ -   ^[o++]

4

รุ่น GNU, 73

คะแนนรวม +1 สำหรับ-rธงที่ผ่านไปยังไม่ดี

:
s/([b-df-hj-np-tv-xz])(.*)([b-df-hj-np-tv-xz])/\u\3\2\u\1/
t
s/./\l&/g

Ideone

สลับเสียงพยัญชนะตัวแรกและตัวพิมพ์เล็กสุดท้ายซ้ำแล้วแปลงเป็นตัวพิมพ์ใหญ่จนกระทั่งไม่มีการจับคู่อีกต่อไป จากนั้นแปลงสตริงทั้งหมดกลับเป็นตัวพิมพ์เล็ก


4

J, 53 ไบต์

C.~[:~.<@~.@/:~"1@(,.|.)@I.@e.&'bcdfghjklmnpqrstvwxz'

อาจไม่ใช่วิธีที่ดีที่สุด แต่ฉันต้องการใช้C.เนื่องจากสามารถแก้ไขได้ด้วยวิธีเรียงสับเปลี่ยน

การใช้

   f =: C.~[:~.<@~.@/:~"1@(,.|.)@I.@e.&'bcdfghjklmnpqrstvwxz'
   f 'a test case'
a sect sate
   f 'well-done'
nedl-lowe
   f 'reverse the consonants'
setenne sne cohtosarvr

คำอธิบาย

C.~[:~.<@~.@/:~"1@(,.|.)@I.@e.&'...'  Input: s
                               '...'  The list of consonants
                            e.&'...'  Generate a boolean mask where an index is true
                                      if the char at that index in s is a consonant
                         I.@          Get a list of the true indices
                  (  |.)@             Reverse that list
                  (,.  )@             Join the original and reversed list as columns
            /:~"1@                    Sort each row of that 2d list
         ~.@                          Take the distinct values in each row
       <@                             Box them
   [:~.                               Take the distinct boxes - Now represents the
                                      permutation needed to solve this in cycle notation
C.~                                   Permute s according the cycles and return

4

MATL, 18 22 21 ไบต์

tt2Y211Y2'y'hX-m)P5M(

บันทึก 1 ไบต์ขอบคุณ @Luis

น่าเสียดายที่ส่วนที่ยาวที่สุดของสิ่งนี้คือการรับรายชื่อของพยัญชนะ ( 2Y211Y2'y'hX-)

ลองออนไลน์!

คำอธิบาย

            % Implicitly grab the input
tt          % Duplicate twice
2Y2         % Grab the pre-defined list of all lower-case letters
llY2        % Grab the pre-defined list of lower-case vowels (excluding 'y')
'y'h        % Add 'y' to the list of vowels
X-          % Find the set difference between these two lists (the consonants)
m           % Create a boolean array the size of the input that is true for all consonants
)           % Use this as an index to grab all consonants
P           % Reverse the order of the consonants
5M          % Get the boolean array again
(           % Re-assign the flipped consonants with the original consonant locations
            % Implicitly dislpay the result

น้อยกว่า 1 ไบต์:tt2Y211Y2'y'hX-m)P5M(
Luis Mendo

@LuisMendo ความคิดที่ยอดเยี่ยมขอบคุณ!
Suever

4

Perl 5 (58 + 4 = 62 ไบต์)

$_=<>;$r=qr/(?![eiouy])[b-z]/;@a=/$r/g;s/$r/pop@a/ge;print

+4 การลงโทษสำหรับการทำงานกับการ-0777ตั้งค่าสถานะซึ่งตั้งค่า Perl เป็นโหมด slurp เพื่อจัดการบรรทัดใหม่ได้อย่างถูกต้อง

ยอมรับอินพุตผ่าน STDIN และพิมพ์ไปยัง STDOUT

คำอธิบาย

                   $_=<>;   Read the input
 $r=qr/(?![eiouy])[b-z]/;   Save the regex; we'll be using it twice
                @a=/$r/g;   Store all the consonants in an array
           s/$r/pop@a/ge;   Replace each consonant with the final value in the array and pop
                   print    Output the result

4

JavaScript (ES6), 72 ไบต์

s=>s.split(/([^\W\d_aeiouy])/).map((c,i,a)=>i&1?a[a.length+~i]:c).join``

การแยก/([^\W\d_aeiouy])/ผลลัพธ์ในพยัญชนะตกในรายการเลขคี่ในอาร์เรย์ จากนั้นก็เพียงพอที่จะสลับรายการเหล่านั้นด้วยรายการเทียบเท่านับถอยหลังจากจุดสิ้นสุดของอาร์เรย์และเข้าร่วมผลลัพธ์ด้วยกัน


งานที่ดี! ฉันไม่ได้คิดเรื่องแยก
Conor O'Brien

5
CIA ดูเหมือนว่าจะแทรกซึมรหัสของคุณ
Patrick Roberts

ฉันลอง regexp เดียวกัน แต่มันกลับหลักเช่นกัน
edc65

4

JavaScript (ES6), 57 70

แก้ไขน่าอัศจรรย์ประหยัด 20% ขอบคุณ @Neil

ไปงานปาร์ตี้สาย แต่ดูเหมือนว่าทุกคนจาวาสคริปต์จะพลาดบางสิ่งบางอย่าง

a=>a.replace(r=/[^\W\d_aeiouy]/g,_=>c.pop(),c=a.match(r))

ทดสอบ

f=a=>a.replace(r=/[^\W\d_aeiouy]/g,_=>c.pop(),c=a.match(r))

function test() {
  var i=I.value
  O.textContent=f(i)
}

test()
#I { width:90% }
<input id=I oninput="test()" value="reverse the consonants."><pre id=O></pre>


@nicael มันก็ออกนอกสถานที่ (nitpick!) (แต่ขอบคุณสำหรับการสังเกต)
edc65

ราวกับว่ามันก็ไม่มากพอที่ไม่ดีที่ (เนื่องจากข้อผิดพลาดในการแก้ปัญหาของฉัน) คุณตีผมแล้วมันก็ดูเหมือนว่าคุณควรจะสามารถที่จะประหยัด 13 c.pop()ไบต์โดยใช้
Neil

@Neil ว้าวขอบคุณมากนั่นคือการปรับปรุงครั้งใหญ่
edc65

4

Perl 5, 92 68 55 ไบต์

บันทึกแล้ว37ไบต์ด้วยความช่วยเหลือของ@manatwork ;-)

$_=<>;@b=@a=/[^\Waeiou]/g;print$_~~@b?pop@a:$_ for/./g

การแปลของ@Lynn Python solution เป็น Perl


สวัสดีและยินดีต้อนรับสู่ PPCG!
NoOneIsHere

1
@ NoOneIsHere ขออภัย PPCG คืออะไร
ราศีเมษ

P rogramming P uzzles & C ode G olf
NoOneIsHere

1
บางคน“ g” แรงจะช่วยให้มี: @s=split//;@s=/./g;และ→for(@s){push@a,$_ if(/[^\Waeiou]/);} @a=/[^\Waeiou]/g;ฉันหมายถึงm//ด้วยโมดิgฟายเออร์ส่งคืนอาเรย์ของการแข่งขันทั้งหมด
จัดการ

1
รุ่นที่ 2 @b=@a=…อาจจะลดลงโดยการเข้าร่วมงานที่มอบหมาย: นอกจากนี้forมีคำเดียวในบล็อก (ซึ่งในกรณีที่;ไม่จำเป็นหลังจากที่มัน) print$_~~@b?pop@a:$_ for/./gคุณสามารถเปลี่ยนมันเป็นคำสั่งปรับปรุงและคั่นอุปกรณ์เสริม: (Yepp, ขอโทษ, พลาดที่: ไม่จำเป็นต้องเก็บ@sค่าไว้ในตัวแปร)
manatwork


3

จูเลีย 53 ไบต์

!s=s[flipud(i)]=s[i=find(c->'}'>c"aeiouy"<"$c",s)]

การทำเช่นนี้จะใช้อาร์เรย์อักขระเป็นอินพุตและสลับพยัญชนะในตำแหน่ง ลองออนไลน์!

เครดิตไปที่ @ Sp3000 สำหรับการตรวจสอบตัวอักษรพิมพ์เล็ก

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

i=find(...,s)อัตราผลตอบแทนดัชนีทั้งหมดของsที่คำกริยา...ผลตอบแทนที่แท้จริงและช่วยพวกเขามันตัวแปรฉัน

c->'}'>c∉"aeiouy"<"$c"ทำการทดสอบสามครั้งและส่งคืนค่าจริงถ้าหากทั้งหมดนั้นเป็นค่าบวก

  • '}'>cตรวจสอบว่าตัวละครมาก่อน{

  • "aeiou"การตรวจสอบถ้าสตริง มาหลังจาก

  • c∉"aeiouy"ตรวจสอบว่าไม่ใช่สระ

ในที่สุดs[i]ผลตอบแทนถัวเฉลี่ยพยัญชนะและs[flipud(i)]=s[i]กำหนดให้พวกเขาอยู่ในตำแหน่งsที่สอดคล้องกับดัชนีตรงกันข้ามในในฉัน


การเข้ารหัสแบบนี้ใช้อะไร( )
อดัม

1
UTF-8 น่าเสียดาย
Dennis

3

Java, 319 305 261 188 ไบต์

ขอมอบเครดิตให้กับ @ Leaky Nunสำหรับการช่วยเหลือ :-)

char[]r(char[]s){int i=0,j=0,n=s.length;char[]o=new char[n];for(;i<n;i++){if((s[i]+"").matches("(?![eiouy])[b-z]")){o[j++]=s[i];s[i]=65;}}for(i=0;i<n;i++)if(s[i]==65)s[i]=o[--j];return s;}

เก่า:

s(String p){int i=0,j=0;char[]s=p.toCharArray(),o=p.toCharArray();for(;i<s.length;i++){if(((s[i]+"").matches("[aeiouy @#$%^&*(){}\\[\\]\\|/\\\\<>~\\-_+=`]")))continue;o[j++]=(s[i]);s[i]='A';}for(i=0;i<s.length;i++)if(s[i]=='A')s[i]=o[--j];return new String(s);}

แรงบันดาลใจมาจากที่นี่

Ungolfed

String s(String p){
    int i = 0, j = 0;
    char[]s=p.toCharArray(),o=p.toCharArray();
    for (;i<s.length;i++) {
        if (((s[i]+"").matches("[aeiouy @#$%^&*(){}\\[\\]\\|/\\\\<>~\\-_+=`]"))) continue;
        o[j++] = (s[i]); // Store the consonant into o
        s[i] = 'A'; // Put a special character in its place
    }
    for (i=0;i<s.length;i++)
        if (s[i] == 'A') // If special character
            s[i] = o[--j]; // Put back the consonant in reverse order
    return new String(s);
}

2
คุณสามารถใช้0เป็นอักขระพิเศษ ( nullรับประกันได้ว่าจะไม่อยู่ใน String) และคุณสามารถตรวจสอบได้โดยs[i]<1(ไม่มีอักขระเชิงลบ)
Leaky Nun

ฉันจะcharให้คุณเป็นชิ้น ๆ :)
gcampbell

3

Ruby, 53 50 ไบต์

-3 ไบต์จาก @manatwork

->s{i=0;s.gsub(r=/[^\Waeiouy_]/){s.scan(r)[i-=1]}}

ลองที่นี่


ทำไมโค้ดบล็อกถึงพารามิเตอร์ที่ไม่ได้ใช้
จัดการ

1
@ manatwork ถูกต้อง Ruby จะอนุญาตให้คุณละเว้นพารามิเตอร์ที่ไม่ได้ใช้เนื่องจากเป็นบล็อก คุณสามารถโกนอักขระสามตัวที่นั่น
Silvio Mayolo

@ การทำงานฉันจะเริ่มใช้มันเพื่อบางสิ่ง แต่แล้วฉันก็ไม่ได้และเป็นผลให้ลืมที่จะลบมัน
Value Ink

2

Python 2, 103 98 100 ไบต์

import re
def r(s):a=re.split("([^\W\d_aeiouy])",s);print''.join(sum(zip(a[::2],a[-2::-2]+['']),()))

คำตอบของ JavaScript พอร์ตของฉัน แก้ไข: บันทึก 5 ไบต์ด้วย @ Dennis ♦ซึ่งฉันต้องใช้ตัวเลขสองหลักในการแก้ไข


2

R, 120 ไบต์

คำตอบใหม่:

az=function(x){
y=strsplit(x, NULL)[[1]]
a=regexpr("[bc-df-hj-np-tv-z]", y)
y[a==1]=rev(y[a==1])
paste(y, collapse="")
}

รับสายอักขระเป็น x

az("reverse the consonants")
[1] "setenne sne cohtosarvr"

คำตอบเก่าด้านล่าง (110 ไบต์) เป็นรูปแบบที่แย่ในส่วนของฉันซึ่งเพิ่งกลับคำพยัญชนะ:

xrev=function(x){y=rev(strsplit(x, NULL)[[1]])
paste(y[is.na(match(y, c("a", "e","i","o","u","y")))], collapse="")}

ทำไมเครื่องหมายวรรคตอนกลับด้าน และเสียงสระจะหายไปไหน?
nicael


2

APLX, 31 ไบต์

(c/t)←⌽t/⍨c←(t←⍞)∊⎕a~'aeoiuy'
t

⎕a~'aeoiuy'อักษรตัวพิมพ์เล็กโดยไม่มีสระ
t←⍞เก็บอินพุตอักขระเป็นt
c←()∊เก็บบูลีน "ตัวอักษร?" ในฐานะที่เป็นสารสกัด
t/⍨ (พยัญชนะ) จากt
ย้อนกลับ
(c/t)←แทนที่พยัญชนะด้วย (คนที่กลับรายการ)
tกลับสตริงปรับเปลี่ยน


1

Python 2.7, 144 ไบต์

def f(a):c='bcdfghjklmnpqrstvwxz';b=[x for x in list(a[::-1])if x in c];[b.insert(x,a[x])for x in range(len(a))if a[x]not in c];return''.join(b)

ครั้งแรกนี้จะสร้างรายการที่กลับรายการของพยัญชนะจากนั้นแทรกตัวละครอื่น ๆ แต่ละตัวกลับมาที่ดัชนีเดิมของพวกเขา

ยกเลิกแข็งแรงเล่นกอล์ฟ:

s = 'well-done'
reverse = list(s[::-1])
consonants = [i for i in reverse if i in 'bcdfghjklmnpqrstvwxz']

for x in range(len(s)):
    if s[x] not in 'bcdfghjklmnpqrstvwxz':
        consonants.insert(x,s[x])

print(''.join(consonants))

https://repl.it/C30O


คุณสามารถบันทึกไบต์โดยสร้างตัวแปรสำหรับ 'bcdfghjklmnpqrstvwxz' และเรียกตัวแปรนั้นแทน
MCMastery

1

Mathematica 216 ไบต์

Module[{h,v,i},v=Characters["aeiouy "];h[s_]:=SortBy[Flatten[Thread/@Transpose@{v,#[[All,1]]&/@(StringPosition[s,#]&/@v)},1],Last];i[s_,{a_,n_}]:=StringInsert[s,a,n];Fold[i,StringReverse@StringReplace[#,v->""],h@#]]&

1

Haskell, 157 131 ไบต์

k="bcdfghjklmnpqrstvwxz";f c((r:q),s)=if c`elem`k then(q,r:s)else(r:q,c:s);f c("",s)=("",c:s);g s=snd$foldr f(filter(`elem`k)s,"")s

ปรับปรุง

วิธีแก้ปัญหาของ @ atlasologist ทำให้ฉันรู้ว่าฉันต้องการเพียงแค่รายการของพยัญชนะแทนที่จะเป็นคู่ (ไม่จำเป็นต้องย้อนกลับแม้ว่าฉันจะใช้พับที่ถูกต้อง)

Ungolfed

consonants = "bcdfghjklmnpqrstvwxz"

-- Combining function (right fold, improved)
f :: Char -> (String, String) -> (String, String)
f c ((r:rest), s) = if c `elem` consonants then (rest, r:s) else (r:rest, c:s)
f c ("", s) = ("", c:s)

transform :: String -> String
transform s = snd $ foldr f (filter (`elem` consonants) s, "") s


main = do
    line <- getLine
    putStrLn . transform $ line

เก่า

c="bcdfghjklmnpqrstvwxz";n c(a@((f,t):q),s)=if c==f then(q,t:s)else(a,c:s);n c([],s)=([],c:s);g s=let z=filter(`elem`c)s in snd$foldr n(zip (reverse z)z,"")s

สร้างรายการของคู่ของพยัญชนะแล้วเดินผ่านสตริงแทนที่แต่ละพยัญชนะโดยใช้รายการดังกล่าว

ดั้งเดิม แต่ฉันต้องการคิดออกโดยไม่ดูคำตอบก่อน :)


4
เคล็ดลับ: ก) if ... then ... elseการใช้ยามแทน ข) ถูกเขียนดีในฐานะผู้ประกอบการมัดการพูดf %c) ไม่จำเป็นสำหรับคู่ภายในของใน() ((r:q),s)d) แทนที่""ด้วยในบรรทัดที่_ 2 fทั้งหมดในทุก ( อยู่เหมือนกัน):k c%(r:q,s)|c`elem`k=(q,r:s)|1<2=(r:q,c:s);c%(_,s)=("",c:s);g s=snd$foldr(%)(filter(`elem`k)s,"")s
nimi

1

S-lang ,17 16 ไบต์ (ไม่ใช่การแข่งขัน)

บันทึกหนึ่งไบต์เนื่องจาก s-lang ไม่จำเป็นต้องใช้วงเล็บอาร์กิวเมนต์สุดท้ายอีกต่อไป

ลองออนไลน์!

r[(?![aeiouy])\w

ฉันเริ่มทำงานกับภาษาการเล่นกอล์ฟจัดการสตริง (ฉันต้องการที่จะทำเช่นนี้ในขณะนี้) และฉันคิดว่านี่จะเป็นคำถามที่สนุกที่จะทำงานกับมัน

คำอธิบาย:

  • rย้อนกลับสตริงด้วยตัวจับคู่อักขระ regex ที่กำหนด (หากไม่มีการกำหนดอาร์กิวเมนต์ regex จะใช้ค่าเริ่มต้นเป็น.)
  • [ เริ่มต้นอาร์กิวเมนต์ตัวเลือก regex สำหรับ r
  • (?![aeiouy])\w regex เพื่อจับคู่อักขระพยัญชนะใด ๆ ยกเว้น y (น่าเสียดายที่ JavaScript ไม่อนุญาตให้ลบคลาสอักขระ)
  • ]มักจะจบลงด้วยอาร์กิวเมนต์ตัวเลือก regex สำหรับrแต่เราไม่ต้องการเพราะมันเป็นฟังก์ชั่นสุดท้ายและอาร์กิวเมนต์สุดท้าย

1

Matlab, 67 ตัวอักษร

สำหรับการป้อนข้อมูล 'this is a string of- stuff.'

s=input('','s');si=regexp(s,'[b-df-hj-np-tv-xz]');s(si)=s(flip(si))

ผลิต s = ffit is a fgnirt os- ssuht.

siเป็นดัชนีของพยัญชนะในสตริงอินพุต คำสั่งสุดท้ายแทนที่ตัวละครเหล่านั้นด้วยตัวอักษรเดียวกัน แต่เรียงลำดับย้อนกลับโดยการจัดทำดัชนี


นี้ไม่ได้ไปจัดการกับเครื่องหมายวรรคตอนใด ๆ -ยกเว้น คำถามบอกว่าเครื่องหมายวรรคตอนใด ๆ เป็นอินพุตที่ถูกต้องและควรละเว้น นอกจากนี้คุณจะต้องใช้input('')เพื่อคว้าอินพุตหรือเขียนฟังก์ชันที่ไม่ระบุชื่อเพราะเราไม่สามารถยอมรับตัวแปรได้เนื่องจากอินพุตเช่นนี้
Suever

1
นอกจากนี้คุณสามารถใช้flipเพื่อย้อนกลับสตริง
Suever

เครื่องหมายวรรคตอนถูกแก้ไขเป็นคำถามหลังจากที่ฉันโพสต์ แต่ฉันจะแก้ไข เกี่ยวกับอินพุตฉันสามารถใช้ได้ansเพราะนั่นคือสิ่งที่อินพุตเริ่มต้นสำหรับคอนโซล Matlab กำหนดให้
sintax

1
ฉันไม่คิดอย่างนั้น มันควรจะเป็นวิธีการแก้ปัญหาในตัวเอง คุณจะต้องทำs=input('')หรือสร้างสิ่งนี้ในฟังก์ชั่นนิรนาม@(s)
Suever

ตกลงฉันจะทำในภายหลังหรือพรุ่งนี้ ตอนนี้ฉันไม่อยู่ที่คอมพิวเตอร์
sintax

1

PowerShell , 81 ไบต์

-join(($a=$args|% t*y)|%{if($_-in($c=$a-match'[^\W\d_aeiouy]')){$_=$c[--$i]};$_})

ลองออนไลน์!

หักกอล์ฟ:

$a          = $args|% toCharArray
$consonants = $a-match'[^\W\d_aeiouy]'
$result     = $a|%{if($_-in$consonants){$_=$consonants[--$i]};$_}
-join($result)

PowerShell , 88 ไบต์, -f

$i=0;-join($args|% t*y|%{if($_-match'[^\W\d_aeiouy]'){$c=,$_+$c;$_="{$i}";$i++};$_})-f$c

ลองออนไลน์!


0

q / kdb +, 45 ไบต์

วิธีการแก้:

{x[w]:x(|)w:(&)max x=/:.Q.a except"aeiouy";x}

คำอธิบาย:

ค้นหาดัชนีของพยัญชนะและแทนที่ด้วยพยัญชนะที่กลับด้าน:

{x[w]:x reverse w:where max x=/:.Q.a except "aeiouy";x} / ungolfed
{                                                   ; } / two-statement lambda
                                .Q.a except "aeiouy"    / alphabet (a..z) except vowels
                            x=/:                        / equals each-right (returns boolean lists where input is each a consonant)
                        max                             / 'or' the results together
                  where                                 / indices where results are true
                w:                                      / save in variable w
        reverse                                         / reverse this list
      x                                                 / index into input at these indices
 x[w]:                                                  / assign values to x at indices w
                                                     x  / return x

หมายเหตุ:

ฉันมี 3 วิธีในการสร้างรายการพยัญชนะหนึ่งในวิธีแก้ปัญหานั้นดีกว่าตัวเลือกอื่นเล็กน้อย:

  • "bcdfghjklmnpqrstvwxz" สำหรับ 22 ตัวอักษร (น่าเบื่อที่สุด)
  • .Q.a _/0 3 6 11 16 19 สำหรับ 21 ตัวอักษร (ค่อนข้างเย็นวางดัชนีแต่ละอัน)
  • .Q.a except"aeiouy" สำหรับ 19 ตัวอักษร (น่าเบื่อที่สุดเป็นอันดับสอง)

0

Jq 1.5 , 289 263 ไบต์

def C:"bcdfghjklmnpqrstvwxz";. as$s|[("^","")as$p|[match("([\($p)\(C)]+)";"g").captures[].string]]|.[1]|=(reduce map(length)[]as$l({s:add|explode|reverse|implode,r:[]};.r+=[.s[0:$l]]|.s=.s[$l:])|.r)|if$s[0:1]|inside(C)then[.[1,0]]else . end|transpose|map(add)|add

คำอธิบาย

def consonants:"bcdfghjklmnpqrstvwxz";

  . as $s
| [  ("^","") as $p                                              # parse string onto non-consonant
   | [match("([\($p)\(consonants)]+)";"g").captures[].string]]   # and consonant groups
| .[1] |= (
     reduce map(length)[] as $l (                                # build new for consonant groups
       {s:add|explode|reverse|implode,r:[]}                      # by adding groups from reversed string
     ; .r+=[.s[0:$l]] | .s=.s[$l:]                               
     )
     |.r
  )
| if $s[0:1]|inside(consonants) then  [.[1,0]] else . end        # put groups into proper order for merge
| transpose | map(add) | add                                     # merge groups into final string

วิ่งตัวอย่าง

$ jq -MRr 'def C:"bcdfghjklmnpqrstvwxz";. as$s|[("^","")as$p|[match("([\($p)\(C)]+)";"g").captures[].string]]|.[1]|=(reduce map(length)[]as$l({s:add|explode|reverse|implode,r:[]};.r+=[.s[0:$l]]|.s=.s[$l:])|.r)|if$s[0:1]|inside(C)then[.[1,0]]else . end|transpose|map(add)|add' input
a sect sate
nedl-lowe
setenne sne cohtosarvr

ลองออนไลน์


0

Java 8, 157 ไบต์

s->s.format(s.replaceAll("[^\\W\\d_aeiouy]","%s"),s.chars().mapToObj(c->""+(char)c).filter(c->c.matches("[^\\W\\d_aeiouy]")).reduce("",(x,y)->y+x).split(""))

ลองออนไลน์!

หมายเหตุ: พิมพ์คำเตือนของคอมไพเลอร์ไปที่ stderr
คำอธิบาย:

s->                                                    // Lambda function
    s.format(                                          // Format a string using the given arguments
        s.replaceAll("[^\\W\\d_aeiouy]","%s"),         // Generate the format string by replacing all consonants with "%s"
        s.chars()                                      // Stream the characters of the input string s
            .mapToObj(c->""+(char)c)                   // Map characters back to strings
            .filter(c->c.matches("[^\\W\\d_aeiouy]"))  // Filter out vowels and symbols
            .reduce("",(x,y)->y+x)                     // Build the string of consonants in reverse
            .split("")                                 // Turn into an array of single-char strings (varargs abuse)
    )                                                  // Implicit return of the formatted string

ไม่ต้องโกหกเป้าหมายเดียวของฉันคือเอาชนะคำตอบนี้


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