Đảo ngược phụ âm


42

Chương trình nên lấy một chuỗi làm đầu vào và đảo ngược các phụ âm trong đó, trong khi vẫn giữ nguyên thứ tự nguyên âm. Tất cả các chữ cái sẽ là chữ thường, vì vậy bạn không phải lo lắng về vỏ. Ví dụ sau.

  1. Đầu vào : a test case.
    Các phụ âm ở đây là t,s,t,c,s. Chúng phải đi theo thứ tự đảo ngược, nghĩa là s,c,t,s,tvà chèn trở lại chuỗi vào cùng vị trí nơi đặt các ký tự đảo ngược trước : a sect sate.

  2. Đầu vào : well-done. Đầu ra : nedl-lowe.

  3. Đầu vào : reverse the consonants. Đầu ra : setenne sne cohtosarvr.

Đây là mã golf, giải pháp ngắn nhất chiến thắng.

Y nên được coi là nguyên âm bất kể nó là gì và không được đảo ngược.

Bất cứ điều gì, cũng như số, dấu chấm câu, dấu ngoặc kép và các ký hiệu khác ( @#$%^&*(){}[]\|/<>~-_+=`), có thể có khả năng xuất hiện trong đầu vào.

Câu trả lời:


16

Võng mạc, 22 21 20 17

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

Hãy thử trực tuyến!

1 byte nhờ Leaky Nun!

4 byte nhờ Martin!

Ocó nghĩa là sắp xếp và #có nghĩa là sắp xếp theo giá trị số. Vì không có ký tự trùng khớp nào sẽ có giá trị số, tất cả các chữ cái có cùng trọng số: 0. ^có nghĩa là đảo ngược thứ tự của các giá trị được sắp xếp, nhờ sắp xếp ổn định có nghĩa là các giá trị được đảo ngược.

Các -[...]phương tiện để thực hiện sự khác biệt giữa các lớp nhân vật bên ngoài và lớp bên trong này. Đây là một phần của .NET và bạn có thể đọc thêm tại MSDN .


Rất đẹp. Là -[...]cụ thể cho võng mạc, hoặc cụ thể cho .exex regex hay nó là một tính năng regex chung mà tôi đã bỏ qua cho đến bây giờ?
Chấn thương kỹ thuật số

@DigitalTrauma Với cú pháp này tôi nghĩ nó đặc trưng cho .NET. Các hương vị khác cũng có giao điểm lớp nhân vật, nhưng sau đó tôi nghĩ cú pháp thường là [...&&[^...]].
Martin Ender

@MartinEnder Tôi sẽ phải thử những thứ này với sed và grep. Không có khả năng sed có nó, nhưng có lẽ grep chế độ PCRE.
Chấn thương kỹ thuật số

1
Perl 6 sử dụng <[b..z] - [eiouy]>hoặc <:Ll - [aeiouy]>để thiết lập sự khác biệt
Brad Gilbert b2gills

15

Python 2, 86 byte

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

Đưa đầu vào dưới dạng một chuỗi trong dấu ngoặc kép. Lặp lại thông qua đầu vào, thay thế từng phụ âm bằng %sin s. Bộ clưu trữ các phụ âm gặp phải theo thứ tự đảo ngược. Sau đó, chuỗi định dạng thay thế %s's trong svới phụ âm trong c.

Nhờ Sp3000 để kiểm tra phụ âm, đã lưu 4 byte qua việc liệt kê các phụ âm.


1
Đây là một chút tuyệt vời của mã golf :)
Lynn

Thực sự thanh lịch và ngắn đáng ngạc nhiên, đây là Python
DevilApple227

9

Thạch , 22 20 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ø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 byte

Đã lưu một byte nhờ mỗi Martin và Leaky Nun và 2 byte cho Neil!

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

Kiểm tra

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
Đó là sự lạm dụng tồi tệ hơn của các đối số chức năng.
Leaky Nun

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

Sẽ /(?[_aeiouy])\w/glàm việc?
Neil

@Neil Không, điều đó sẽ phù hợp _, đó là một biểu tượng mà OP muốn giữ đúng vị trí.
Conor O'Brien

1
Trong bản demo của bạn, bạn có thể thay đổi q.onchange=q.onkeydown=q.onkeyup=thành q.oninput=...
Patrick Roberts

5

Python 2, 106 byte

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)

Mong đợi đầu vào "quotes", mà tôi nghĩ là được phép.


4

Pyke, 18 byte

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

Hãy thử nó ở đây!

