* O nome do idioma * é incrível!

13

Escreva um programa em qualquer idioma que leia a entrada de stdin e produza uma saída levemente modificada para stdout. O programa deve emprestar alguns caracteres da entrada e saída o maior prefixo possível, *language-name* is awesome!seguido por uma nova linha e, em seguida, o que resta da entrada.

  • A entrada não contém caracteres maiúsculos.
  • Se o primeiro caractere do nome do idioma não estiver presente na cadeia, apenas o caractere de nova linha deve ser emprestado.
  • Se não houver caractere de nova linha na entrada, produza a entrada sem modificação.
  • Não importa qual dos caracteres disponíveis você empresta.

Estou usando \ncomo o caractere de nova linha ( 0x0a) para economizar espaço ao escrever. O programa real deve se importar apenas com o caractere de nova linha real, não com a \nstring.

Exemplo: python.
Entrada: abcdefghijklmnopqrstuvwxyz\n0123456789
Saída: python\nabcdefgijklmqrsuvwxz0123456789
Desde a entrada não tem nenhum espaço, não podemos continuar, embora tenhamos caracteres suficientes para a palavra seguinte: is.

Exemplo: C.
input: i don't see anything!
output: i don't see anything!
C não foi encontrado na sequência, portanto, nenhuma modificação foi possível. Além disso, nenhum caractere de nova linha está presente.

Exemplo: C ++.
input: i don't\nsee anything!
output: \ni don'tsee anything!
C não foi encontrado na string, portanto, nenhuma modificação foi possível.

Exemplo: Obj-C.
input: objectively, clojure is amazing.\nq.e.d.
output: obj\nectively, clojure is amazing.q.e.d.
A entrada contém caracteres suficientes para escrever, objmas -está ausente.

A contagem de bytes do seu código-fonte menos a contagem de bytes do nome do seu idioma, codificado em utf-8 (se possível), é a sua pontuação; vitórias mais baixas!

Filip Haglund
fonte
3
Vamos esperar alguém encontra uma linguagem com muita repetição em nome de uma pontuação negativa :)
Filip Haglund
Você poderia incluir i don't\nsee anything!como um caso de teste?
Dennis
Bom caso de teste! Adicionado.
Filip Haglund
Como devem ser tratados casos com caracteres repetidos (no nome ou na entrada)? A ordem dos caracteres restantes na saída é importante?
Peter Taylor
Woops! Corrigido. Também esclareceu que qualquer personagem pode ser emprestado, não apenas o primeiro.
Filip Haglund

Respostas:

4

Pitão, 37 bytes

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

O código fonte tem 41 bytes . Experimente online.

Como funciona

  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.
Dennis
fonte
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

Experimente online

Mego
fonte
Ele deve apenas emprestar caracteres, portanto, se várias novas linhas estiverem presentes na entrada, você empresta apenas uma delas. Todos os caracteres ainda devem estar lá na saída, mas não necessariamente na mesma ordem.
Filip Haglund
1

Python, 146 bytes

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)
O médico
fonte
@Dennis corrigiu -_-
TheDoctor
Ainda há uma nova linha se a entrada não contiver novas linhas (segundo exemplo).
Dennis
1

Ceilão, 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);}

Aqui está uma versão formatada e comentada:

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

Ele usa em replaceLastvez de replaceFirstporque é mais curto.

Alguns exemplos de entradas e saídas no mesmo formato da pergunta:

  • 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.
Paŭlo Ebermann
fonte
0

JavaScript (ES6) 90 (100-10)

Como uma função retornando a saída solicitada. É difícil implementar com E / S, como o substituto usual para STDIN prompt(), que não aceita uma nova linha dentro da string de entrada.

Como uma função com saída real (usando alert), a contagem de bytes é 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))

Teste a execução do snippet abaixo em um navegador compatível com EcmaScript 6 (implementando o operador de propagação e a função de seta - eu uso o 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>

edc65
fonte
0

Perl, 72 - 4 = 68 bytes

Inclui 2 interruptores.

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

Explicação : Para cada caractere na sequência "\nperl is awesome", remova o caractere correspondente da sequência de entrada ( $_) até encontrarmos um caractere não presente $_. Os caracteres correspondentes são armazenados nos $pquais é prefixado o $_qual é então impresso.

O -0comutador lê a entrada completa em vez de linha por linha e o -pcomutador torna a leitura de entrada e imprime a saída implícita.

svsd
fonte
0

JavaScript (ES7), 101 107-10 = 97

Antes era mais curto e até funcionava nos quatro casos de teste, mas aparentemente eu perdi uma regra, então ...

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)

Funciona corretamente no Firefox 42. Isso começou originalmente em 119 bytes, mas um truque da resposta do @ edc65 ajudou a encurtá-lo bastante. Eu acho que ainda há espaço para melhorias. Como sempre, sugestões são bem-vindas!

ETHproductions
fonte
Falha quando falta nova linha na entrada. Teste obj-> job, não deve ser modificado (regra 3)
edc65 25/10/2015
@ edc65 Ah, sim, os casos de teste cobrem apenas 75% dos casos extremos. Eu poderia até remover is awesomee ainda funcionaria corretamente em todos os quatro. Eu vou consertar isso o mais rápido possível.
ETHproductions