Parole da spatola


50

Con due parole, rovesciatele cambiando i loro gruppi di consonanti iniziali. Vince il minor numero di byte.

plaster man -> master plan
blushing crow -> crushing blow
litigating more -> mitigating lore
strong wrangler -> wrong strangler
def ghi -> ghef di
few years -> yew fears

Le consonanti che appaiono prima della prima vocale ( aeiou) vengono scambiate.

Input: due stringhe minuscole che iniziano con consonanti diverse e contengono ciascuna una vocale aeiou.

Output: le due stringhe spatolate, nell'ordine giusto.

Per input e / o output, le due stringhe possono anche essere in un elenco o simili, oppure come una singola stringa con separatore.


Questo è quasi un duplicato di questa vecchia domanda , ma spero di scrivere una specifica che sia più chiara e più stabile in modo che quella vecchia possa essere chiusa come una copia .


4
Le parole iniziano con le consonanti.
xnor

21
La risposta dovrebbe essere "oozing snotter"imo ~
Patrick Roberts

3
@PatrickRoberts Sono d'accordo, ma questo rende la sfida un po 'più semplice.
xnor

1
Non molto sull'argomento, ma un bell'esempio di fiocco di neve -> flow snake
flawr

1
le fortune veloci e gli zigoli non possono partecipare
Denham Coote,

Risposte:


50

Vim, 18 battute

/[aeiou]<CR>dbwvnhp0P

Il trucco cruciale è che incollare qualcosa in modalità Visual mette effettivamente i vecchi contenuti della selezione visiva nel buffer di incollaggio.


... oh, duh, non ci ho pensato. Continuava a essere respinto vessendo inclusivo e cercando di selezionare dalla vocale indietro.
Maniglia della porta

10
Come utente casuale di VIM, rimasi stupito mentre scrivevo ogni comando successivo
Aaron

4
<CR> significa ritorno a capo (vecchio termine della macchina da scrivere!), Noto anche come Enter
Kai Carver

22

brainfuck, 238 207 byte

,[[<+<+>>-]++++[<-------->-]-[<<-->>-----]<<+++++[----[----[------[------>>]]]]>[>>]>,]<<++++++++[<[++++<<]<++++<[++++<<]>>[>>]>>[>>]<-]<[<<]-[<+>---]>[>.>]<[<<]<<[<<]>[>>]>[.>>]<.<[<<]>[>.>]>[>>]>[>>]>[.>>]

Richiede ,di restituire 0 su EOF, celle a capo a 8 bit e la possibilità di spostarsi a sinistra dalla cella 0. Nella mia esperienza, queste sono le impostazioni predefinite più comuni.

Sono abbastanza contento di questo. Il mio primo tentativo è stato di 314 byte e questo è sicuramente un miglioramento. :)

Funziona memorizzando ogni byte dall'input in due celle; uno con il valore effettivo del byte e l'altro con l'output del codice seguente quando indicato (il valore del byte - 97):

[
    ----
    [
        ----
        [
            ------
            [
                ------>>
            ]
        ]
    ]
]

Se il personaggio è una consonante, ne esce con un valore diverso da zero. Se è una vocale, diventa 0. Da lì è solo una questione di trovare dove inizia la seconda parola e stampare tutto in ordine.

La versione a 238 byte di questo programma ha trovato il carattere spazio dopo aver raccolto tutti gli input. Era un mal di testa perché farlo comportava la creazione di una cella che conteneva 0 proprio nel punto in cui stavo cercando di passarci sopra. Il modo in cui ho risolto ha avuto l'effetto di sottrarre 30 da ogni personaggio nella prima parola e 32 da ogni personaggio successivo. Una parte abbastanza grande del codice era dedicata alla gestione di queste sciocchezze.

Ora, 32 viene sottratto da ogni personaggio nel ciclo di input, che è più breve e ha un effetto collaterale simile che è più facile da gestire. Come bonus, farlo in questo modo mi ha permesso di creare il mio personaggio spaziale in un modo più breve: invece di sottrarre 139 da 171 (171 è quello che ottieni quando corri uno spazio attraverso il rilevatore di vocali sopra), il ciclo che aggiunge 32 ad ogni personaggio fa di tutto per aggiungere anche 32 alla cella 171. Questo costa quattro byte lì, ma significa che posso sottrarre 171 da esso in seguito (invece di sottrarre 139) per un totale netto di 3 byte salvati.

