Konvertieren Sie einen String in sein Rövarspråket-Äquivalent


15

Rövarspråket

Rövarspråket ist ein Wortspiel schwedischer Kinder aus den Büchern über Kalle Blomkvist von Astrid Lindgren.

Die Grundregeln lauten wie folgt (aus Wikipedia):

  • Jeder Konsonant (Rechtschreibung, nicht Aussprache) wird verdoppelt und ein o dazwischen eingefügt.
  • Vokale bleiben erhalten.

Einige Beispiele:

  • "hallo" -> "hohelollolo"
  • "Min svävare är full med ål" -> "MoMinon sosvovävovarore äror fofulollol momedod ålol"

Schwedische Konsonanten sind die gleichen wie die englischen, daher sollte das Programm sowohl mit schwedischen als auch mit englischen Einträgen funktionieren.

Der Buchstabe "y" wird in diesem Fall - wie meistens - als Konsonant genommen.


Deine Aufgabe:

Schreiben Sie ein Programm, um eine Folge von schwedischen Buchstaben, die durch eine Funktion oder durch stdin eingegeben wurden, in das entsprechende Rövarspråket zu konvertieren. Kürzeste Antwort in Bytes gewinnt!


@ MartinBüttner Meine Frage wurde weiter geklärt - es sollte mit Schwedisch funktionieren (da es ein schwedisches Wortspiel ist).
James Williams

Was bedeuten alphabetische Einträge?
Optimierer

@Optimizer Eine Zeichenfolge mit nur alphabetischen Zeichen. Sorry, ich habe es schlecht formuliert, ich werde bearbeiten
James Williams

3
Wie sollen wir mit Nichtbriefen umgehen? Im zweiten Beispiel werden mindestens Leerzeichen angezeigt.
Nimi

2
Randbemerkung: 'Y' wird auf Schwedisch als Vokal betrachtet
Leo

Antworten:


14

Retina , 14 + 5 = 19 Bytes

Retina ist eine Sprache, die im Wesentlichen nur aus .NET-Regex besteht und so wenig Aufwand wie möglich verursacht. Der Code für dieses Programm besteht aus zwei Dateien:

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

Dadurch wird die Eingabe in STDIN gelesen und die Ausgabe in STDOUT gedruckt.

Wenn Sie die Dateien pattern.rgxund aufrufen replacement.rpl, können Sie das Programm einfach wie folgt ausführen

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

Erläuterung

Dies ist ziemlich einfach, aber lassen Sie mich trotzdem eine Erklärung hinzufügen (hauptsächlich darüber, wie Retina funktioniert). Wenn Retina mit 2 Dateien aufgerufen wird, wird automatisch angenommen, dass es im "Ersetzungsmodus" arbeitet, wobei die erste Datei die Regex und die zweite Datei das Muster ist.