hoặc 16 byte với phiên bản mới:

(Thay đổi như vậy nếu trả về tất cả đầu ra chuỗi và có đầu vào chuỗi, trả về chuỗi thay vì danh sách)

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

Hãy thử nó ở đây!

~c chứa các phụ âm: bcdfghjklmnpqrstvwxz

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

4

GNU sed, 73

Điểm bao gồm +1 cho -rcờ được chuyển cho sed.

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

Ideone.

Liên tục chuyển phụ âm đầu tiên và phụ âm cuối và chuyển đổi chúng thành chữ hoa, cho đến khi không còn kết quả khớp nữa. Sau đó chuyển đổi toàn bộ chuỗi trở lại chữ thường.


4

J, 53 byte

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

Có thể không phải là cách tốt nhất nhưng tôi muốn sử dụng C.vì điều này có thể được giải quyết bằng hoán vị.

Sử dụng

   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

Giải trình

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 byte

tt2Y211Y2'y'hX-m)P5M(

Lưu 1 byte nhờ @Luis

Thật không may, phần dài nhất của điều này là nhận được danh sách các phụ âm ( 2Y211Y2'y'hX-).

Hãy thử trực tuyến!

Giải trình

            % 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

Ít hơn 1 byte:tt2Y211Y2'y'hX-m)P5M(
Luis Mendo

@LuisMendo Ý tưởng tuyệt vời, cảm ơn!
Suever

4

Perl 5 (58 + 4 = 62 byte)

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

+4 hình phạt cho việc chạy với -0777cờ, điều này đặt Perl thành chế độ lắt léo để xử lý các dòng mới một cách chính xác.

Chấp nhận đầu vào thông qua STDIN và in ra STDOUT.

Giải trình

                   $_=<>;   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 byte

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

Chia tách /([^\W\d_aeiouy])/kết quả trong các phụ âm rơi vào các mục được đánh số lẻ trong mảng. Sau đó, đủ để chuyển các mục đó với mục tương đương đếm ngược từ cuối mảng và nối kết quả lại với nhau.


Công việc tốt! Tôi đã không nghĩ về việc chia tách.
Conor O'Brien

5
CIA dường như đã xâm nhập mã của bạn.
Patrick Roberts

Tôi đã thử
regrec

4

JavaScript (ES6), 57 70

Chỉnh sửa tiết kiệm tuyệt vời 20% thx @Neil

Đến bữa tiệc muộn, nhưng dường như tất cả mọi người javascript đều bỏ lỡ điều gì đó

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

Kiểm tra

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 đơn giản là không đúng chỗ (nitpick!) (nhưng cảm ơn vì đã chú ý)
edc65

Như thể nó không đủ tệ đến mức (do lỗi trong giải pháp của tôi) bạn đã đánh bại tôi rồi, có vẻ như bạn sẽ có thể lưu 13 byte bằng cách sử dụng c.pop().
Neil

@Neil wow cảm ơn đó là một sự cải tiến lớn
edc65

4

Perl 5, 92 68 55 byte

Đã lưu 37 byte nhờ sự giúp đỡ của @manatwork . ;-)

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

Bản dịch của giải pháp Python @Lynn sang Perl.


Xin chào, và chào mừng đến với PPCG!
NoOneIsHãy

1
@NoOneIsHere Xin lỗi, PPCG là gì.
Aries

P rogramming P uzzles & C thơ ca ngợi G OLF.
NoOneIsHãy

1
Một số glực lượng Quảng Đông sẽ giúp đỡ ở đó: @s=split//;@s=/./g;for(@s){push@a,$_ if(/[^\Waeiou]/);}@a=/[^\Waeiou]/g;. Ý tôi là, m//với công cụ gsửa đổi trả về một mảng của tất cả các kết quả khớp.
manatwork

1
Phiên bản thứ 2 có thể được giảm bằng cách tham gia các bài tập : @b=@a=…. Ngoài ra, forviệc có một câu lệnh trong khối (trong trường hợp ;không cần thiết sau nó), bạn có thể chuyển đổi nó thành công cụ sửa đổi câu lệnh và dự phòng các dấu phân cách : print$_~~@b?pop@a:$_ for/./g. (Yepp, xin lỗi, đã bỏ lỡ rằng: không cần lưu trữ @sgiá trị trong một biến.)
manatwork

3

Pyth, 26 25 24 23 byte

