* Il nome della lingua * è fantastico!


13

Scrivi un programma in qualsiasi lingua che legge l'input da stdin e trasmette un output leggermente modificato a stdout. Il programma dovrebbe prendere in prestito alcuni caratteri dall'input e dall'output il più grande possibile di un prefisso *language-name* is awesome!seguito da una nuova riga e quindi da ciò che resta dell'input.

  • L'input non contiene caratteri maiuscoli.
  • Se il primo carattere del nome della lingua non è presente nella stringa, dovrebbe essere preso in prestito solo il carattere di nuova riga.
  • Se non è presente alcun carattere di nuova riga nell'input, emettere l'input non modificato.
  • Non importa quale dei personaggi disponibili prendi in prestito.

Sto usando \nil carattere di nuova riga ( 0x0a) per risparmiare spazio durante la scrittura. Il vero programma dovrebbe preoccuparsi solo del vero carattere di nuova riga, non della \nstringa.

Esempio: python.
Ingresso: abcdefghijklmnopqrstuvwxyz\n0123456789
Uscita: python\nabcdefgijklmqrsuvwxz0123456789
Dal momento che l'ingresso non ha spazi, non possiamo continuare, anche se abbiamo abbastanza caratteri per la parola successiva: is.

Esempio: C.
input: i don't see anything!
output: i don't see anything!
C non è stato trovato nella stringa, quindi nessuna modifica è stata possibile. Inoltre, non è presente alcun personaggio di nuova riga.

Esempio: C ++.
input: i don't\nsee anything!
output: \ni don'tsee anything!
C non è stato trovato nella stringa, quindi nessuna modifica è stata possibile.

Esempio: Obj-C.
input: objectively, clojure is amazing.\nq.e.d.
output: obj\nectively, clojure is amazing.q.e.d.
l'input contiene caratteri sufficienti per scrivere objma -manca.

Il conteggio dei byte del codice sorgente meno il conteggio dei byte del nome delle tue lingue, codificato utf-8 (se possibile), è il tuo punteggio; vince il più basso!


3
Speriamo che qualcuno trovi una lingua con molte ripetizioni nel nome per un punteggio negativo :)
Filip Haglund,

Potresti includere i don't\nsee anything!come test case?
Dennis,

Ottimo caso di test! Aggiunto.
Filip Haglund,