Con commenti:

For every input character
,[

  Make a copy
  [<+<+>>-]

  Subtract 32 from one
  ++++[<-------->-]

  Subtract 97 from the other
  -[<<-->>-----]<<+++++

  If nonzero:
  [

    Subtract 4
    ----

    If nonzero:
    [

      Subtract 4
      ----

      If nonzero:
      [

        Subtract 6
        ------

        If nonzero:
        [

          Subtract 6
          ------>>

        ]

      ]

    ]

  ]

>[>>]>,]

Add 32 to every character and the 171 that the space left behind
<<++++++++[<[++++<<]<++++<[++++<<]>>[>>]>>[>>]<-]

Go to the space
<[<<]

Subtract 171 from (32 plus 171)
-[<+>---]

~~~~~~~~~~~~~~~

Ready to print!

~~~~~~~~~~~~~~~

Print letters from the second word until the value to the left is zero
>[>.>]

Go to the beginning of the first word
<[<<]<<[<<]

Look at cells to the left of letters in the first word until reaching a zero
>[>>]

Print the rest of the letters in the first word
>[.>>]

Print a space
<.

Go to the beginning of the first word
<[<<]

Print letters from the first word until the value to the left is zero
>[>.>]

Go to the beginning of the second word
>[>>]

Look at cells to the left of letters in the second word until reaching a zero
>[>>]

Print the rest of the letters in the second word
>[.>>]

Questo conta ycome una vocale, ma la domanda dice che non lo è. ( nye cat-> ce nyat)
Loovjo

1
@Loovjo è davvero strano, perché il codice che controlla le vocali tratta sicuramente yuna consonante ... Vedrò perché lo sta facendo.
undergroundmonorail

17

vim, 23

/[aeiou]<cr>"xd0wndb0Pw"xP

Mi chiedo se vim sia effettivamente competitivo in questa sfida. Probabilmente non con le lingue del golf, ma forse con Ruby / Python / Perl / ecc.

/[aeiou]<cr>  Find the first vowel
"xd0          "Delete" (cut), to register "x, everything from here to BOL
w             Go to next word
n             Find next vowel
db            "Delete back" - delete from here to the beginning of the word
0             Go to BOL
P             Paste what we just "deleted" (cut) behind the cursor
w             Next word
"xP           Paste backwards from register "x

11
Lo faccio in modalità Inserisci, giusto?
Alex A.

5
@AlexA. ಠ_ಠ
Maniglia

@AlexA. La modalità di
inserimento

@AlexA. Inserisci modalità? Intendevi inserire comando?
Blacklight Shining

1
@BlacklightShining No. Era uno scherzo perché se sei in modalità insert e digiti quella roba, non eseguirà alcun comando; l'avrai appena digitato in un file.
Alex A.

13

Python, 68 63 60 byte

import re
lambda s:re.sub('([^aeiou]+|.+ )'*3,r'\3\2\1',s,1)

Provalo online su Ideone .

Come funziona

La stringa del motivo viene ripetuta tre volte ( *3), risultando nel motivo

([^aeiou]+|.+ )([^aeiou]+|.+ )([^aeiou]+|.+ )

Tutte le istanze corrisponderanno a una stringa non vuota di non vocali oppure a una stringa non vuota seguita da un singolo carattere spazio.

La prima istanza corrisponderà alle consonanti all'inizio della prima parola. Poiché +è avido, tenterà di abbinare il maggior numero possibile, vale a dire, tutto fino alla prima vocale.

Per questo motivo, la seconda istanza inizierà in una vocale, quindi corrisponderà al resto della prima parola, fino allo spazio incluso che separa le parole.

Analogamente alla prima istanza, la terza corrisponderà a tutte le consonanti all'inizio della seconda parola, risultando in una corrispondenza corretta per l'intero modello.