si: Q ++ \ [JG "aeiouy" \] 3_ @ J
JG "aeiouy" sm? @DJ @ _ @ JQ ~ hZ <- chỉ giữ điều này vì @ _ @
JG "aeiouy" sm? @ DJ @@ JQ = tZ
sm? @ dJ-G "aeiouy" @@ JQ = tZ
sm | -dJ-G "aeiouy" @@ JQ = tZ

Bộ thử nghiệm.


3

Julia, 53 byte

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

Cái này lấy một mảng ký tự làm đầu vào và đảo ngược các phụ âm của nó tại chỗ. Hãy thử trực tuyến!

Tín dụng vào @ Sp3000 để kiểm tra phụ âm chữ thường.

Làm thế nào nó hoạt động

i=find(...,s)mang lại tất cả các chỉ số của s mà vị từ ... trả về giá trị true và lưu chúng vào biến i .

c->'}'>c∉"aeiouy"<"$c"thực hiện ba bài kiểm tra và trả về giá trị true nếu và chỉ khi tất cả đều dương tính.

  • '}'>ckiểm tra xem ký tự c có trước { .

  • "aeiou"kiểm tra xem chuỗi c có sau a không .

  • c∉"aeiouy"xác minh rằng c không phải là nguyên âm.

Cuối cùng, s[i]mang lại tất cả các phụ âm và s[flipud(i)]=s[i]gán chúng vào các vị trí trong s tương ứng với các chỉ số đảo ngược trong i .


Mã hóa nào sử dụng ( )?
Adám

1
UTF-8, thật không may.
Dennis

3

Java, 319 305 261 188 byte

Tín dụng cho @ Leaky Nun vì đã giúp với điều này :-)

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;}

Cũ:

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);}

Cảm hứng lấy từ đây

Bị đánh cắp

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
Bạn có thể sử dụng 0làm ký tự đặc biệt ( nullđược đảm bảo không có trong Chuỗi) và bạn có thể kiểm tra nó bằng cách s[i]<1(không có char âm)
Leaky Nun

Tôi sẽ cho charbạn từng mảnh. :)
gcampbell

3

Ruby, 53 50 byte

-3 byte từ @manatwork

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

Hãy thử nó ở đây


Tại sao mã chặn một tham số không sử dụng?
manatwork

1
@manatwork là đúng. Ruby sẽ cho phép bạn bỏ qua tham số không sử dụng vì đó là một khối. Bạn có thể cạo ba nhân vật ở đó.
Silvio Mayolo

@manatwork, ban đầu tôi sẽ sử dụng nó cho một cái gì đó, nhưng sau đó tôi đã không và kết quả là đã quên xóa nó
Value Ink

2

Python 2, 103 98 100 byte

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

Cổng câu trả lời JavaScript của tôi. Chỉnh sửa: Đã lưu 5 byte nhờ @ Dennis ♦, trong đó tôi đã kịp thời bỏ ra hai chữ số sửa lỗi.


2

R, 120 byte

Câu trả lời mới:

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="")
}

lấy một chuỗi ký tự là x

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

Về phía tôi, phản hồi cũ (110 byte) là hình thức kém, điều này chỉ đảo ngược các phụ âm:

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

Tại sao dấu chấm câu bị đảo ngược? Và các nguyên âm đã đi đâu?
nicael


2

APLX, 31 byte

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

⎕a~'aeoiuy'chữ thường chữ cái mà không nguyên âm
t←⍞cửa hàng vật đầu vào như t
c←( ... )∊cửa hàng Boolean "phụ âm?" khi trích xuất c
t/⍨ (phụ âm) từ t phụ âm thay thế
ngược lại
(c/t)←với (phụ âm đảo ngược)
ttrả về chuỗi đã sửa đổi


1

Python 2.7, 144 byte

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)

Điều này đầu tiên xây dựng một danh sách các phụ âm đảo ngược, sau đó chèn từng ký tự khác vào trong chỉ mục ban đầu của chúng.

Chưa chơi gôn:

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


Bạn có thể lưu byte bằng cách tạo một biến cho 'bcdfghjklmnpqrstvwxz' và gọi biến đó thay vào đó
MCM Abbey

1

Toán học 216 byte

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 byte

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

Cập nhật

Giải pháp của @ atlasologist khiến tôi nhận ra tôi chỉ cần một danh sách các phụ âm thay vì các cặp (không cần phải đảo ngược chúng mặc dù tôi đang sử dụng đúng cách.)

Bị đánh cắp

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

Tạo một danh sách các cặp phụ âm, sau đó đi qua chuỗi thay thế từng phụ âm bằng danh sách đã nói.