Come devono essere gestiti i casi con caratteri ripetuti (nel nome o nell'input)? L'ordine dei caratteri rimasti nell'output è importante?
Peter Taylor,

Woops! Aggiustato. Ha anche chiarito che qualsiasi personaggio può essere preso in prestito, non solo il primo.
Filip Haglund,

Risposte:


4

Pyth, 37 byte

.-Jjb.zpef!.-TJ+,kb+Rb._"pyth is awesome!

Il codice sorgente è lungo 41 byte . Provalo online.

Come funziona

  Jjb.z                                      Save all user input in J.
                      ._"pyth is awesome!    Compute all prefixes that string:
                                               ["p", "py", ... ]
                   +Rb                       Append a linefeed to each prefix.
               +,kb                          Concatenate ["", "\n"] with the result.
         f                                   Filter the resulting array; for each T:
           .-TJ                                Perform bagwise difference between T
                                               and J (respects multiplicities).
         !                                     Take the logical NOT.
                                             Keep T if ! returned True, i.e., if J
                                             contains all of T's characters.
        e                                    Retrieve the last, longest match.
       p                                     Print it.
.-J                                          Remove its characters from J.
                                             (implicit) Print the result.

2

Python, 186 - 6 = 180

import sys
a=sys.stdin.read()
s="python is awesome!"
r=''
if'\n'not in a:print a;exit()
a=a.replace('\n','',1)
for c in s:
 if c in a:a,r=a.replace(c,'',1),r+c
 else:break
print r+'\n'+a

Provalo online


Dovrebbe prendere in prestito solo caratteri, quindi se nell'input sono presenti più righe, ne prendi in prestito solo una. Tutti i personaggi dovrebbero essere ancora presenti nell'output, ma non necessariamente nello stesso ordine.
Filip Haglund,

1

Python, 146 byte

import sys
r=sys.stdin.read();y='\npython is awesome!';a=''
for i in y:
    if i in r:a+=i
    else:break
print a[1:]+'\n'+''.join(b for b in r if not b in a)

@Dennis ha risolto -_-
TheDoctor il

Ancora una nuova riga troppe se l'input non contiene nuove righe (secondo esempio).
Dennis,

1

Ceylon, 235 - 6 = 229

void a(){variable value i="";variable value r="\nceylon is awesome!";while(exists l=process.readLine()){i=i+"\n"+l;}i=i.rest;for(j->c in r.indexed){if(c in i){i=i.replaceLast(c.string,"");}else{r=r[0:j];break;}}print(r.rest+r[0:1]+i);}

Ecco una versione formattata e commentata:

void a() {
    // our target string, with the \n shuffled to the start.
    variable value r = "\nceylon is awesome!";

    // read the whole input line by line
    // (there doesn't seem a way to do this shorter :-/)
    variable value i = "";
    while (exists l = process.readLine()) {
        i = i + "\n" + l;
    }
    // remove first \n:
    i = i.rest;
    for (j->c in r.indexed) {
        if (c in i) {
            // remove some occurence of c
            i = i.replaceLast(c.string, "");
        } else {
            // stop the loop, and take the part of `r` processed so far.
            r = r[0:j];
            break;
        }
    }
    // reshuffle first \n in r to its end.
    // This will result in the empty string if r is empty, i.e. no \n was found.
    print(r.rest + r[0:1] + i);
}

Usa replaceLastinvece che replaceFirstperché è più corto.

Alcuni esempi di input e output nello stesso formato della domanda:

  • abcdefghijklmnopqrstuvwxyz\n0123456789ceylon\nabdfghijkmpqrstuvwxz0123456789
  • i don't see anything!i don't see anything!
  • i don't\nsee anything!\ni don't see anything!
  • objectively, closure is amazing.\nq.e.d.ceylon is a\nobjectivel, sureiamzng.\q..d.

0

JavaScript (ES6) 90 (100-10)

Come funzione che restituisce l'uscita richiesta. È difficile implementare con l'I / O, come al solito sostituto di STDIN prompt(), che non accetta una nuova riga all'interno della stringa di input.

Come funzione con output reale (utilizzando alert) il conteggio dei byte è 107

f=s=>alert(([...`
javascript is awesome`].every(c=>(z=s.replace(c,''))!=s&&(s=z,q?o+=c:q=c),q=o=''),o+q+z))

Prova a eseguire lo snippet di seguito in un browser conforme a EcmaScript 6 (implementando l'operatore di diffusione e la funzione freccia - Uso FireFox)

f=s=>([...`
javascript is awesome`].every(c=>(z=s.replace(c,''))!=s&&(s=z,q?o+=c:q=c),q=o=''),o+q+z)

function test()
{
  O.innerHTML=f(I.value)
}

test()
#I {width: 80%}
<textarea id=I>
objectively, clojure is amazing.
q.e.d.</textarea><button onclick="test()">-></button>
<pre id=O></pre>


0

Perl, 72 - 4 = 68 byte

Include 2 interruttori.

perl -0pe 'for$c("\nperl is awesome!"=~/./gs){s/$c//?$p.=$c:last}s/^/$p\n/;s/\n//'

Spiegazione : Per ogni carattere nella stringa "\nperl is awesome", rimuovere il carattere corrispondente dalla stringa di input ( $_) fino a trovare un carattere non presente in $_. I caratteri corrispondenti vengono memorizzati in $pcui è prefissato il $_quale viene quindi stampato.

Lo -0switch legge l'input completo anziché riga per riga e lo -pswitch rende implicita la lettura dell'input e la stampa dell'output.


0

JavaScript (ES7), 101 107-10 = 97

Prima era più corto e funzionava persino su tutti e quattro i casi di test, ma apparentemente mi mancava una regola, quindi ...

x=>(i=r=q='',[for(c of`
javascript is awesome`)(y=x.replace(c,''),i||y==x?i=1:(c<' '?q=c:r+=c,x=y))],r+q+x)

Funziona correttamente in Firefox 42. Inizialmente era iniziato a 119 byte, ma un trucco della risposta di @ edc65 ha contribuito a ridurlo notevolmente. Penso che ci sia ancora qualche margine di miglioramento. Come sempre, suggerimenti benvenuti!


Errore quando manca newline nell'input. Test obj-> job, non deve essere modificato (regola 3)
edc65,

@ edc65 Ah, sì, i casi di test coprono solo il 75% dei casi limite. Potrei anche rimuovere is awesomee funzionerebbe ancora correttamente su tutti e quattro. Lo aggiusterò al più presto.
ETHproductions,
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.