La stringa non elaborata \3\2\1( rimpedisce a Python di sostituire \3ecc. Con caratteri di controllo) inverte l'ordine delle corrispondenze dei motivi tra parentesi, ovvero le sostituisce con le consonanti all'inizio della seconda parola, quindi tutti i caratteri della prima vocale della prima parola fino allo spazio, e infine le consonanti all'inizio della prima parola.

L'argomento finale di sub( 1) lo fa restituire immediatamente dopo la prima sostituzione riuscita, per evitare sostituzioni senza senso nel resto della seconda parola. Ciò è necessario poiché il modello può corrispondere a qualsiasi stringa di tre o più consonanti consecutive.


1
Complimenti per la generosità, per aver portato la magia regex su Python con una regex molto efficiente. Bella spiegazione anche.
xnor

11

JavaScript (ES6), 54 byte

s=>s.replace(r=/\b[^aeiou ]+/g,(_,i)=>s.match(r)[+!i])

Spiegazione

s=>
  s.replace(
    r=/\b[^aeiou ]+/g,     // r = regex to match consonants
    (_,i)=>s.match(r)[+!i] // replace consonants with the consonants from the other word
  )

Test

var solution = s=>s.replace(r=/\b[^aeiou ]+/g,(_,i)=>s.match(r)[+!i])
<input type="text" id="input" value="plaster man" />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


Oh mio Dio, ho capito male. Dare un'occhiata ai documenti mdn per matchquando torno a casa
Patrick Roberts,

Il +!itrucco è una bella soluzione. +1
ETHproductions

10

Python 3, 108 101 99 byte

(Nessun uso di regex)

Questa funzione prevede input tramite 2 argomenti, ad es f('blushing','crow'). Restituisce le nuove parole in una tupla.

S=lambda s,p="":s[0]in"aeiou"and(p,s)or S(s[1:],p+s[0])
def f(x,y):a,b=S(x);c,d=S(y);return c+b,a+d

Ci sono molte soluzioni regex, quindi volevo scrivere qualcosa che non usasse la libreria di Python.

Come funziona

L'unica parte complicata è l'espressione lambda S(l'abbreviazione significa " S plit prima della prima vocale"). Ricorre in modo ricorsivo alla parola data, spostando un carattere alla volta dall'inizio di s(che inizia con l'intera parola) alla fine di p(che inizia a vuoto). Alla prima vocale incontrata ritorna (p,s), cioè (prefisso, suffisso). Si noti che è un ordine sbagliato rispetto ai parametri!

Ho pensato che avesse più senso che l'ordine restituito fosse prefisso, quindi suffisso (perché generalmente un prefisso precede un suffisso). Questo ordine potrebbe rendere il a,b=S(x)codice leggermente più semplice da leggere.

Ma non avevo scelta dell'ordine nei parametri della lambda, quindi non potevo definire pprima s. Il primo parametro, s, doveva prendere l'intera parola, perché pha avuto un valore di default, e parametri di default andare scorso. In questo modo, non avevo bisogno di chiamare la funzione Scon una stringa vuota due volte e alcuni byte potevano essere salvati. Tuttavia, forse è stata semplicemente una cattiva decisione di restituire prefisso / suffisso nell'ordine opposto in quanto è stato utilizzato nell'espressione lambda.

Per quanto riguarda la scelta dell'espressione lambda rispetto alla funzione, ci vogliono più byte per dire def S(s,p=""):returndi S=lambda s,p="":. Posso fare questa scelta perché Python ha una valutazione del corto circuito e l'operatore ternario. Tuttavia, non posso spiegare adeguatamente come ho usato i cortocircuiti; è difficile ragionare su.


Questa è la mia prima risposta Spero di averlo fatto correttamente e che sia utile pubblicare una soluzione che non può vincere.

Modifiche: commentatori di ringraziamento: ridotto il conteggio dei byte un po ', due volte e rimosso informazioni non necessarie. Tentativo di migliorare la scrittura. Spero non abbia fatto errori.


benvenuti in ppcg, ottima prima risposta :) solo grazie, la maggior parte dei programmi su questo sito non ha una nuova riga finale, quindi non è necessario menzionarlo (nei rari casi in cui è necessario, è quando la gente lo menziona)
undergroundmonorail,

3
Benvenuto in Programmazione di puzzle e codice golf! 1. Non devi preoccuparti del formato di input. La sfida dice esplicitamente che puoi prendere un elenco. 2. In base alle impostazioni predefinite menzionate nel tag wiki , è possibile inviare programmi completi o funzioni per codificare le sfide del golf. Per questo particolare problema, una funzione dovrebbe essere più corta di 7 byte.
Dennis,

4
Per quanto riguarda l'ultima frase, "Spero [...] che sia utile pubblicare una soluzione che non possa vincere". Certamente c'è! Siamo tutti qui per divertirci, contribuire e imparare gli uni dagli altri. Trovo questa risposta particolarmente intelligente in quanto la soluzione più ovvia è usare espressioni regolari. Ottimo lavoro!
Alex A.

Un'eccellente prima risposta. È abbastanza simile a quello che mi è venuto in mente per non regex. Hai avuto una buona idea sull'uso delle espressioni logiche in corto circuito e si scopre che possono accorciare l'espressione, anche se forse ti piacerebbe pensare a te stesso su come farlo.
xnor

Mi piace molto il fatto che tu abbia usato una soluzione ricorsiva. Realizzato in modo molto elegante!
Ogaday,

9

C # 6, 115 byte

string S(string a)=>System.Text.RegularExpressions.Regex.Replace(a,"([^aeiou]*)(.*) ([^aeiou]*)(.*)","$3$2 $1$4");

È solo un dolore lo spazio dei nomi per regex è così lungo.


2
Mio Dio che è prolisso.
Conor O'Brien,

4
System.Text.RegularExpressions.Regex.Replace44 personaggi! +1 perché deve essere una specie di record.
Level River St

2
... e ora hai 44 problemi. ;)
Mason Wheeler,

