Chuyển đổi một chuỗi thành tương đương Rövarspråket của nó


15

Rövarspråket

Rövarspråket là một trò chơi chữ do trẻ em Thụy Điển chơi, từ những cuốn sách về Kalle Blomkvist của Astrid Lindgren.

Các quy tắc cơ bản như sau (từ Wikipedia):

  • Mỗi phụ âm (vấn đề chính tả, không phát âm) được nhân đôi và một o được chèn ở giữa.
  • Nguyên âm được giữ nguyên.

Một vài ví dụ:

  • "xin chào" -> "hohelollolo"
  • "Min Svävare är full med ål" -> "MoMinon sosvovävovarore äror fofulollol momedod ålol"

Phụ âm Thụy Điển giống như phụ âm tiếng Anh, vì vậy chương trình nên hoạt động với cả mục tiếng Thụy Điển và tiếng Anh.

Chữ "y" được lấy làm phụ âm trong trường hợp này - như hầu hết thời gian.


Nhiệm vụ của bạn:

Viết chương trình chuyển đổi một chuỗi các chữ cái Thụy Điển, được nhập thông qua một hàm hoặc thông qua stdin, tương đương với Rövarspråket của nó. Câu trả lời ngắn nhất trong byte chiến thắng!


@ MartinBüttner Làm rõ hơn câu hỏi của tôi - nó nên hoạt động với tiếng Thụy Điển (vì đây là một trò chơi chữ Thụy Điển).
James Williams

Ý nghĩa của các mục trong bảng chữ cái là gì?
Tối ưu hóa

@Optimizer Một chuỗi các ký tự chỉ trong bảng chữ cái. Xin lỗi, tôi đã nói xấu nó, tôi sẽ chỉnh sửa
James Williams

3
Làm thế nào chúng ta nên đối xử với các chữ cái không? Ít nhất là không gian hiển thị trong ví dụ thứ hai.
nimi

2
Một lưu ý phụ: 'Y' được coi là nguyên âm trong tiếng Thụy Điển
leo

Câu trả lời:


14

Võng mạc , 14 + 5 = 19 byte

Retina là một ngôn ngữ về cơ bản chỉ là .NET regex với càng ít chi phí càng tốt. Mã cho chương trình này bao gồm hai tệp:

i`[b-z-[eiou]]
$0o$0

Cái này đọc đầu vào trên STDIN và in đầu ra thành STDOUT.

Nếu bạn gọi các tập tin pattern.rgxreplacement.rpl, bạn có thể chạy chương trình đơn giản như

echo "hello" | ./Retina pattern.rgx replacement.rpl

Giải trình

Điều này khá đơn giản, nhưng hãy để tôi thêm một số lời giải thích nào (chủ yếu là về cách Retina hoạt động). Nếu Retina được gọi với 2 tệp, nó sẽ tự động được coi là hoạt động trong "Chế độ thay thế", trong đó tệp đầu tiên là regex và tệp thứ hai là mẫu.

Retina có thể được cấu hình (bao gồm RegexOptionsvà các tùy chọn khác) bằng cách thêm vào biểu thức chính quy `và chuỗi cấu hình. Trong trường hợp này tôi chỉ đưa ra nói là công cụ sửa đổi regex bình thường cho trường hợp không nhạy cảm.

Đối với chính regex, nó sử dụng phép trừ lớp ký tự của .NET để khớp với bất kỳ phụ âm nào trong phạm vi ASCII. Sự thay thế sau đó chỉ cần viết lại trận đấu hai lần với một oở giữa.


Bạn đang thiếu một atrong lớp nhân vật nguyên âm của bạn?
Brian Gordon

3
@BrianGordon Không, tôi đang bắt đầu lớp nhân vật b, vì vậy tôi không cần phải trừ a.
Martin Ender

2
Thú vị, tôi chưa bao giờ thấy phạm vi nhân vật lồng nhau, trừ đi trước đây. Có phải đó chỉ là một thứ .NET?
Steve Bennett

Tôi cảm thấy như bạn cần tính ít nhất một ký tự để phân định giữa hai tệp. đó sẽ là dấu chấm phẩy hoặc dòng mới trong ngôn ngữ khác. đó là khoảng trống giữa các tên tập tin nếu bạn muốn kén chọn về nơi mà nhân vật đến từ ngôn ngữ này.
Sparr

@Sparr có, đó là chính sách bây giờ, nhưng chính sách đó mới hơn thách thức / câu trả lời này. Để tham khảo (Trên thực tế, nếu bạn nhìn vào dấu thời gian, bạn có thể thấy rằng tôi đã thúc đẩy chính sách câu trả lời này, nhưng việc áp dụng các quy tắc như thế trên khắp trang web sẽ không có ý nghĩa nhiều.)
Martin Ender

