Sfida di sostituzione delle lettere


17

L'idea è semplice Devi creare una sostituzione di lettere "visualizzata", fornendo 3 stringhe (l'input può essere separato da virgola, input separati o come un array). Il primo segmento è la parola che vuoi correggere, e il secondo segmento sono le lettere che vuoi sostituire, e il terzo segmento è la sostituzione delle lettere nel segmento 2.

Per esempio:

|    | Input                       | Starting Word | Output      |
|----|-----------------------------|---------------|-------------|
| #1 | Hello world -wo -ld +Ea +th | Hello world   | Hello Earth |
| #2 | Hello World -wo -ld +Ea +th | Hello World   | Hello Worth |
| #3 | Hello -llo +y               | Hello         | Hey         |
| #4 | Red -R -d +Gr +en           | Red           | Green       |
| #5 | mississippi -is -i +lz +p   | mississippi   | mlzslzspppp |
| #6 | Football -o -a +a +i        | Football      | Fiitbill    |
| #7 | mississippi -is -i +iz +p   | mississippi   | mpzspzspppp |

Spiegazione

Le sostituzioni devono essere eseguite passo dopo passo con le rispettive coppie. Ecco un'illustrazione con un input di mississippi -is -i +iz +pper dare l'output mpzspzsppp(vedi esempio #7sopra)

| Step  | Input                         | Output        |
|------ |---------------------------    |-------------  |
| #1    | mississippi -is -i +iz +p     |               |
| #2    | mississippi -is +iz           | mizsizsippi   |
| #3    | mizsizsippi -i +p             | mpzspzspppp   |

Regole

  • Gli input sono sempre in questo ordine <starting_string> <list_of_letters_to_replace> <replacement_letters>.
  • Le lettere per sostituire e sostituire i gruppi non saranno mai mescolate (cioè: non ci saranno mai -a +i -e +o).
  • Le lettere da sostituire hanno sempre il prefisso -e le lettere di sostituzione hanno sempre il prefisso +. (Il prefisso è obbligatorio)
  • Potrebbe esserci più di un set di lettere da sostituire, quindi dovresti guardare il prefisso.
  • Supponiamo che la quantità di gruppi di lettere da sostituire e la quantità di gruppi di lettere sostitutive siano sempre uguali (cioè: non ci sarà mai -a -e +i)
  • Le sostituzioni fanno distinzione tra maiuscole e minuscole (vedi esempio #1e #2).
  • Le sostituzioni vengono eseguite nell'ordine in cui sono state fornite nell'input.
  • Le sostituzioni di lettere possono essere sostituite con altre sostituzioni. Vedere l'esempio #6.
  • Il primo segmento (parola iniziale) non includerà mai caratteri -o +.
  • Questo è code-golf, quindi i byte più corti vincono.

Classifiche

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

# Perl, 43 + 2 (-p flag) = 45 bytes

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=96473,OVERRIDE_USER=38505;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


1
Date le regole 2 e 5, non è necessario guardare il prefisso. Con n input, input 0 è la stringa di base, gli input da 1 a int (n / 2) sono letter to replace(con prefisso -) e gli input int (n / 2) da +1 a n-1 sono replacement(con prefisso +)
edc65,

@ edc65 vero al 100%, anche se la sfida è stata progettata per avere il prefisso (e potrei fare una strana spiegazione che sono un alieno che non può elaborare sostituzioni di lettere senza il loro prefisso) ma in realtà, è solo un altro ostacolo per fermare questo essendo troppo banale - anche se guardando le risposte attuali (tutti sono fantastici a proposito) non è stata una barriera complessa. Inoltre, l'idea alla base di questa sfida è stata generata dal mio amico in una chat di Skype. Avrebbe gelloscritto male una parola ( ), e poi mi -g +havrebbe inviato le lettere sostitutive ( ) perché voleva essere fastidioso invece di inviare hello*.
ʰᵈˑ

1
Gli input sono sempre in questo ordine Perché è così restrittivo?
Luis Mendo,

@LuisMendo Immagino che non abbia molta importanza, ma è il modo in cui io e il mio amico lo abbiamo formattato, ma poiché le risposte sono state inviate a questo requisito, non posso davvero cambiare una regola. Non è stato messo in discussione sulla sandbox, quindi non l'ho considerato negativo.
ʰᵈˑ

1
@udioica ha perfettamente ragione e in effetti supporta la regola "Le sostituzioni fanno distinzione tra maiuscole e minuscole". Esegui lo snippet nella risposta JavaScript per vederlo implementato. (# 1 w orld` vs # 2 W orld)
edc65,

Risposte:


6

05AB1E , 15 17 byte

IIð¡€áIð¡€á‚øvy`:

Provalo online!

Spiegazione

I                   # read starting string
 I                  # read letters to be replaced
  ð¡                # split on space
    ۇ              # and remove "-"
      I             # read replacement letters
       ð¡           # split on space
         ۇ         # and remove "+"
           ‚ø       # zip to produce pairs of [letters to replace, replacement letters]
             vy`:   # for each pair, replace in starting string

O con un formato di input meno rigoroso

vy`:

Provalo online


6

JavaScript (ES6), 85 83 byte

f=(s,n=1,l=s.split(/ \W/))=>(r=l[n+l.length/2|0])?f(s.split(l[n]).join(r),n+1):l[0]

Casi test


5

Pyke, 13 11 byte

z[zdcmt)[.:

Provalo qui!

z           - input()
 [zdcmt)    - def func():
  zdc       -  input().split(" ")
     mt     -  map(>[1:], ^)
            - func()
        [   - func()
         .: - translate()

O 2 byte se in un formato di input diverso:

.:

Provalo qui!


Al lavoro catbus.co.uk è bloccato. Sei in grado di collegare una suite di test alternativa per favore?
ʰᵈˑ

2
@ ʰᵈˑ Non credo che la conformità alle (arbitrarie) impostazioni del firewall di lavoro sia ragionevole.
orlp,

1
@orlp - Sono d'accordo, è merda. Ma non imposto le impostazioni del firewall. Volevo solo provarlo
ʰᵈˑ

2
@hd puoi scaricare Pyke su github.com/muddyfish/pyke
Blue

4

Perl, 58 byte

57 byte codice + 1 per -p.

Richiede il primo articolo su una riga, quindi i ricambi sulla successiva. Grazie mille a @Dada che ha ideato un approccio diverso per ridurre di 4 byte!

$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee

uso

perl -pe '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee' <<< 'Football
-o -a +a +i'
Fiitbill
perl -pe '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee' <<< 'mississippi
-is -i +iz +p'
mpzspzspppp
perl -pe '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee' <<< 'mississippi
-ippi -i -mess +ee +e +tenn'
tennessee

4 byte in più, c'è perl -pE 's/(.*?) -(\S*)(.*?)\+(\S*)/"(\$1=~s%$2%$4%gr).\"$3\""/ee&&redo'. Non riesco a ottenerlo più corto, ma forse puoi :)
Dada,

1
Gotcha! 58 byte: perl -pE '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee'. (prende la corda su una riga e le "bandiere" sulla riga successiva)
Dada,

1
Eccezionale! Non sono al computer ma lo aggiornerò domani! Grazie!
Dom Hastings,

Sei sicuro di rimuovere la q {} che circonda $ 2? Non fallirebbe quando ci sono 3 - e 3 + switch? (Non posso provarlo ora, quindi forse avevi ragione quindi rimuovilo;))
Dada,

@Dada ahhh, mi chiedevo perché l'avessi aggiunto, ho testato tutti i casi nella suite di test, ma non ho pensato a una sostituzione 3 per 3 ...
Dom Hastings,

3

GNU sed 86 byte

Include +1 per -r

:;s,^([^-]*)(\w+)([^-]*-)\2( [^+]*\+)(\w*),\1\5\3\2\4\5,
t;s,-[^-+]*,,;s,\+[^-+]*,,;t

Provalo online!

Esempio:

$ echo 'Hello world -wo -ld +Ea +th'|sed -rf replace.sed
Hello Earth

3

PHP, 98 97 byte

for($s=$argv[$i=1];$v=$argv[++$i];)$r[$v[0]>'+'][]=substr($v,1);echo str_replace($r[1],$r[0],$s);

Questa sfida descrive l'esatto comportamento di str_replace, quindi per php si tratta di creare array di sostituzioni. Ho provato a farlo usando solo una "sottostringa" ma quella potrebbe non essere la soluzione migliore. Usa come:

php -r "for($s=$argv[$i=1];$v=$argv[++$i];)$r[$v[0]>'+'][]=substr($v,1);echo str_replace($r[1],$r[0],$s);" "mississippi" "-is" "-i" "+iz" "+p"

modifica: 1 byte salvato grazie a Titus


Questa è probabilmente la cosa più breve possibile. Ma $v[0]>'+'salva un byte $v[0]=='-'. Puoi anche usare ord($v)&4invece.
Tito

2

Java 7, 153 133 byte

String c(String[]a){String r=a[0],z[]=a[1].split(" ?-");for(int i=0;i<z.length;r=r.replace(z[i],a[2].split(" ?[+]")[i++]));return r;}

Codice non testato e test:

Provalo qui.

class M{
  static String c(String[] a){
    String r = a[0],
           z[] = a[1].split(" ?-");
    for(int i = 0; i < z.length; r = r.replace(z[i], a[2].split(" ?[+]")[i++]));
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(new String[]{ "Hello world", "-wo -ld", "+Ea +th" }));
    System.out.println(c(new String[]{ "Hello World", "-wo -ld", "+Ea +th" }));
    System.out.println(c(new String[]{ "Hello", "-llo", "+y" }));
    System.out.println(c(new String[]{ "Red", "-R -d", "+Gr +en" }));
    System.out.println(c(new String[]{ "mississippi", "-is -i", "+lz +p" }));
    System.out.println(c(new String[]{ "Football", "-o -a", "+a +i" }));
    System.out.println(c(new String[]{ "mississippi", "-is -i", "+iz +p" }));
  }
}

Produzione:

Hello Earth
Hello Worth
Hey
Green
mlzslzspppp
Fiitbill
mpzspzspppp

Questo funziona per l'input new String[]{'Rom Ro. Rom", "-Ro." , "+No."}? Basta scrivere qualcosa che (si spera) corrisponda a una regex sbagliata.
Roman Gräf,

@ RomanGräf Sì, funziona e produce Rom No. Rom . A proposito, puoi provarlo tu stesso facendo clic sul Try it here.link nel post e poi fork. :)
Kevin Cruijssen,

Lo so ma sono attualmente sul mio cellulare. :(
Roman Gräf,

2

PHP, 164 byte

preg_match_all("#^[^-+]+|-[\S]+|[+][\S]+#",$argv[1],$t);for($s=($a=$t[0])[0];++$i<$c=count($a)/2;)$s=str_replace(trim($a[+$i],"-"),trim($a[$i+$c^0],"+"),$s);echo$s;

2

Vim, 25 byte

qq+dE+r-PdiW:1s<C-R>"-g<CR>@qq@q

Presuppone l'input in questo formato:

mississippi
-is -i
+lz +p
  • +dE+r-PdiW: Combina -e +in un unico registro, con il +trasformato in a -.
  • :1s<C-R>"-g: Utilizza il registro come frammento di codice, inserito direttamente nel :scomando, con -come separatore.


2

R, 98 94 byte

Modifica: salvato 4 byte grazie a @rturnbull

i=scan(,"");s=i[1];i=gsub("\\+|-","",i[-1]);l=length(i)/2;for(j in 1:l)s=gsub(i[j],i[l+j],s);s

Ungolfed e casi di test

Perché scan (legge l'input da stdin) non funziona correttamente in R-fiddle, mostro il programma avvolgendolo invece in una funzione. Si noti che la funzione accetta un vettore come input e può essere eseguita ad es .:f(c("Hello world", "-wo", "-ld", "+Ea", "+th")) . . Il programma gofled sopra suggerirebbe all'utente di inserire usando stdin per cui digitando "Hello world" -wo -ld -Ea +thnella console si otterrebbe lo stesso risultato.

Esegui il codice su R-fiddle

f=function(i){
    s=i[1]                                   # Separate first element
    i=gsub("\\+|-","",i[-1])                 # Remove + and - from all elements except first, store as vector i
    l=length(i)/2                            # calculate the length of the vector i (should always be even)
    for(j in 1:l)s=gsub(i[j],i[l+j],s)       # iteratively match element j in i and substitute with element l+j in i
    s                                        # print to stdout
}

Potete fornire anche un link alla suite di test, per favore?
ʰᵈˑ

@ ʰᵈˑ aggiunta una suite di test R-fiddle. Si noti che la suite di test utilizza una funzione invece di leggere l'input da stdin come spiegato nella risposta modificata.
Billywob,

Questa risposta è valida, poiché è necessario utilizzare "intorno alla stringa di input?
rturnbull,

@rturnbull Non vedo perché no. Se si racchiudono tutte le voci tra virgolette e si preme Invio, si otterrà il risultato equivalente (ad esempio:), "Hello world" => enter => "-wo" => enter => "-ld" => enter => "+Ea" => enter =>"+th"che in genere è comunque la modalità di lettura delle stringhe.
Billywob,

1
Sì, dipende davvero dall'OP! Personalmente mi piace la tua risposta così com'è, ma ero preoccupato che potesse non essere valida. Guardando le risposte per altre lingue sembra che le virgolette siano piuttosto accettate. Mentre ho la vostra attenzione, penso che si può golf fuori 4 byte cambiando l=length(i)per l=length(i)/2e aggiornare i riferimenti successivi al l.
rturnbull,

2

Haskell, 85 78 byte

import Data.Lists
g=map tail.words
a#b=foldl(flip$uncurry replace)a.zip(g b).g

Esempio di utilizzo: ("mississippi" # "-is -i") "+lz +p" ->"mlzslzspppp" .

Come funziona:

g=map tail.words              -- helper function that splits a string into a
                              -- list of words (at spaces) and drops the first
                              -- char of each word

                zip(g b).g    -- make pairs of strings to be replaced and its
                              -- replacement
foldl(flip$uncurry replace)a  -- execute each replacement, starting with the
                              -- original string
                              -- -> "flip" flips the arguments of "uncurry replace"
                              --           i.e. string before pair of replacements
                              -- "uncurry" turns a function that expects two
                              --           lists into one that expects a list of pairs

Modifica: @BlackCap ha trovato 6 byte da salvare e io stesso un altro.


6 byte: import Data.Lists;a#b=foldl(uncurry replaceflip)a.zip(g b).g;g=map tail.words
BlackCap

@ BlackCap: bello grazie! Non è necessario effettuare flipinfix. Il prefisso standard è più corto di un byte.
nimi,

1

Python 3, 93 byte

def f(s):
  s,m,p=s
  for n,o in zip(m.split(),p.split()):s=s.replace(n[1:],o[1:])
  return s

Provalo online!

L'input è un elenco con stringhe, le stringhe di sostituzione sono separate da spazio.

Esempio di input: ['mississippi','-is -i','+iz +p']


Sei in grado di aggiungere un link alla suite di test, per favore?
ʰᵈˑ

Link fornito e dimensioni ridotte un po '.
Gábor Fekete,

1

PowerShell v2 +, 90 byte

param($a,$b,$c)-split$b|%{$a=$a-creplace($_-replace'-'),((-split$c)[$i++]-replace'\+')};$a

Prende input come tre argomenti, con l' -e +stringhe separate da spazi. Esegue un -spliton $b(il -splitquando recitare in modo unario si divide su uno spazio bianco), quindi |%{...}scorre in ciascuno di essi. Ogni iterazione che stiamo rimuovendo -, trovando la [$i++]stringa di sostituzione successiva e rimuovendola +da essa, e usando la -creplace(sostituzione con distinzione tra maiuscole e minuscole) per tagliare e tagliare a dadi $ae riporla $a. Quindi, $aviene lasciato sulla pipeline e l'output è implicito.

PS C:\Tools\Scripts\golfing> .\letter-replacement-challenge.ps1 'mississippi' '-is -i' '+iz +p'
mpzspzspppp

PS C:\Tools\Scripts\golfing> .\letter-replacement-challenge.ps1 'Hello world' '-wo -ld' '+Ea +th'
Hello Earth

PS C:\Tools\Scripts\golfing> .\letter-replacement-challenge.ps1 'Hello World' '-wo -ld' '+Ea +th'
Hello Worth

1

PHP, 106 byte

for($s=($v=$argv)[$i=1];$i++<$n=$argc/2;)$s=str_replace(substr($v[$i],1),substr($v[$n+$i-1],1),$s);echo$s;

approccio diretto. Corri con php -r '<code> <arguments>.

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.