9

CJam, 27 24 22 byte

2{l_{"aeiou"&}#/(N\}*o

L'I / O è una parola per riga. Provalo online!

Come funziona

2{                 }*   Do the following twice:
  l                       Read a line from STDIN.
   _                      Push a copy.
    {"aeiou"&}#           Find the index of the first character that has a non-
                          empty intersection with the string "aeiou".
               /          Split the string into chunks of that size.
                (         Shift out the first chunk, i.e., all leading consonants.
                 N\       Swap the shifted out chunk with a linefeed.
                     o  Print the topmost stack item.



8

JavaScript ES6, 93 58 52 byte

6 byte salvati grazie a ETHProductions!

x=>x.replace(/([^aeiou]+)(.+ )([^aeiou]+)/,"$3$2$1")

Provalo! (Solo ES6)


Stavo per fare clic su
Pubblica

@ user81655 Oh, scusa se è successo così.
Conor O'Brien,

Non hai bisogno del quarto gruppo di cattura o del $4tutto;)
ETHproductions

@ETHproductions Oh, sì! Grazie!
Conor O'Brien,

7

C, 255 201 199 byte

Non vedo molte risposte in C qui, quindi divertiti; Inoltre, per la prima volta golf, suggerimenti e critiche sono i benvenuti.

#define S(w,p)p=strpbrk(w,"aeiou")-w
#define c ;strcpy(r
#define l c+strlen(v[1])+b+1
main(int q,char**v){char r[64],S(v[1],a),S(v[2],b)c,v[2])c+b,v[1]+a);strcat(r," ")l-a,v[1])l,v[2]+b);puts(r);}

Se main () non è necessario, possiamo salvare 24 byte, arrivando a 179 byte

#define S(w,p)p=strpbrk(w,"aeiou")-w
#define c ;strcpy(r
#define l c+strlen(x)+b+1
s(char*x,char*y){char r[64],S(x,a),S(y,b)c,y)c+b, x+a);strcat(r," ")l-a,x)l,y+b);puts(r);}

Ungolfed:

void spoonerise(char* w1, char* w2)
{
    char rt[64];

    int p1 = strpbrk(w1, "aeiou")-w1;
    int p2 = strpbrk(w2, "aeiou")-w2;

    strcpy(rt, w2);
    strcpy(rt+p2, w1+p1);

    strcat(rt, " ");

    strcpy(rt+strlen(w1)+p2+1-p1, w1);
    strcpy(rt+strlen(w1)+p2+1, w2+p2);

    puts(rt);
}