12

Sử dụng Unix KSH 27 28 32 27 byte (hoặc 21 nếu chúng ta chỉ tính bên trong lệnh sed)

Nhờ những gợi ý của người khác :) Đánh giá cao.

.. Tôi đã xuống đây:

sed 's/[^AEIOUÅÄÖ ]/&o&/ig'

(được phép cho không gian và ký tự Thụy Điển)

echo "hello" | sed 's/[BCDFGHJ-NP-TV-Z]/&o&/ig'
hohelollolo
echo "HELLO" | sed 's/[BCDFGHJ-NP-TV-Z]/&o&/ig'
HoHELoLLoLO
echo "QuIcKlY Now" | sed 's/[BCDFGHJ-NP-TV-Z]/&o&/ig'
QoQuIcocKoKlolYoY NoNowow

4
Ngoài ra, tôi nghĩ có thể cho phép câu trả lời của bạn là một sedchương trình và chỉ cần đếm các byte giữa các dấu ngoặc đơn
Chấn thương kỹ thuật số

1
s/[^AEIOU]/&o&/igdường như hoạt động .. đối với các từ đơn lẻ ít nhất ... bạn cũng sẽ cần loại trừ khoảng trắng
Chấn thương kỹ thuật số

1
bash, mặc dù vỏ không quan trọng, miễn là chương trình sed của bạn nằm trong dấu ngoặc đơn
Digital Trauma

1
Cũng xem ra cho các nguyên âm swedish ö, å, vv - những nhu cầu không bao gồm quá. Có thể tốt hơn để sử dụng danh sách trắng chỉ các phụ âms/[BCDFGHJ-NP-TV-Z]/&o&/ig
Digital Trauma

2
Tôi sẽ làm cho nó 'sed' và sử dụng "s / [^ AEIOUÅÄÖ] / & o & / ig", bao gồm các nguyên âm và khoảng trắng của Thụy Điển cho 25 byte.
swstephe

7

CJam, 32 30 byte

q{_eu'[,66>"EIOU"-#)g{'o1$}*}/

Đây là một chương trình đọc toàn bộ từ STDIN và in sang STDOUT. Nó hoạt động cho đầu vào Unicode tùy ý và coi 42 ký tự sau đây là phụ âm:

BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz

Kiểm tra nó ở đây.

Giải trình

q                              "Slurp STDIN.";
 {                          }/ "For each character...";
  _eu                          "Duplicate and convert to upper case.";
     '[,66>                    "Get a string from B to Z using range and slice.";
           "EIOU"-             "Remove the remaining four vowels.";
                  #            "Find the position of the character in this string or
                                -1 if the character can't be found.";
                   )g          "Increment, take signum, which gives 1 for consonants, 
                                and 0 otherwise.";
                     {    }*   "Repeat this block that many times, i.e. do nothing for
                                non-consonants.";
                      'o       "Push an 'o'.";
                        1$     "Copy the current character.";

5

JavaScript, 59 57 55 44 byte

s=>s.replace(/(?![eiou])[b-z]/gi,"$&o$&")

Cảm ơn Masterzagh đã nhắc nhở tôi rằng một chức năng cũng sẽ được chấp nhận và cho mẹo regex của anh ấy liên quan đến phản hồi mà không cần nắm bắt!

Phiên bản dài hơn với đầu vào / đầu ra:

alert(prompt().replace(/(?![eiou])[b-z]/gi,"$&o$&"));

Hiển thị hộp nhắc để nhập chuỗi, sau đó hiển thị hộp thoại chứa đầu ra Rövarspråket. Mã này sử dụng biểu thức chính để nhân đôi phụ âm và chèn os.


"Viết chương trình chuyển đổi một chuỗi các chữ cái Thụy Điển, được nhập thông qua một chức năng hoặc thông qua stdin", Bạn có thể thực hiện nós=>alert(s.replace(/(?![eiou])([b-z])/gi,"$1o$1"));

Và vì nó không được yêu cầu xuất ra, bạn cũng không cần cảnh báo.

Một điều nữa, bạn có thể phản hồi mà không cần chụp . Về cơ bản s=>s.replace(/(?![eiou])[b-z]/gi,"$&o$&"), vì $&có nghĩa là khớp hiện tại, bạn có thể loại bỏ dấu ngoặc đơn ghi lại chữ cái của bạn và trong khi bạn ở đó lưu một byte khác bằng cách xóa dấu chấm phẩy ở cuối.