Retina kann konfiguriert werden (einschließlich RegexOptionsund anderer Optionen), indem der Regex `und eine Konfigurationszeichenfolge vorangestellt werden . In diesem Fall gebe ich nur das, iwas der normale Regex-Modifikator für Groß- und Kleinschreibung ist.

Der reguläre Ausdruck selbst verwendet die .NET-Zeichenklassensubtraktion, um mit einem beliebigen Konsonanten im ASCII-Bereich übereinzustimmen. Die Ersetzung schreibt das Match dann einfach zweimal mit einem odazwischen liegenden zurück.


Vermissen Sie einen ain Ihrer Vokal-Charakter-Klasse?
Brian Gordon

3
@BrianGordon Nein, ich beginne die Zeichenklasse von b, also muss ich nicht subtrahieren a.
Martin Ender

2
Interessant, ich habe noch nie geschachtelte, subtraktive Zeichenbereiche gesehen. Ist das nur eine .NET Sache?
Steve Bennett

Ich glaube, Sie müssen mindestens ein Zeichen für die Begrenzung zwischen den beiden Dateien zählen. das wäre ein Semikolon oder ein Zeilenumbruch in einer anderen Sprache. Es ist das Leerzeichen zwischen den Dateinamen, wenn Sie genau wissen möchten, woher der Charakter in dieser Sprache kommt.
Sparr

@Sparr ja, das ist jetzt die Richtlinie, aber diese Richtlinie ist neuer als diese Herausforderung / Antwort. Zum Nachschlagen (Wenn Sie sich die Zeitstempel ansehen, sehen Sie, dass ich wegen dieser Antwort auf die Richtlinie gedrängt habe , aber die rückwirkende Anwendung solcher Regeln auf der gesamten Website macht nicht viel Sinn.)
Martin Ender,

12

Verwenden von Unix KSH 27 28 32 27 Bytes (oder 21, wenn nur innerhalb des Befehls sed gezählt wird)

Vielen Dank an die Vorschläge anderer :) Geschätzt.

..Ich bin auf folgendes gekommen:

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

(erlaubt für Leerzeichen und schwedische Zeichen)

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
Ich halte es auch für zulässig, zu behaupten, Ihre Antwort sei ein sedProgramm, und zählen Sie einfach die Bytes zwischen den einzelnen Anführungszeichen
Digital Trauma

1
s/[^AEIOU]/&o&/igscheint zu funktionieren ... zumindest für einzelne Wörter ... Sie müssen auch Leerzeichen ausschließen
Digital Trauma

1
Bash, obwohl die Shell keine Rolle spielen sollte, solange Ihr Sed-Programm in einfachen Anführungszeichen steht
Digital Trauma

1
Achten Sie auch für den schwedischen Vokale ö, åusw. - ohne auch diese Notwendigkeit. Könnte besser sein, eine Whitelist nur der Konsonanten zu verwendens/[BCDFGHJ-NP-TV-Z]/&o&/ig
Digital Trauma

2
Ich würde es "sed" machen und "s / [^ AEIOUÅÄÖ] / & o & / ig" verwenden, das schwedische Vokale und Leerzeichen für 25 Bytes abdeckt.
SWSTEPHE

7

CJam, 32 30 Bytes

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

Dies ist ein vollständiges Programm, das von STDIN gelesen und auf STDOUT gedruckt wird. Es funktioniert für beliebige Unicode-Eingaben und behandelt die folgenden 42 Zeichen als Konsonanten:

BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz

Teste es hier.

Erläuterung

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 Bytes

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

Vielen Dank an Masterzagh, der mich daran erinnert hat, dass eine Funktion auch akzeptabel ist, und an seinen Regex-Tipp in Bezug auf Rückverweise ohne Erfassung!

Längere Version mit Eingabe / Ausgabe:

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

Zeigt eine Eingabeaufforderung zur Eingabe der Zeichenfolge an und anschließend ein Dialogfeld mit der Rövarspråket-Ausgabe. Der Code verwendet einen regulären Ausdruck, um die Konsonanten zu verdoppeln und os einzufügen .


"Schreiben Sie ein Programm zum Konvertieren einer Zeichenfolge schwedischer Buchstaben, die über eine Funktion oder über stdin eingegeben wurde", Sie können es s=>alert(s.replace(/(?![eiou])([b-z])/gi,"$1o$1"));

Und da es nicht zur Ausgabe aufgefordert wurde, benötigen Sie die Warnung auch nicht.

Eine weitere Sache ist, dass Sie ohne Erfassung rückbeziehen können . Grundsätzlich können Sie s=>s.replace(/(?![eiou])[b-z]/gi,"$&o$&"), da $&dies die aktuelle Übereinstimmung bedeutet, die Klammern entfernen, die Ihren Brief erfassen, und, während Sie gerade dabei sind, ein weiteres Byte speichern, indem Sie das Semikolon am Ende entfernen.

@ Masterzagh Das ist cool, nochmals vielen Dank!
ProgramFOX

4

Mathematica, 84 73 72 Bytes

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

Erläuterung:

  • RegularExpression@"(?i)[BCDFGHJ-NP-TV-Z]" ist ein regulärer Ausdruck, bei dem die Groß- und Kleinschreibung aller Konsonanten nicht berücksichtigt wird.
  • a:*..*:>a<>"o"<>aerstellt eine verzögerte Regel, um diese Konsonanten an sich zu binden aund durch und zu ersetzen, die von sich selbst umgeben sind.
  • Schließlich StringReplace[#,*..*]&schafft eine reine Funktion , diese Regel zu jedem passenden Brief in seiner Argumentation anwenden.

@ MartinBüttner Danke! Noch neu in Mathematica Golf ...
LegionMammal978

@ MartinBüttner Wollte das sowieso, wurde aber durch einige Benachrichtigungen abgelenkt: P
LegionMammal978

4

Julia, 46 44 Bytes

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

Dadurch wird eine anonyme Funktion erstellt, die eine einzelne Zeichenfolge eingibt und das Rövarspråket-Äquivalent ausgibt. Um es zu nennen, geben Sie ihm einen Namen, z f=t->....

Abgesehen von Leerzeichen nach dem Komma wurde hier nicht wirklich viel gespielt replace().

Hier verwenden wir 3 Argumente in der replace()Funktion: die Eingabezeichenfolge, den regulären Ausdruck zum Identifizieren von Teilzeichenfolgen und eine Ersetzung. Julia bezeichnet reguläre Ausdrucksmuster mit r"...". Durch idas Hinzufügen zum Ende wird die Groß- und Kleinschreibung ignoriert. Dieser spezielle reguläre Ausdruck entspricht den Konsonanten. Wenn eine Funktion zum Ersetzen verwendet wird, ist die Ausgabe die Funktion, die auf jede übereinstimmende Teilzeichenfolge angewendet wird. Die Funktion, die wir hier verwenden, nimmt einen String sund gibt ihn zurück sos, da sie *in Julia eine String-Verkettung durchführt. Somit ist das Endergebnis die Eingabezeichenfolge, wobei jeder Konsonant mit einem "0" dazwischen verdoppelt wird.

Beispiele:

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"

Beachten Sie, dass dies 9 Byte länger ist, wenn das Ergebnis gedruckt und nicht zurückgegeben werden muss. Warten auf Bestätigung vom OP.


Edit: 2 Bytes gespart dank Martin Büttner!


3

Haskell, 81 Bytes

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

Verwendung: f "Hello there!"-> "HoHelollolo tothoherore!".

Ich kann die Liste der Konsonanten nicht ohne teure imports klug konstruieren . Selbst wenn Sie den Buchstaben auf Kleinbuchstaben drehen, werden mehr Bytes benötigt, als nur die Konsonanten in Groß- und Kleinbuchstaben aufzulisten.



2

Perl, 33 Bytes

Diese Antwort ist meistens nur für reguläre Ausdrücke bestimmt, mit einer kleinen Menge zusätzlichen Codes für die Ausführung von E / A.

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

Es ist schon eine Weile her, dass ich Perl-Regexes verwendet habe, daher kann dies wahrscheinlich verbessert werden.

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

Passen [^aeiou]å und andere Nicht-ASCII-Vokale nicht mehr zusammen?
Alex A.

@AlexA. Ich habe das Problem bereits bemerkt. Es war ein Null-Zeichen - fix ( \szu \W).
PhiNotPi

+1, die ausführlichste Erklärung für Perl-Code, die ich auf dieser Site gesehen habe.
Zgarb

2

C (ideone.com-Version) - 133

Ok, das ist riesig. Aber C hat keine regulären Ausdrücke. Bitte sag mir, wenn du etwas siehst, das es kürzer machen kann ...

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

Wie wird die lokale Variable cdeklariert?
WJL

Globale @ wjl-Variablen in C werden mit Null initialisiert. Lokale Variablen befinden sich auf dem Stapel und werden nicht initialisiert. Siehe stackoverflow.com/questions/3553559/…. Variablen ohne den Standardtyp int und da printf mit Zeichen arbeitet, kann der Code Endian-Probleme haben - ich werde es morgen überprüfen.
Jerry Jeremiah

Ja, ich verstehe die Standardinitialisierung. Ich wollte nur darauf hinweisen, dass dieser Code nicht kompiliert cwird , da er überhaupt nicht deklariert ist , z out.c:2:18: error: ‘c’ undeclared (first use in this function).
wjl

@wjl Ich denke, es hängt vom Compiler ab. Es wird unter ideone.com ideone.com/s7M5mZ kompiliert und ausgeführt, wenn Sie sich für C entscheiden. Gibt es eine Idee, worin der Unterschied besteht?
Jerry Jeremiah

Sieht aus wie ein Fehler im Compiler von ideone. Wenn Sie den Zeilenumbruch zwischen c[2];main(erforderlich, da er #definenicht mit einem Semikolon endet) korrigieren, werden GCC ähnliche Fehler angezeigt. Wie auch immer, keine große Sache, es ist immer noch ein lustiger Code-Golf, aber Sie brauchen vielleicht noch ein paar Zeichen, um dieses gültige C zu machen. =)
wjl

2

Windows Batch, 235 Bytes

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

Verwendung:

script.bat hello

Ausgabe:

hohelollolo

Sie fragen sich vielleicht, warum ich d nicht auf "aoui" gesetzt habe. Wenn Sie nach Ungleichheiten suchen, müssen Sie aus einer Schleife ausbrechen. Nicht alles, was funktionieren sollte, funktioniert im Batch. Das Skript verarbeitet 1 Wort Zeichen [so wie sie auf Ihrer Tastatur erscheinen]. Alle Leerzeichen und Zeilenumbrüche, die noch vorhanden sind, sind für die Ausführung des Skripts erforderlich.

Windows XP oder höher erforderlich. Nicht in Windows 8 und höher getestet.


2

PowerShell - 35 Byte

Nur um zu zeigen, dass PowerShell auch hier mithalten kann, und mit dem Regex, der Martin Büttners Retina-Antwort schamlos gestohlen wurde:

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

akzeptiert Zeichenketteneingaben von stdin


1

Pyth - 28 Bytes

Dies funktioniert auf offensichtliche Weise, indem die Konsonantenliste im laufenden Betrieb unter Verwendung der eingestellten Differenz generiert wird.

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

Erklärung folgt in Kürze.

Probieren Sie es hier aus .


Sie können 4 Bits sparen, indem Sie 4 Zeichen entfernen und ein Zeichen durch ein anderes ersetzen.
Jakube,



1

Python, 61

Ich konnte keine Zeichenklassenvereinigung oder -subtraktion zum Laufen bringen, und deshalb glaube ich nicht, dass Python über diese Funktion verfügt. Ich musste stattdessen einen negativen Lookahead verwenden.

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

Führen Sie es hier aus: http://repl.it/fQ5

Link zur Umkehrung: /codegolf//a/48182/34718


1

K, 38 Zeichen

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 Bytes

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

Eine einfache Lösung scheint ziemlich wettbewerbsfähig zu sein, da K keine regulären Ausdrücke hat. Wählen Sie zwischen dem "XoX" -Formular und dem "X" -Formular basierend darauf, ob jedes Zeichen in einer Nachschlagetabelle ignorierter Vokale gefunden wurde, und fügen Sie die resultierenden Listen hinzu.

Sie können es in Ihrem Browser mit OK versuchen :

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

(Leider kann ich keinen anklickbaren Link bereitstellen, da der Stapelüberlauf keine Zeichen mit Akzent in URLs zulässt.)


0

Golfscript, 35 Bytes

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

Erwartet, dass sich die Eingabe auf dem Stapel befindet. Mit Eingabe (50 Bytes):

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

Arbeitet mit den schwedischen Vokalen å, ä und ö.


2
Eingang ist immer auf dem Stapel auf GS
Optimizer

0

Sed (in der Befehlszeile), 28 Byte

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

Leiten Sie den Text entweder weiter oder geben Sie ihn direkt ein. Allein der sed-Code ist 22 Byte groß.


3
Dies dupliziert auch Leerzeichen und Zeichen wie ä.
ProgramFOX

0

R 45 Zeichen

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

Einfacher Regex. Liest von stdin. i=Tsteht für ignore.case=TRUE(dank teilweiser Übereinstimmung der Argumentnamen), wodurch die gsubGroß- und Kleinschreibung unwichtig wird.

Verwendung:

> 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

<> <(Fisch), 64 Bytes

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

Es ist nicht die kürzeste Antwort, aber ich genieße die Herausforderung, in <> <zu programmieren

Probieren Sie es hier aus


0

Golflua, 36 Bytes

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

Einfache Mustererkennung: nimm stdin, finde dann die Nicht-Vokale ( %Wkümmert sich um nicht-alphanumerische Zeichen) und füge ein ozwischen die beiden Ersetzungen. Leider wird bei all diesen Schreibvorgängen w(I.r():g(....))auch die Anzahl der Einfügungen ausgegeben, obwohl 3 Zeichen gespart wurden. Ein Lua-Äquivalent wäre

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

0

REXX, 107 Bytes

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

Vielen Dank an @Masterzagh für die Einsparung von Funktionssyntax.

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

JavaScript 62

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

Ihre Funktion kann in Form einer anonymen Pfeilfunktion erfolgen x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&"). Pfeilfunktionen funktionieren so name=(arg1, arg2)=>{code}. ()werden nicht benötigt, wenn es nur ein Argument gibt, und {}werden nicht benötigt, wenn es nur eine Codezeile gibt. Return wird auch nicht benötigt, wenn die eine Zeile etwas zurückgibt.

Und ich habe vergessen zu sagen. Sie müssen ihm keinen Namen geben, um das Problem zu lösen, bei dem Sie lediglich aufgefordert wurden, eine Funktion zu erstellen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.