EDIT: grazie al suggerimento di feersum ho salvato 54 byte. = D


Consiglio di esaminare strpbrk.
feersum

+1 Questa è un'ottima prima risposta. Benvenuti nel sito.
wizzwizz4,

Grazie per la raccomandazione @feersum. E grazie per l'accoglienza @ wizzwizz4!
Lince Assassino,

6

Python 2, 364 352 269 251 byte

EDIT: Grazie mille a @Cyoce per avermi aiutato a golf 83 byte!

Per favore, aiutami a giocare a golf! Comunque, almeno io sono il primo risponditore di Python. E spero di poter battere Java, se mai c'è una risposta Java!

i=input()
f=l=''
A='aeiou'
for j in A:
 I=i[0];J=I.find(j)
 if ~J:
  if f:
   if f>I[0][:J]:f=I[:J];break
  else:f=I[:J]
for j in A:
 Y=i[1];J=Y.find(j)
 if ~J:
  if l:
   if l>Y[:J]:l=Y[:J];break
  else:l=Y[:J]
print I.replace(f,l,1),Y.replace(l,f,1)

Provalo qui


5
-1 per non aver tentato di giocare a golf oltre le variabili a carattere singolo
Mego

@Mego prometto che ci sto lavorando al più presto. Proprio adesso. Ma sto lavorando a una versione regex.
TanMath,

@Mego, vedi modifica.
TanMath,

5

Japt, 26 25 byte

Fortunatamente, ho aggiunto una classe vocale alle caratteristiche regex di Japt qualche giorno fa. Sfortunatamente, non ho aggiunto una classe non vocale o un modo per aggirare le doppie barre rovesciate nelle stringhe regex.

#¿s4 £Uf"[^\\v]+|.+
?" gX

Il ¿dovrebbe essere il char grezzo U + 0093. L'input è una stringa a più righe, una parola / riga. Provalo online!

EDIT: ora ho aggiunto la classe non vocale \Ve un modo per aggirare \\(con %), quindi questo codice ora funziona per 21 byte : ( Provalo online )

#¿s4 £Uf"%V+|.+
?" gX

Come funziona

                     // Implicit: U = input string
#¿s4                 // Convert the char code (147) into a base-4 string "2103".
     £               // Map each char X in this string to:
      Uf"[^\\v]+|.+  //  Match each group in U of non-vowels or non-newlines,
?"                   //  with an optional trailing newline.
   gX                //  Get the item at position X in the resulting array.
                     // Implicit: output last expression

Vecchia versione (26 byte):

UrA="\\b[^\\v ]+"@UfA gÂ!Y

Provalo online!

Come funziona

UrA="\\b[^\\v ]+"@UfA gÂ!Y  // Implicit: U = input string
  A="\\b[^\\v ]+"           // Set variable A to this regex string, which matches
                            // a word boundary followed by one or more non-vowels.
UrA              @          // Take U and replace each match X of A and its index Y with:
                  UfA       //  Take U.match(A).
                      gÂ!Y  //  Get the item at index ~~!Y (converts 0 to 1, anything else to 0).
                            // Implicit: output last expression

Vorrei che le lingue tradizionali avessero una meta vocale per regex!
CJ Dennis,

4

Python 3, 100 (o 99) byte

import re
def f(*g):a,b=[re.split("[aeiou]",r)[0] for r in g];return b+g[0][len(a):],a+g[1][len(b):]

Giocato con alcune versioni ma non riesco a trovarlo qui sotto. Può ridurlo di 99 byte usando def f(g)invece in modo da prendere un elenco di stringhe piuttosto che due stringhe separate, ma preferisco il roue arg due.

L'alternativa è uguale lunghezza:

import re
s=re.split
def f(x,y):v="[aeiou]";a,b=s(v,x)[0],s(v,y)[0];return b+x[len(a):],a+y[len(b):]

