Bir dizeyi Rövarspråket eşdeğerine dönüştürme


15

Rövarspråket

Rövarspråket , İsveçli çocuklar tarafından Astrid Lindgren'in Kalle Blomkvist ile ilgili kitaplarından oynanan bir kelime oyunudur.

Temel kurallar aşağıdaki gibidir (Wikipedia'dan):

  • Her ünsüz (yazım önemlidir, telaffuz değil) ikiye katlanır ve arasına bir o eklenir.
  • Ünlüler bozulmadan kalır.

Birkaç örnek:

  • "merhaba" -> "hohelollolo"
  • "Min svävare ve tam med ål" -> "MoMinon sosvovävovarore äror fofulollol momedod ålol"

İsveçli ünsüzler İngilizce olanlarla aynıdır, bu nedenle program hem İsveççe hem de İngilizce girişlerle çalışmalıdır.

"Y" harfi bu durumda ünsüz olarak alınır - çoğu zaman olduğu gibi.


Senin görevin:

Bir işlev veya stdin aracılığıyla girilen bir dizi İsveç harfini Rövarspråket eşdeğerine dönüştürmek için bir program yazın. Bayt cinsinden en kısa cevap kazanır!


@ MartinBüttner Sorumu daha da netleştirdi - İsveççe ile çalışmalı (İsveççe bir kelime oyunu olduğu için).
James Williams

Alfabetik girişlerin anlamı nedir?
Doktor

@Optimizer Yalnızca alfabetik karakterlerden oluşan bir dize. Üzgünüm, kötü ifade ettim, düzenleyeceğim
James Williams

3
Mektup olmayanlara nasıl davranmalıyız? İkinci örnekte en az boşluk görülüyor.
nimi

2
Yan not: 'Y' İsveççe bir sesli harf olarak kabul edilir
leo

Yanıtlar:


14

Retina , 14 + 5 = 19 bayt

Retina, aslında .NET regex olan ve mümkün olduğunca az ek yük sağlayan bir dildir. Bu programın kodu iki dosyadan oluşur:

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

Bu, STDIN üzerindeki girişi okur ve çıktıyı STDOUT'a yazdırır.

Dosyaları çağırırsanız pattern.rgxve replacement.rplprogramı basitçe

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

açıklama

Bu oldukça basit, ama yine de biraz açıklama ekleyeyim (çoğunlukla Retina'nın nasıl çalıştığı hakkında). Retina 2 dosya ile çağrılırsa, otomatik olarak "Değiştirme modu" nda çalıştığı varsayılır; burada birinci dosya normal ifade ve ikinci dosya kalıptır.

Retina RegexOptions, normal ifade `ve bir yapılandırma dizesi eklenerek yapılandırılabilir ( ve diğer seçenekleri içerir ) . Bu durumda sadece ibüyük / küçük harf duyarsızlığı için normal normal ifade değiştirici olanı veriyorum .

Normal ifadeye gelince, ASCII aralığındaki herhangi bir ünsüzle eşleştirmek için .NET'in karakter sınıfı çıkarma özelliğini kullanır. Değişim daha sonra sadece iki kez bir arada ile maçı geri yazar o.


aSesli harf sınıfınızda bir eksik mi var ?
Brian Gordon

3
@BrianGordon Hayır, karakter sınıfından başlıyorum b, bu yüzden çıkarmam gerekmiyor a.
Martin Ender

2
İlginç, daha önce hiç iç içe, çıkarıcı karakter aralıkları görmedim. Bu sadece bir .NET mi?
Steve Bennett

İki dosya arasındaki sınırlama için en az bir karakter saymanız gerektiğini hissediyorum. başka bir dilde noktalı virgül veya yeni satır olabilir. karakterin bu dilde nereden geldiğini seçmek istiyorsanız dosya adları arasındaki boşluktur.
Sparr

@Sparr evet, şimdi politika bu, ancak bu politika bu meydan okuma / cevaptan daha yeni. Referans için (Aslında, zaman damgalarına bakarsanız, bu cevap nedeniyle politikayı zorladığımı görebilirsiniz , ancak site boyunca böyle kuralların geriye dönük olarak uygulanması pek mantıklı değil.)
Martin Ender

12

Unix KSH 27 28 32 27 bayt kullanma (veya yalnızca sed komutunun içinde saydığımızda 21)

Başkalarının önerileri sayesinde :) Takdir.

.. Bu işe başladım:

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

(boşluklar ve İsveççe karakterler için izin verilir)

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

5
Ayrıca, cevabınızın bir sedprogram olduğunu iddia etmenize izin verildiğini ve sadece tek tırnak arasındaki baytları saydığınızı düşünüyorum
Digital Trauma

1
s/[^AEIOU]/&o&/igişe yarıyor gibi görünüyor .. en azından tek kelime için ... boşlukları da dışlamanız gerekir
Digital Trauma

1
bash, kabuk programı önemli olmamalı, sed programınız tek tırnak içinde olduğu sürece
Digital Trauma

1
Ayrıca İsveçli ünlülerin için dikkat ö, åvb - bu ihtiyaç da hariç. Sadece ünsüzlerin beyaz listesini kullanmak daha iyi olabilirs/[BCDFGHJ-NP-TV-Z]/&o&/ig
Digital Trauma

2
Bunu 'sed' yapar ve 25 baytlık İsveççe ünlüleri ve alanları kapsayan "s / [^ AEIOUÅÄÖ] / & o & / ig" kullanırdım.
15'te

7

CJam, 32 30 bayt

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

Bu STDIN okuma ve STDOUT baskı tam bir programdır. İsteğe bağlı Unicode girişi için çalışır ve aşağıdaki 42 karakteri ünsüz olarak kabul eder:

BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz

Burada test edin.

açıklama

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 bayt

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

Masterzagh'a bir fonksiyonun da kabul edilebilir olacağını hatırlattığı için ve yakalamadan geri başvurularla ilgili regex ipucu için!

Giriş / çıkışlı daha uzun versiyon:

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

Dizeye girmek için bir bilgi istemi kutusu görüntüler, ardından Rövarspråket çıktısını içeren bir iletişim kutusu görüntüler. Kod, ünsüzleri ikiye katlamak ve os eklemek için bir normal ifade kullanır .


"Bir fonksiyon veya stdin aracılığıyla girilen bir dizi İsveççe harfleri dönüştürmek için bir program yazın", Bunu yapabilirsinizs=>alert(s.replace(/(?![eiou])([b-z])/gi,"$1o$1"));

Çıktı istenmediği için uyarıya da ihtiyacınız yok.

Bir şey daha, yakalamadan geri başvuru yapabilirsiniz . Temel olarak s=>s.replace(/(?![eiou])[b-z]/gi,"$&o$&"), $&geçerli eşleşme anlamına geldiğinden, mektubunuzu yakalayan parantezleri kaldırabilirsiniz ve bu sırada sonunda noktalı virgül kaldırarak başka bir bayt kaydedebilirsiniz.

@Masterzagh Güzel, tekrar teşekkürler!
ProgramFOX

4

Mathematica, 84 73 72 bayt

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

Açıklama:

  • RegularExpression@"(?i)[BCDFGHJ-NP-TV-Z]" tüm ünsüzlerle büyük / küçük harfe duyarlı olmayan bir normal ifadedir.
  • a:*..*:>a<>"o"<>abu ünsüzleri bağlamak ave onunla çevrili ve yerine koymak için gecikmiş bir kural oluşturur .
  • Son olarak, StringReplace[#,*..*]&bu kuralı bağımsız değişkenindeki eşleşen her harfe uygulayan saf bir işlev oluşturur.

@ MartinBüttner Teşekkürler! Mathematica golfing için hala yeni ...
LegionMammal978

@ MartinBüttner Yine de yapacaktı ama bazı bildirimlerle dikkati dağıldı: P
LegionMammal978

4

Julia, 46 44 bayt

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

Bu, tek bir dize girişi alan ve Rövarspråket eşdeğerini yazdıran anonim bir işlev oluşturur. Bunu aramak için bir ad verin, örn f=t->....

Burada virgül sonra boşluklar dışında pek bir şey gerçekten golf edilmiştir replace().

Burada replace()işlevde 3 bağımsız değişken kullanıyoruz : giriş dizesi, alt dizeleri tanımlamak için normal ifade ve bir değiştirme. Julia düzenli ifade kalıplarını ifade eder r"...". iSonuna eklemek onu büyük / küçük harfe duyarsız hale getirir. Bu özel ifade ünsüzlerle eşleşir. Değiştirme için bir işlev kullanılırsa, çıktı her eşleşen alt dizeye uygulanan işlevdir. Burada kullandığımız işlev bir dize alır sve geri dönersos , çünkü *Julia'da dize birleştirmesi gerçekleştirir. Böylece sonuç, her ünsüzün arasında bir "o" ile iki katına çıktığı giriş dizesidir.

Örnekler:

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"

Sonucu döndürmek yerine yazdırmamız gerekirse, bunun 9 bayt daha uzun olacağını unutmayın. OP'den onay bekleniyor.


Edit: Martin Büttner sayesinde 2 bayt kaydedildi!


3

Haskell, 81 bayt

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

Kullanımı: f "Hello there!"-> "HoHelollolo tothoherore!".

Ünsüzlerin listesini zahmetsizce pahalı olmadan inşa edemiyorum import. Küçük harfe kontrol etmek için mektubu çevirmek bile, hem büyük hem de küçük harf ünsüzlerini listelemekten daha fazla bayt gerektirir.



2

Perl, 33 Bayt

Bu cevap çoğunlukla yalnızca normal ifadedir ve G / Ç gerçekleştirmek için az miktarda ek kod içerir.

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

Perl regex'lerini kullandığımdan beri bir süredir, bu yüzden muhtemelen geliştirilebilir.

$_=<>;                              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]Hala å ve diğer ASCII olmayan sesli harflerle eşleşmiyor mu?
Alex

@AlexA. Sorunu zaten fark ettim. O (sıfır karakterlik bir düzeltme oldu \siçin \W).
PhiNotPi

+1, bu sitede gördüğüm Perl kodu için en kapsamlı açıklama.
Zgarb

2

Windows Toplu İş, 235 bayt

@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%

Kullanımı:

script.bat hello

Çıktı:

hohelollolo

Neden d'yi "aoui" olarak ayarlamadığımı merak ediyor olabilirsiniz, eşit olmayanları kontrol etmek bir döngüden kurtulmayı gerektirir. Çalışması gereken her şey toplu olarak işe yaramıyor. Betik 1 kelimeyi [klavyenizde göründükleri gibi) işler. Hala mevcut olan tüm boşluklar ve yeni satırlar komut dosyasının çalışması için gereklidir.

Windows XP veya üstü gerekir. Windows 8 ve sonraki sürümlerde test edilmemiştir.


2

PowerShell - 35 bayt

PowerShell'in bazen bunlarda da rekabet edebileceğini ve Martin Büttner'in Retina cevabından utanmadan çalınan regex ile:

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

stdin'den dize girişini kabul eder


2

C 109

@Ceilingcat sayesinde bazı çok güzel golf parçaları - şimdi daha da kısa

x;main(c){for(;~(c=getchar());printf("%s%s%s",&c,x+"o",x?"":&c))x=c<66|c>122|c>90&c<98||index("EIOUeiou",c);}

Çevrimiçi deneyin!


Yerel değişken nasıl cbildirilir?
wjl

C'deki @wjl global değişkenleri sıfır başlatılır. Yerel değişkenler yığın üzerindedir ve başlatılmaz. Bkz. Stackoverflow.com/questions/3553559/… Varsayılan tip int için değişkenler ve printf karakterlerde çalıştığı için kodun endian sorunları olabilir - Yarın kontrol edeceğim.
Jerry Jeremiah

Evet, varsayılan başlatmayı anlıyorum. Sadece güzel , örneğin chiç beyan edilmez beri bu kod derlemiyor işaret etmeye çalışıyordu out.c:2:18: error: ‘c’ undeclared (first use in this function).
wjl

@wjl Sanırım derleyiciye bağlı. C'yi seçtiğinizde ideone.com ideone.com/s7M5mZ'de derler ve çalışır - farkın ne olduğu hakkında bir fikriniz var mı?
Jerry Jeremiah

İdeone derleyicisiyle ilgili bir hata gibi görünüyor. Eğer yeni satırı düzeltirseniz c[2];main(gerekli olduğundan #definenoktalı virgülle bitmez), GCC'ye benzer hatalar verir. Her neyse, önemli değil, hala eğlenceli bir kod golf, ama aslında bu geçerli C. =) yapmak için birkaç karakter daha gerekebilir
wjl

1

Pyth - 28 bayt

Bu, set-wise farkı kullanarak anında ünsüzler listesi oluşturarak açık bir şekilde çalışır.

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

Açıklama çok yakında.

Burada deneyin .


4 karakteri kaldırarak ve bir karakteri başka bir karakterle değiştirerek 4 bit kaydedebilirsiniz.
Jakube



1

Python, 61

Bir karakter sınıfı birliği ya da çıkarması için çalışamadım ve bu yüzden Python'un bu özelliği olduğunu düşünmüyorum. Bunun yerine negatif bir ileriye bakmak zorunda kaldım.

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

Burada çalıştırın: http://repl.it/fQ5

Tersine bağlantı: /codegolf//a/48182/34718


1

K, 38 karakter

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 bayt

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

K'nin regex içermediği göz önüne alındığında, basit bir çözüm oldukça rekabetçi görünüyor. Her karakterin yok sayılan sesli harflerin arama tablosunda bulunup bulunmadığına bağlı olarak "XoX" formu ile "X" formu arasında seçim yapın ve elde edilen listelere katılın.

OK'yi kullanarak tarayıcınızda deneyebilirsiniz :

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

(Ne yazık ki tıklanabilir bir bağlantı sağlayamıyorum çünkü yığın taşması URL'lerde aksanlı karakterlere izin vermiyor)


1

05AB1E , 16 15 bayt

žND.š«vyÐ…ÿoÿ.:

Çevrimiçi deneyin!

Açıklama:

žND.š«vyÐ…ÿoÿ.:

žN               # push consonants
  D              # duplicate
   .š            # swap case
     «           # concatenate
      v          # for each in that string...
       y         # push current letter
        Ð…ÿoÿ    # triplicate y and push "{y}o{y}"
             .:  # input.replace(letter, new string)

ubir bayt kaydetmek için (büyük harfe) olabilir . Ve güzel cevap!
Kevin Cruijssen

14, alternatif bayt: žNDu«SD'osδ.ø‡.
Kevin Cruijssen

Ben sadece 13 bayt mümkün hissi vardı .. Yine de, bulmak için biraz aldı:žNDu«SD'o«€Ć‡
Kevin Cruijssen

0

Golfscript, 35 bayt

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

Girdinin yığın üzerinde olmasını bekler. Giriş ile (50 bayt):

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

İsveçli vovels å, ä ve ö ile çalışır.


2
girişi her zaman
Doktor

0

Sed (komut satırında), 28 bayt

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

Metni ekleyin veya doğrudan yazın. Sadece sed kodu 22 bayttır.


4
Bu aynı zamanda boşlukları ve karakterleri de kopyalar ä.
ProgramFOX

0

R, 45 karakter

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

Basit normal ifade. Stdin'den okur. i=Tbüyük / küçük harf duyarsız ignore.case=TRUEkılan (argüman adlarının kısmi eşleşmesi sayesinde) anlamına gelir gsub.

Kullanımı:

> 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

golflua, 36 bayt

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

Basit desen eşleme: stdin'i alın, sonra sesli harfleri bulun ( %Walfasayısal olmayan karakterlerle ilgilenir) ve oiki değiştirme arasına bir takın . Ne yazık ki, tüm bunları yazma (yani w(I.r():g(....))) içinde yapmak , 3 karakter kaydetmesine rağmen, ekleme sayısını da çıkarır. Lua eşdeğeri

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

0

REXX, 107 bayt

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

Fonksiyon sözdiziminden tasarruf için @ Masterzagh'a teşekkürler.

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

JavaScript 62

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

Sizin fonksiyonunuz gibi anonim bir ok fonksiyonu şeklinde olabilir x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&"). Ok fonksiyonları bu şekilde çalışır name=(arg1, arg2)=>{code}. ()yalnızca bir bağımsız değişken varsa ve {}yalnızca bir satır kod varsa gerekli değildir. Bir satır bir şey döndürürse dönüş de gerekli değildir.

And I forgot to say. You don't need to give it a name to solve the problem which only asked you to create a function.
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.