Converti una stringa nel suo equivalente Rövarspråket


15

Rövarspråket

Rövarspråket è un gioco di parole giocato da bambini svedesi, dai libri su Kalle Blomkvist di Astrid Lindgren.

Le regole di base sono le seguenti (da Wikipedia):

  • Ogni consonante (l'ortografia conta, non la pronuncia) viene raddoppiata e una o viene inserita nel mezzo.
  • Le vocali rimangono intatte.

Alcuni esempi:

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

Le consonanti svedesi sono le stesse di quelle inglesi, quindi il programma dovrebbe funzionare sia con voci svedesi che inglesi.

La lettera "y" è considerata consonante in questo caso, come nella maggior parte dei casi.


Il tuo compito:

Scrivi un programma per convertire una stringa di lettere svedesi, immessa attraverso una funzione o tramite stdin, nel suo equivalente Rövarspråket. Vince la risposta più breve in byte!


@ MartinBüttner Ha chiarito ulteriormente la mia domanda: dovrebbe funzionare con lo svedese (in quanto è un gioco di parole svedese).
James Williams,

Qual è il significato delle voci alfabetiche?
Ottimizzatore

@Optimizer Una stringa di soli caratteri alfabetici. Mi dispiace, l'ho scritto male, lo modificherò
James Williams il

3
Come dovremmo trattare le non lettere? Almeno gli spazi vengono visualizzati nel secondo esempio.
nimi,

2
In una nota a margine: "Y" è considerata una vocale in svedese
Leo

Risposte:


14

Retina , 14 + 5 = 19 byte

Retina è un linguaggio che è essenzialmente solo regex .NET con il minor sovraccarico possibile. Il codice per questo programma è costituito da due file:

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

Questo legge l'input su STDIN e stampa l'output su STDOUT.

Se chiami i file pattern.rgxe replacement.rpl, puoi eseguire il programma semplicemente come

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

Spiegazione

Questo è piuttosto semplice, ma vorrei comunque aggiungere qualche spiegazione (principalmente su come funziona Retina). Se Retina viene invocata con 2 file, si presume automaticamente che funzioni in "Sostituisci modalità", dove il primo file è la regex e il secondo file è il modello.

Retina può essere configurata (che include RegexOptionse altre opzioni) anteponendo regex con `e una stringa di configurazione. In questo caso lo sto solo dando, iche è il normale modificatore regex per l'insensibilità al caso.

Per quanto riguarda la regex stessa, utilizza la sottrazione della classe di caratteri .NET per far corrispondere qualsiasi consonante nell'intervallo ASCII. Il sostituto, quindi, riscrive la partita due volte con un ointervallo.


Ti manca un anella tua classe di caratteri vocalici?
Brian Gordon,

3
@BrianGordon No, sto iniziando la classe di personaggi da b, quindi non ho bisogno di sottrarre a.
Martin Ender,

2
Interessante, non ho mai visto gamme di caratteri nidificati e sottrattivi prima. È solo una cosa di .NET?
Steve Bennett,

Sento che devi contare almeno un carattere per la delimitazione tra i due file. sarebbe un punto e virgola o una nuova riga in un'altra lingua. è lo spazio tra i nomi dei file se vuoi essere pignolo su da dove proviene il personaggio in questa lingua.
Sparr,

@Sparr sì, questa è la politica ora, ma quella politica è più recente di questa sfida / risposta. Per riferimento (In effetti, se guardi i timestamp, puoi vedere che ho spinto per la politica a causa di questa risposta, ma applicare regole come quella in tutto il sito in modo retroattivo non ha molto senso.)
Martin Ender,

12

Uso di Unix KSH 27 28 32 27 byte (o 21 se contiamo solo all'interno del comando sed)

Grazie ai suggerimenti degli altri :) Apprezzato.

.. Sono arrivato a questo:

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

(consentito per spazi e personaggi svedesi)

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
Inoltre, penso che sia possibile affermare che la tua risposta è un sedprogramma, e basta contare i byte tra le virgolette singole
Digital Trauma

1
s/[^AEIOU]/&o&/igsembra funzionare .. almeno per singole parole ... dovrai escludere anche gli spazi
Digital Trauma

1
bash, anche se la shell non dovrebbe importare, purché il tuo programma sed sia tra virgolette singole
Digital Trauma

1
Anche attenzione per le vocali svedese ö, åecc - queste necessità escludendo anche. Potrebbe essere meglio usare una whitelist solo delle consonantis/[BCDFGHJ-NP-TV-Z]/&o&/ig
Digital Trauma

2
Lo renderei 'sed' e userei "s / [^ AEIOUÅÄÖ] / & o & / ig", che copre le vocali e gli spazi svedesi per 25 byte.
swstephe

7

CJam, 32 30 byte

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

Questo è un programma completo che legge da STDIN e stampa su STDOUT. Funziona con input Unicode arbitrario e tratta i seguenti 42 caratteri come consonanti:

BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz

Provalo qui.

Spiegazione

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$&")

Grazie a Masterzagh per avermi ricordato che anche una funzione sarebbe stata accettabile, e per il suo suggerimento regex riguardante i riferimenti indietro senza catturare!

Versione più lunga con input / output:

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

Visualizza una finestra di prompt per inserire la stringa, quindi mostra una finestra di dialogo contenente l'output di Rövarspråket. Il codice usa una regex per raddoppiare le consonanti e inserire os.


"Scrivi un programma per convertire una stringa di lettere svedesi, immesse attraverso una funzione o tramite stdin", Puoi farcelas=>alert(s.replace(/(?![eiou])([b-z])/gi,"$1o$1"));

E poiché non è stato chiesto di emettere, non è necessario nemmeno l'avviso.

Ancora una cosa, puoi tornare indietro senza catturare . Fondamentalmente s=>s.replace(/(?![eiou])[b-z]/gi,"$&o$&"), poiché $&significa che la corrispondenza corrente è possibile rimuovere la parentesi che cattura la tua lettera e mentre ci sei, salva un altro byte rimuovendo il punto e virgola alla fine.

@Masterzagh È fantastico, grazie ancora!
Programma FOX

4

Mathematica, 84 73 72 byte

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

Spiegazione:

  • RegularExpression@"(?i)[BCDFGHJ-NP-TV-Z]" è una regex che corrisponde a tutte le consonanti senza distinzione tra maiuscole e minuscole.
  • a:*..*:>a<>"o"<>acrea una regola ritardata per legare quelle consonanti ae sostituirla con e o circondata da se stessa.
  • Infine, StringReplace[#,*..*]&crea una funzione pura applicando quella regola a ogni lettera corrispondente nel suo argomento.

@ MartinBüttner Grazie! Ancora nuovo nel golf di Mathematica ...
LegionMammal978,

@ MartinBüttner Lo farebbe comunque, ma sono stato distratto da alcune notifiche: P
LegionMammal978

4

Julia, 46 44 byte

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

Ciò crea una funzione anonima che accetta un singolo input di stringa e stampa l'equivalente di Rövarspråket. Per chiamarlo, dagli un nome, ad es f=t->....

Qui non è stato praticato molto golf, a parte gli spazi dopo le virgole replace().

Qui stiamo usando 3 argomenti nella replace()funzione: la stringa di input, l'espressione regolare per identificare le sottostringhe e una sostituzione. Julia indica i modelli di espressione regolare di r"...". L'aggiunta ialla fine non fa distinzione tra maiuscole e minuscole. Questa regex particolare corrisponde alle consonanti. Se viene utilizzata una funzione per la sostituzione, l'output è quella funzione applicata a ciascuna sottostringa abbinata. La funzione che stiamo usando qui prende una stringa se ritorna sos, poiché *esegue la concatenazione di stringhe in Julia. Quindi il risultato finale è la stringa di input con ogni consonante raddoppiata con una "o" tra.

Esempi:

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"

Si noti che questo sarà più lungo di 9 byte se si deve stampare il risultato anziché restituirlo. In attesa di conferma dall'OP.


Modifica: salvato 2 byte grazie a Martin Büttner!


3

Haskell, 81 byte

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

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

Non posso costruire abilmente l'elenco delle consonanti senza costose import. Anche trasformare la lettera in lettere minuscole richiede più byte rispetto al semplice elenco delle consonanti maiuscole e minuscole.


3

Java 8, 45

Utilizzare come funzione lambda. Usa un'espressione regolare.

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

Prova qui


2

Perl, 33 byte

Questa risposta è principalmente solo regex, con una piccola quantità di codice aggiuntivo per eseguire l'I / O.

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

È da un po 'che non uso le regex del Perl, quindi probabilmente questo può essere migliorato.

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

Non [^aeiou]corrispondono ancora å e altre vocali non ASCII?
Alex A.

@AlexA. Ho già notato il problema. Era una correzione a zero caratteri ( \sa \W).
PhiNotPi

+1, la spiegazione più completa per il codice Perl che ho visto su questo sito.
Zgarb,

2

C (versione ideone.com) - 133

Ok, questo è enorme. Ma C non ha espressioni regolari. Per favore dimmi se vedi qualcosa che può renderlo più breve ...

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

Come cviene dichiarata la variabile locale ?
mercoledì

Le variabili globali di @wjl in C sono inizializzate con zero. Le variabili locali sono nello stack e non sono inizializzate. Vedi stackoverflow.com/questions/3553559/… Variabili senza un tipo predefinito di int e poiché printf funziona sui caratteri, il codice potrebbe avere problemi di endian - controllerò domani.
Jerry Jeremiah,

Sì, capisco l'inizializzazione predefinita. Stavo solo cercando di sottolineare che questo codice non viene compilato poiché cnon è stato dichiarato affatto, ad es out.c:2:18: error: ‘c’ undeclared (first use in this function).
giovedì

@wjl Immagino che dipenda dal compilatore. Compila e gira su ideone.com ideone.com/s7M5mZ quando scegli C - hai idea di quale sia la differenza?
Jerry Jeremiah,

Sembra un bug con il compilatore di ideone. Se correggi la nuova riga tra c[2];main(necessario perché #definenon termina con un punto e virgola), si ottengono errori simili a GCC. Comunque, non è un grosso problema, è ancora un divertente code-golf, ma potresti aver effettivamente bisogno di qualche altro personaggio per rendere valido questo C =)
wjl

2

Batch di 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%

Uso:

script.bat hello

Produzione:

hohelollolo

Forse ti starai chiedendo perché non ho impostato d su "aoui", per verificare se non è uguale è necessario uscire da un ciclo. Non tutto ciò che dovrebbe funzionare, funziona, in batch. Lo script gestisce 1 parola di caratteri [come appaiono sulla tastiera]. Tutti gli spazi e le nuove righe ancora presenti sono necessari per l'esecuzione dello script.

È richiesto Windows XP o versioni successive. Non testato in Windows 8 e versioni successive.


2

PowerShell - 35 byte

Solo per dimostrare che PowerShell può competere anche in questi a volte, e con la regex sottratta spudoratamente dalla risposta Retina di Martin Büttner:

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

accetta l'input di stringa da stdin


1

Pyth - 28 byte

Questo funziona in modo ovvio generando all'istante l'elenco delle consonanti usando la differenza saggia.

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

Spiegazione in arrivo.

Provalo qui .


È possibile salvare 4 bit rimuovendo 4 caratteri e sostituendo un carattere con un altro.
Jakube,



1

Python, 61

Non riuscivo a far funzionare l'unione o la sottrazione di una classe di personaggi, quindi non penso che Python abbia quella caratteristica. Ho dovuto usare un lookahead negativo invece.

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

Eseguilo qui: http://repl.it/fQ5

Link all'inverso: /codegolf//a/48182/34718


1

K, 38 caratteri

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

Una soluzione semplice sembra abbastanza competitiva dato che K manca di regex. Seleziona tra il modulo "XoX" e il modulo "X" in base al fatto che ogni carattere sia stato trovato in una tabella di ricerca di vocali ignorate e unisciti agli elenchi risultanti.

Puoi provarlo nel tuo browser usando 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

(Sfortunatamente non posso fornire un link cliccabile perché lo stack overflow non sembra consentire caratteri accentati negli URL)


0

Golfscript, 35 byte

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

Si aspetta che l'input sia nello stack. Con input (50 byte):

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

Funziona con le vovels svedesi å, ä e ö.


2
l'input è sempre in pila su GS
Optimizer il

0

Sed (sulla riga di comando), 28 byte

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

Puoi inserire il testo o inserirlo direttamente. Solo il codice sed da solo è di 22 byte.


3
Questo duplica anche spazi e caratteri come ä.
Programma FOX il

0

R, 45 caratteri

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

Regex semplice. Legge da stdin. i=Tsta per ignore.case=TRUE(grazie alla corrispondenza parziale dei nomi degli argomenti), che rendegsub maiuscole e minuscole.

Uso:

> 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

<> <(Pesce), 64 byte

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

Non è la risposta più breve ma mi piace la sfida della programmazione in <> <

Provalo qui


0

golflua, 36 byte

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

Semplice pattern-matching: prendi lo stdin, quindi trova le non vocali ( %Wsi occupa dei caratteri non alfanumerici) e inserisci una otra le due sostituzioni. Purtroppo, fare tutto questo all'interno della scrittura (cioè, w(I.r():g(....))) genera anche il conteggio degli inserimenti, sebbene abbia salvato 3 caratteri. Un equivalente di Lua sarebbe

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

Grazie a @Masterzagh per il salvataggio sulla sintassi della funzione.

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

JavaScript 62

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

La tua funzione può essere sotto forma di una funzione freccia anonima come x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&"). Le funzioni freccia funzionano in questo modo name=(arg1, arg2)=>{code}. ()non sono necessari se esiste solo un argomento e {}non sono necessari se esiste solo una riga di codice. Il ritorno non è inoltre necessario se una riga restituisce qualcosa.

E ho dimenticato di dire. Non è necessario assegnargli un nome per risolvere il problema che richiede solo di creare una funzione.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.