Ho provato a sostituire, come usa @TanMath, ma non sono riuscito ad accorciarlo. Inoltre, TanMath può accorciare la sua risposta di un byte usando anche "[aeiou]"invece che "[aeiou]+"perché dobbiamo solo abbinare le singole istanze. Infine, l'implementazione di input()sembra essere cambiata tra py2 e py3 - valuta automaticamente lo stdin come una stringa.


1
Presumibilmente intendi s=re.splitin alternativa?
xnor

Sì! Decisamente. Questa è la prima volta che gioco a golf, quindi ogni feedback e consiglio è apprezzato.
Ogaday,

1
1. La domanda consente esplicitamente di prendere le due stringhe come un elenco, quindi non sembra esserci una buona ragione per l' *in *g. 2. La seconda versione può essere giocata a golf fino a lambda x,y,s=lambda s:re.split("[aeiou]",s)[0]:(s(y)+x[len(s(x)):],s(x)+y[len(s(y)):]).
Dennis,

Grazie @Dennis, funziona davvero, bel refactoring. Interessante che siano necessarie le parentesi, e non è necessario passare s come arg alla seconda lambda, vero? Questa soluzione mi dà 98 byte, con una dichiarazione di importazione principale e f=.
Ogaday,

1
No, sè un argomento predefinito, quindi non è necessario specificarlo. Una lambda senza nome è una proposta accettabile; f=non è richiesto.
Dennis,

4

sed, 38 caratteri

s/([^aeiou]+)(.+ )([^aeiou]+)/\3\2\1/

Utilizzo dell'espressione regolare estesa dalla soluzione Retina .

Quanto sopra è lungo 37 caratteri e richiede l' -ropzione (+1 carattere).

Esempio:

$ cat input | tee /dev/tty | sed -r 's/([^aeiou]+)(.+ )([^aeiou]+)/\3\2\1/'
plaster man
blushing crow
litigating more
strong wrangler
def ghi
master plan
crushing blow
mitigating lore
wrong strangler
ghef di

Benvenuto in Programmazione di puzzle e codice golf!
Dennis,

3

C # 6, 165 byte

string S(string a,string b){int i=V(a),j=V(b);return b.Remove(j)+a.Substring(i)+" "+a.Remove(i)+b.Substring(j);}int V(string s)=>s.IndexOfAny("aeiou".ToCharArray());

Allargato:

string S(string a,string b){
    int i=V(a),
        j=V(b);
    return b.Remove(j)+a.Substring(i)+" "+a.Remove(i)+b.Substring(j);
}
int V(string s)=>s.IndexOfAny("aeiou".ToCharArray());

Questo è piuttosto vecchio, ma "aeiou".ToCharArray()può essere 'a','e','i','o','u'per -2 byte
Incarnazione dell'ignoranza il

No, @EmbodimentofIgnorance, IndexOfAnynon ci vogliono parametri, quindi dovrebbe esserenew[]{'a','e','i','o','u'}
Hand-E-Food

Ah, errore mio, pensavo IndexOfAnyfosse un metodo params. Comunque, ottima risposta
Incarnazione dell'ignoranza

3

𝔼𝕊𝕄𝕚𝕟, 24 caratteri / 42 byte

ïē/⟮(⁅ᶌ]+)⟯(.+ )Ⅰ/,`⑶⑵⑴`

Try it here (Firefox only).

Se hai bisogno di aiuto per capirlo, questo si traduce in ES6 come

input.replace(/([^aeiou]+)(.+ )([^aeiou]+)/g,'$3$2$1')

In che lingua è? Ricevo anche personaggi da box.
Jesse Williams,

@JesseWilliams Si chiama ESMin .
ETHproductions

Sarebbe bello se l'interperatore avesse qualcosa come Japt in cui ti mostra il js che diventa
Utente generico

JS compilato viene registrato nella console JS quando viene eseguito il codice.
Mama Fun Roll

3

PowerShell, 52 byte

"$args "-replace('(.*?)([aeiou]\S+) '*2),'$3$2 $1$4'

e.g. 
PS C:\scripts\> .\Spoonerise.ps1 'blushing crow'
crushing blow