@Masterzagh Thật tuyệt, cảm ơn lần nữa!
Chương trìnhFOX

4

Toán học, 84 73 72 byte

StringReplace[#,a:RegularExpression@"(?i)[BCDFGHJ-NP-TV-Z]":>a<>"o"<>a]&

Giải trình:

  • RegularExpression@"(?i)[BCDFGHJ-NP-TV-Z]" là một regex phù hợp với tất cả các phụ âm không phân biệt chữ hoa chữ thường.
  • a:*..*:>a<>"o"<>a tạo ra một quy tắc trì hoãn để ràng buộc những phụ âm đó vào a và thay thế nó bằng và được bao quanh bởi chính nó.
  • Cuối cùng, StringReplace[#,*..*]&tạo một hàm thuần áp dụng quy tắc đó cho mọi chữ cái phù hợp trong đối số của nó.

@ MartinBüttner Cảm ơn! Vẫn còn mới đối với môn đánh gôn
Mathicala

@ MartinBüttner Dù sao cũng sẽ làm điều đó nhưng bị phân tâm bởi một số thông báo: P
LegionMammal978

4

Julia, 46 44 byte

t->replace(t,r"(?![eiou])[b-z]"i,s->s*"o"*s)

Điều này tạo ra một hàm ẩn danh nhận một đầu vào chuỗi đơn và in tương đương Rövarspråket. Để gọi nó, đặt tên cho nó, vdf=t->... .

Không có nhiều đã thực sự được chơi golf ở đây, ngoại trừ không gian sau dấu phẩy ở replace() .

Ở đây chúng tôi đang sử dụng 3 đối số trong replace()hàm: chuỗi đầu vào, biểu thức chính quy để xác định các chuỗi con và thay thế. Julia biểu thị các mẫu biểu thức chính quy bằng cách r"...". Thêm ivào cuối làm cho nó không nhạy cảm. Regex đặc biệt này phù hợp với phụ âm. Nếu một chức năng được sử dụng để thay thế, đầu ra là chức năng đó được áp dụng cho từng chuỗi con phù hợp. Hàm chúng ta đang sử dụng ở đây lấy một chuỗi svà trả về sos, vì *thực hiện nối chuỗi trong Julia. Do đó, kết quả cuối cùng là chuỗi đầu vào với mỗi phụ âm được nhân đôi với "o" ở giữa.

Ví dụ:

julia> f("Min svävare är full med ål")
"MoMinon sosvovävovarore äror fofulollol momedod ålol"

julia> f("hello")
"hohelollolo"

julia> f("Rövarspråket")
"RoRövovarorsospoproråkoketot"

Lưu ý rằng điều này sẽ dài hơn 9 byte nếu chúng ta phải in kết quả thay vì trả lại. Đang chờ xác nhận từ OP.


Chỉnh sửa: Đã lưu 2 byte nhờ Martin Büttner!


3

Haskell, 81 byte

x n|elem n"bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"=[n,'o',n]|1<2=[n]
f=(>>=x)

Sử dụng: f "Hello there!" -> "HoHelollolo tothoherore!".

Tôi không thể khéo léo xây dựng danh sách các phụ âm mà không cần imports đắt tiền . Ngay cả việc chuyển chữ cái để kiểm tra chữ thường cũng cần nhiều byte hơn là chỉ liệt kê cả phụ âm chữ hoa và chữ thường.


3

Java 8, 45

Sử dụng như một chức năng lambda. Sử dụng biểu thức chính quy.

a->a.replaceAll("(?i)[b-z&&[^eiou]]","$0o$0")

Thử ở đây


2

Perl, 33 byte

Câu trả lời này chủ yếu chỉ dành cho regex, với một lượng nhỏ mã bổ sung để thực hiện I / O.

$_=<>;s/[^aeiou\W]/$&o$&/gi;print

Đã được một thời gian kể từ khi tôi sử dụng các biểu thức Perl, vì vậy điều này có thể được cải thiện.

$_=<>;                              This takes input from STDIN `<>` and stores
                                    it into the default variable $_
      s/          /     /gi;        This is a case-(i)nsentive, (g)lobal, 
                                    (s)ubstitution regex.  Since no other
                                    variable is specified, it is applied to
                                    the default variable $_.
        [^aeiou\W]                  This matches any single character that 
                                    is a consonant, by using a double-
                                    negative ^\W to match only alphanumeric 
                                    characters excluding vowels.  Accented 
                                    vowels are not considered alphanumeric 
                                    by Perl.
                   $&o$&            This forms the replacement.  $& contains the 
                                    match (the consonant), so this replaces each 
                                    consonant with two copies of itself with 
                                    an 'o' in between.
                            print   This prints the result.  With no arguments, 
                                    it prints $_ by default.

[^aeiou]Vẫn không khớp với å và các nguyên âm không phải ASCII khác?
Alex A.

@AlexA. Tôi đã nhận thấy vấn đề. Đó là một sửa chữa không có ký tự ( \sđến \W).
PhiNotPi

+1, giải thích kỹ lưỡng nhất cho mã Perl tôi đã thấy trên trang web này.
Zgarb

2

C (phiên bản ideone.com) - 133

Ok, điều này là rất lớn. Nhưng C không có biểu thức chính quy. Xin vui lòng cho tôi biết nếu bạn thấy một cái gì đó có thể làm cho nó ngắn hơn ...

#define x (*c<66||*c>90)&&(*c<98||*c>122)||strchr("EIOUeiou",*c)?"":
c[2];main(){while(0<(*c=getchar()))printf("%s%s%s",c,x"o",x c);}

Làm thế nào để biến cục bộ cđược khai báo?
wjl

@wjl các biến toàn cục trong C được khởi tạo bằng không. Các biến cục bộ nằm trên ngăn xếp và không được khởi tạo. Xem stackoverflow.com/questions/3553559/ Biến Biến với một kiểu mặc định cho int và vì printf hoạt động trên ký tự, mã có thể có vấn đề về endian - Tôi sẽ kiểm tra vào ngày mai.
Jerry Jeremiah

Vâng, tôi hiểu khởi tạo mặc định. Tôi chỉ cố gắng chỉ ra rằng mã này không được biên dịch vì hoàn toàn ckhông được khai báo , vd out.c:2:18: error: ‘c’ undeclared (first use in this function).
wjl

@wjl Tôi đoán nó phụ thuộc vào trình biên dịch. Nó biên dịch và chạy tại ideone.com ideone.com/s7M5mZ khi bạn chọn C - bạn có biết sự khác biệt là gì không?
Jerry Jeremiah

Trông giống như một lỗi với trình biên dịch của ideone. Nếu bạn sửa dòng mới giữa c[2];main(cần thiết vì #definekhông kết thúc bằng dấu chấm phẩy), nó sẽ báo lỗi tương tự với GCC. Dù sao, không có vấn đề gì lớn, nó vẫn là một môn đánh gôn vui nhộn, nhưng bạn thực sự có thể cần thêm một vài nhân vật để làm cho điều này hợp lệ C. =)
wjl

2

Batch Windows, 235 byte

@echo off
setlocal enabledelayedexpansion
set d=qwrtypsdfghjklzxcvbnm
set #=%1
:x
if defined # (
for /l %%i in (0,1,20)do (
set m=!d:~%%i,1!
if /i !m!==%#:~0,1% set g=!g!!m!o)
set g=!g!%#:~0,1%
set #=%#:~1%
goto x)
echo %g%

Sử dụng:

script.bat hello

Đầu ra:

hohelollolo

Bạn có thể tự hỏi tại sao tôi không đặt d thành "aoui", kiểm tra không bằng yêu cầu thoát ra khỏi một vòng lặp. Không phải tất cả mọi thứ nên làm việc, làm việc, trong lô. Kịch bản xử lý 1 từ ký tự [khi chúng xuất hiện trên bàn phím của bạn]. Tất cả các không gian và dòng mới vẫn còn hiện tại được yêu cầu để tập lệnh chạy.

Yêu cầu Windows XP trở lên. Không được thử nghiệm trong Windows 8 trở lên.


2

PowerShell - 35 byte

Chỉ để cho thấy rằng PowerShell đôi khi cũng có thể cạnh tranh trong những điều này, và với regex bị đánh cắp một cách đáng xấu hổ từ câu trả lời Retina của Martin Büttner:

%{$_-replace'[b-z-[eiou]]','$0o$0'}

chấp nhận đầu vào chuỗi từ stdin


1

Pyth - 28 byte

Điều này hoạt động theo cách rõ ràng bằng cách tạo danh sách phụ âm một cách nhanh chóng bằng cách sử dụng sự khác biệt theo tập hợp.

FNzpk+N?+\oN}rNZ-{G{"aeiou"k

Giải thích đến sớm.

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


Bạn có thể lưu 4 bit bằng cách xóa 4 ký tự và thay thế một ký tự bằng một ký tự khác.
Jakube



1

Con trăn, 61

Tôi không thể làm cho một liên minh lớp nhân vật hoặc phép trừ hoạt động, và vì vậy tôi không nghĩ Python có tính năng đó. Tôi đã phải sử dụng một cái nhìn tiêu cực thay thế.

import re;f=lambda s:re.sub('(?i)(?![eiou])([b-z])',r'\1o\1',s)

Chạy nó ở đây: http://repl.it/fQ5

Liên kết đến nghịch đảo: /codegolf//a/48182/34718


1

K, 38 ký tự

f:{,/(1+2*~(_x)in"aeiouåäö ")#'x,'"o"}

-1 f"Min svävare är full med ål";
MoMinon sosvovävovarore äror fofulollol momedod ålol

1

K, 31 byte

,/{(x,"o",x;x)9>" aeiouåäö"?x}'

Một giải pháp đơn giản có vẻ khá cạnh tranh khi K thiếu regexes. Chọn giữa biểu mẫu "XoX" và biểu mẫu "X" dựa trên việc mỗi ký tự được tìm thấy trong bảng tra cứu các nguyên âm bị bỏ qua và tham gia các danh sách kết quả.

Bạn có thể dùng thử trong trình duyệt của mình bằng oK :

http://johnearnest.github.io/ok/index.html?run=%20%2C%2F%7B(x%2C%22o%22%2Cx%3Bx)9%3E%22%20aeiouåäö%22%3Fx%7D'%22Min%20svävare%20är%20full%20med%20ål%22

(Thật không may, tôi không thể cung cấp một liên kết có thể nhấp vì tràn ngăn xếp không xuất hiện để cho phép các ký tự có dấu trong URL)


0

Golf, 35 byte

{."aeiouåäö\n "?-1={."o"\}{}if}%

Dự kiến ​​đầu vào là trên ngăn xếp. Với đầu vào (50 byte):

"#{STDIN.gets}"{."aeiouåäö\n "?-1={."o"\}{}if}%

Làm việc với các vovels Thụy Điển å, ä và ö.


2
đầu vào luôn ở trên stack trên GS
Trình tối ưu hóa

0

Sed (trên dòng lệnh), 28 byte

sed 's/\([^aeiou]\)/\1o\1/g'

Hoặc là dẫn văn bản vào hoặc gõ nó trực tiếp. Chỉ riêng mã sed là 22 byte.


3
Điều này cũng nhân đôi không gian và ký tự như thế ä.
Chương trìnhFOX

0

R, 45 ký tự

gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)

Regex đơn giản. Đọc từ stdin. i=Tlà viết tắt của ignore.case=TRUE(nhờ khớp một phần tên đối số), làm cho gsubtrường hợp không nhạy cảm.

Sử dụng:

> gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)
Min svävare är full med ål
[1] "MoMinon sosvovävovarore äror fofulollol momedod ålol"
> gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)
hello
[1] "hohelollolo"
> gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)
hElLo
[1] "hohElolLoLo"

0

<> <(Cá), 64 byte

>" oieauåäöOIEAUÅÄÖ"0i:1+?!;01.
 :&=?\     l?!v&
^[0o&<&o"o"o:&<

Đó không phải là câu trả lời ngắn nhất nhưng tôi thích thử thách lập trình trong <> <

Dùng thử ở đây


0

golflua, 36 byte

B=I.r():g("[^aeiou%W ]","%1o%1")w(B)

Khớp mẫu đơn giản: lấy stdin, sau đó tìm các nguyên âm không ( %Wchăm sóc các ký tự không chữ và số) & chèn một ogiữa hai thay thế. Đáng buồn thay, làm tất cả điều này trong phần ghi (nghĩa là w(I.r():g(....))) cũng tạo ra số lần chèn, mặc dù nó đã lưu 3 ký tự. Tương đương Lua sẽ là

line = io.read()
rovar = line:gsub("[^aeiou%W ]","%1o%1")
print(rovar)

0

REXX, 107 byte

parse arg s
v='aeiouåäö '
o=
do until s=''
  parse var s l 2 s
  if verify(l,v)>0 then l=l'o'l
  o=o||l
  end
say o

"MoMinon sosvovävovarore äror fofulollol momedod ålol"


0

JavaScript 43

Cảm ơn @Masterzagh vì đã lưu vào cú pháp hàm.

x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&")

JavaScript 62

function E(x){return x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&")}

Chức năng của bạn có thể ở dạng một hàm mũi tên ẩn danh như thế nào x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&"). Chức năng mũi tên hoạt động như thế này name=(arg1, arg2)=>{code}. ()không cần thiết nếu chỉ có một đối số và {}không cần thiết nếu chỉ có một dòng mã. Trả về cũng không cần thiết nếu một dòng trả về một cái gì đó.

Và tôi quên nói. Bạn không cần đặt tên cho nó để giải quyết vấn đề chỉ yêu cầu bạn tạo chức năng.
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.