Một chút nguyên thủy, nhưng tôi muốn tìm hiểu điều này mà không cần nhìn vào câu trả lời đầu tiên. :)


4
Một số lời khuyên: a) sử dụng vệ sĩ thay vì if ... then ... else. b) fđược viết tốt hơn như là một toán tử infix, nói %. c) không cần cặp bên ()trong ((r:q),s). d) thay thế ""bằng _trong dòng thứ 2 của f. Tất cả trong tất cả ( kgiữ nguyên) : 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 byte (không cạnh tranh)

Đã lưu một byte vì s-lang không còn yêu cầu khung đối số cuối cùng

Hãy thử trực tuyến!

r[(?![aeiouy])\w

Tôi bắt đầu làm việc với một ngôn ngữ chơi golf thao tác dây (tôi đã muốn làm điều này từ lâu rồi) và tôi nghĩ đây sẽ là một câu hỏi thú vị để làm việc với nó.

Giải trình:

  • rđảo ngược chuỗi với trình so khớp ký tự regex đã cho (nếu không có đối số regex nào được đưa ra, nó sẽ mặc định .)
  • [ bắt đầu đối số regex tùy chọn cho r
  • (?![aeiouy])\w biểu thức chính quy để khớp với bất kỳ ký tự phụ âm nào trừ y (tiếc là JavaScript không cho phép trừ lớp ký tự)
  • ]thường kết thúc đối số regex tùy chọn cho r, nhưng chúng ta không cần nó vì nó là hàm cuối cùng và đối số cuối cùng

1

Matlab, 67 ký tự

Đối với một đầu vào 'this is a string of- stuff.'

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

sản xuất s = ffit is a fgnirt os- ssuht.

silà chỉ số của các phụ âm trong chuỗi đầu vào. Câu lệnh cuối cùng thay thế các ký tự đó bằng cùng một ký tự nhưng theo thứ tự ngược lại bằng cách lập chỉ mục.


Điều này sẽ không xử lý bất kỳ dấu câu nào ngoại trừ -. Câu hỏi nói rằng bất kỳ dấu câu nào là đầu vào hợp lệ và nên được bỏ qua. Ngoài ra, bạn sẽ cần sử dụng input('')để lấy đầu vào hoặc viết hàm ẩn danh vì chúng tôi không thể chấp nhận một biến là đầu vào như thế này.
Suever

1
Ngoài ra, bạn có thể sử dụng flipđể đảo ngược chuỗi.
Suever

Dấu câu đã được chỉnh sửa thành câu hỏi sau khi tôi đăng, nhưng tôi sẽ sửa nó. Liên quan đến đầu vào, tôi chỉ có thể sử dụng ans, vì đó là đầu vào mặc định cho bảng điều khiển Matlab được gán cho?
sintax

1
Tôi không nghĩ vậy. nó nên là một giải pháp khép kín Bạn sẽ cần phải thực hiện s=input('')hoặc bằng cách nào đó biến điều này thành một chức năng ẩn danh@(s)
Suever

Ok, tôi sẽ làm điều đó sau hoặc ngày mai. Tôi đang rời khỏi máy tính của tôi bây giờ.
sintax

1

PowerShell , 81 byte

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

Hãy thử trực tuyến!

Ít chơi gôn hơn:

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

PowerShell , 88 byte, -f

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

Hãy thử trực tuyến!


0

q / kdb +, 45 byte

Giải pháp:

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

Giải trình:

Tìm chỉ số của các phụ âm và thay thế chúng bằng các phụ âm đảo ngược:

{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

Ghi chú:

Tôi đã có 3 cách để xây dựng danh sách phụ âm, một trong những giải pháp tốt hơn một chút so với các giải pháp thay thế:

  • "bcdfghjklmnpqrstvwxz" cho 22 ký tự (nhàm chán nhất)
  • .Q.a _/0 3 6 11 16 19 cho 21 ký tự (loại mát mẻ, giảm từng chỉ số)
  • .Q.a except"aeiouy" cho 19 ký tự (thứ hai nhàm chán nhất)

0

Jq 1.5 , 289 263 byte

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

Giải trình

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

Chạy mẫu

$ 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

Dùng thử trực tuyến


0

Java 8, 157 byte

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

Hãy thử trực tuyến!

Lưu ý: in cảnh báo trình biên dịch sang stderr.
Giải trình:

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

Không nói dối, mục tiêu duy nhất của tôi là đánh bại câu trả lời này


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.