È un regex sostitutivo con quattro gruppi di acquisizione; con:

  • Moltiplicazione delle stringhe da espandere:
    • ('(.*?)([aeiou]\S+) '*2) per '(.*?)([aeiou]\S+) (.*?)([aeiou]\S+) '
  • La "$args "forze args in una stringa, e aggiunge uno spazio finale così lo spazio finale nel regex non romperlo.

3

JavaScript (ES6), 120 107 102 101 99 92 byte

  • Grazie downgoat!

Ciò tiene conto se i parametri fossero un oggetto come questo, e indietro:
var a = {x: "man", y:"plaster"]}

a.b=(e=>e.slice(e.search`[aeiou]`));with(a){c=b(x),d=b(y),x=x.replace(c,d);y=y.replace(d,c)}

.match(/[aeiou]/).indexpuò diventare:.search`[aeiou]`
Downgoat il

3

Python, 129 108 105 109 byte

Questo programma contiene un elenco di parole come questa ["master","plan"]

EDIT : Grazie @Volatility

EDIT: ora usando re.split

import re
a=re.split
c='[aeiou]+'
i,j=input()
f=a(c,i)[0]
l=a(c,j)[0]
print i.replace(f,l,1),j.replace(l,f,1)

Questa risposta usa regex come la maggior parte di loro.

Provalo qui


Si noti che str.replacesostituisce tutte le istanze di una sottostringa, quindi si desidera limitare a una sostituzione avendo .replace(f,l,1). Tuttavia, è possibile salvare un gruppo utilizzando i,j=input(), e rilegando re.findalle '[^aeiou]+'in variabili a singolo carattere.
Volatilità

Questo non funziona così com'è; anche due parole di una lettera ti daranno tre caratteri e stai cercando di decomprimere input()in due variabili. Intendevi i,j=input().split()(e raw_input()in Python 2)?
Blacklight Shining

1
@BlacklightShining la parola deve avere almeno una vocale e una consonante. L'input contiene un elenco delle stringhe, quindi i è la prima parola e j è la seconda.
TanMath,

@TanMath per quanto ne so che è consentito per impostazione predefinita, ma probabilmente dovresti dire nella risposta da qualche parte che è richiesto
undergroundmonorail

Questo sostituisce troppo. "sass","bit" -> "babb", "sit".
xnor

3

Java 8, 343 byte

Ecco la tua prima risposta Java. Non così esperto di golf, quindi ogni suggerimento è apprezzato!

java.util.function.Function;public class C{public static void main(String[] a){Function<String, Integer>f=s->{for(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;return 0;};int i1=f.apply(a[0]),i2=f.apply(a[1]);System.out.println(a[1].substring(0,i2)+a[0].substring(i1)+" "+a[0].substring(0,i1)+a[1].substring(i2));}}

Ungolfed:

public class SpooneriseWords {
    public static void main(String[] args)
    {       
        Function<String, Integer> f = s -> {
            for(int i = 0; i < s.length(); ++i)
                if("aeiou".contains(s.substring(i, i + 1))) 
                    return i;
            return 0;
        };

        int i1 = f.apply(args[0]);
        int i2 = f.apply(args[1]);
        System.out.println(args[1].substring(0, i2) + args[0].substring(i1));
        System.out.println(args[0].substring(0, i1) + args[1].substring(i2));
    }
}

Cosa java.util.function.Function? Dubito fortemente che debba essere lì, a meno che tu non intenda import, ma lascia cadere l'importazione perché ti riferisci ad essa solo una volta. Passare public class C{public static void Main(String[] a)ainterface C{void Main(String[]a)
cat

Function<String, Integer>non ha bisogno di spazi bianchi
cat

cambia il ciclo for da for(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;afor(int i=0;i++<s.length();if("aeiou".contains(s.substring(i,i+1))){return i;})
cat

i1è un nome terribile, troppo lungo.
cat

Cioè, cambia Function<String, Integer>in java.util.function.Function<String,Integer>e rilascia l'importazione
cat

3

Ottava, 96 byte

Grazie alle assegnazioni in linea di Octave e alla funzionalità di "indicizzazione ovunque", l'intera cosa è solo la definizione di una singola funzione anonima. Fondamentalmente, ricostruiamo la corda spatolata mentre memorizziamo i punti di taglio in ae b. Sono particolarmente soddisfatto della ffunzione inline , che trova il punto di interruzione e mi ha impedito di dover usare l'intera find(ismember(a,b),1)cosa due volte. Inoltre, nessuna regex :) .

@(p,q)[q(1:(a=(f=@(m)find(ismember(m,'aeoui'),1))(q))-1),p(b=f(q):end),32,p(1:b-1),q(a:end)];

2

TeaScript , 27 byte

xg/(\w+)(.+ )(\w+)/,"$3$2$1

\wè in realtà [^aeiou].


Aspetta, hai cambiato il \wmeta regex predefinito in [^aeiou]? Perché?
ETHproductions

@ETHproductions durante la creazione delle classi di caratteri personalizzate. Ho dimenticato che \wera già utilizzato da JavaScript. Lo cambierò presto
Downgoat,

2

Elisir ,143 117 byte

s=fn w->String.split_at(w,elem(hd(Regex.run(~r/[aeiou]/,w,return: :index)),0))end
{v,w}=s.(a)
{x,y}=s.(b)
[x<>w,v<>y]

Dividi le due stringhe (a, b) sulla prima vocale e costruisci nuove stringhe per tornare.

EDIT: ottenuto alcuni byte usando la corrispondenza del modello invece di elemchiamate goffe per ottenere i valori dalle tuple.


2

Java, 147 byte

Suppongo che anche solo una funzione vada bene.

String s(String[]i){String r="[aeiou]",f=i[0].split(r)[0],s=i[1].split(r)[0];return s+i[0].substring(f.length())+" "+f+i[1].substring(s.length());}

split(regex)purtroppo consuma il delimitatore, il che significa che devo usare substringper ottenere i suffissi.


2

Pyth, 30 28 byte

Accetta input e fornisce output come un elenco di due parole.

ACm,Kh:d"[aeiou]"3.-dKQ+V_GH

Provalo online.


Penso che tu stia cercando ACm,Kh:d"[aeiou]"3.-dKQ+V_GH. Aassegna un elenco di due elementi a G e H e Ctraspone. Potrebbe esserci qualcosa di ancora meglio.
lirtosiast

2

Python (senza regex), 85 byte

t=lambda s:s[1]in'aeiou'or-~t(s[1:])
lambda a,b:(b[:t(b)]+a[t(a):],a[:t(a)]+b[t(b):])

Esecuzione di esempio:

>>> t=lambda s:s[1]in'aeiou'or-~t(s[1:])
>>> lambda a,b:(b[:t(b)]+a[t(a):],a[:t(a)]+b[t(b):])
<function <lambda> at 0x7f495e534398>
>>> _('plaster', 'man')
('master', 'plan')

tè una funzione ricorsiva che calcola l'indice della prima vocale dopo il primo carattere nel suo argomento s. Se il secondo carattere s[1]è una vocale, valuta True, che ha intvalore 1. Altrimenti effettua una chiamata ricorsiva con il primo carattere rimosso e aggiunge 1 all'indice risultante usando -~(complemento a due del proprio complemento). Infine, i risultati di tvengono utilizzati come indici per lo slicing delle stringhe per calcolare il cucchiaio.


1

GNU Awk 4.0, 48 caratteri

split($0,a,/\<[^aeiou]+/,s)&&$0=s[2]a[2]s[1]a[3]

Esecuzione di esempio:

bash-4.3$ for s in 'plaster man' 'blushing crow' 'litigating more' 'strong wrangler' 'def ghi'; do
>     echo -n "$s -> "
>     awk 'split($0,a,/\<[^aeiou]+/,s)&&$0=s[2]a[2]s[1]a[3]' <<< "$s"
> done
plaster man -> master plan
blushing crow -> crushing blow
litigating more -> mitigating lore
strong wrangler -> wrong strangler
def ghi -> ghef di

1

PowerShell, 61 byte

"$args"-replace'([^aeiou]+)(.*)\s([^aeiou]+)(.*)','$3$2 $1$4'

Usa regex per scambiare i primi caratteri non vocali di ogni parola

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.