* Nombre del idioma * es increíble!

13

Escriba un programa en cualquier idioma que lea la entrada de stdin y envíe una salida ligeramente modificada a stdout. El programa debe tomar prestados algunos caracteres de la entrada y salida del prefijo más grande posible, *language-name* is awesome!seguido de una nueva línea y luego lo que queda de la entrada.

  • La entrada no contiene caracteres en mayúscula.
  • Si el primer carácter del nombre del idioma no está presente en la cadena, solo se debe tomar prestado el carácter de nueva línea.
  • Si no hay un carácter de nueva línea en la entrada, envíe la entrada sin modificar.
  • No importa cuál de los personajes disponibles pidas prestado.

Estoy usando \nel carácter de nueva línea ( 0x0a) para ahorrar espacio al escribir. El programa real solo debería preocuparse por el carácter real de nueva línea, no por la \ncadena.

Ejemplo: python.
Entrada: abcdefghijklmnopqrstuvwxyz\n0123456789
Salida: python\nabcdefgijklmqrsuvwxz0123456789
Desde la entrada no tiene ningún espacio, no podemos continuar a pesar de que tenemos suficientes caracteres para la palabra siguiente: is.

Ejemplo: C.
input: i don't see anything!
output: i don't see anything!
C no se encontró en la cadena, por lo que no fue posible realizar ninguna modificación. Además, no hay un personaje de nueva línea presente.

Ejemplo: C ++.
input: i don't\nsee anything!
output: \ni don'tsee anything!
C no se encontró en la cadena, por lo que no fue posible realizar ninguna modificación.

Ejemplo: Obj-C.
input: objectively, clojure is amazing.\nq.e.d.
output: obj\nectively, clojure is amazing.q.e.d.
la entrada contiene suficientes caracteres para escribir objpero -falta la.

El recuento de bytes de su código fuente menos el recuento de bytes del nombre de sus idiomas, codificado utf-8 (si es posible), es su puntaje; victorias más bajas!

Filip Haglund
fuente
3
Esperemos que alguien encuentre un idioma con mucha repetición en el nombre para un puntaje negativo :)
Filip Haglund
¿Podría incluir i don't\nsee anything!como un caso de prueba?
Dennis
Buen caso de prueba! Adicional.
Filip Haglund
¿Cómo deben manejarse los casos con caracteres repetidos (ya sea en el nombre o en la entrada)? ¿Importa el orden de los caracteres sobrantes en la salida?
Peter Taylor
Woops! Arreglado. También aclaró que cualquier personaje puede ser prestado, no solo el primero.
Filip Haglund

Respuestas:

4

Pyth, 37 bytes

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

El código fuente tiene 41 bytes de longitud. Pruébalo en línea.

Cómo 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
fuente
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

Pruébalo en línea

Mego
fuente
Solo debe tomar prestados caracteres, por lo que si hay varias líneas nuevas en la entrada, solo toma prestada una de ellas. Todos los caracteres deben estar allí en la salida, pero no necesariamente en el mismo orden.
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)
TheDoctor
fuente
@Dennis lo arregló -_-
TheDoctor
Todavía una nueva línea es demasiada si la entrada no contiene nuevas líneas (segundo ejemplo).
Dennis
1

Ceilán, 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);}

Aquí hay una versión formateada y 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);
}

Se usa en replaceLastlugar de replaceFirstporque es más corto.

Algunos ejemplos de entradas y salidas en el mismo formato que en la pregunta:

  • 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
fuente
0

JavaScript (ES6) 90 (100-10)

Como una función que devuelve la salida solicitada. Es difícil de implementar con E / S, ya que el sustituto habitual de STDIN es prompt()que no acepta una nueva línea dentro de la cadena de entrada.

Como una función con salida real (usando alert) el conteo de bytes es 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))

Pruebe a ejecutar el fragmento a continuación en un navegador compatible con EcmaScript 6 (implementando el operador de propagación y la función de flecha: 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>

edc65
fuente
0

Perl, 72-4 = 68 bytes

Incluye 2 interruptores.

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

Explicación : Para cada carácter de la cadena "\nperl is awesome", elimine el carácter correspondiente de la cadena de entrada ( $_) hasta que encuentre un carácter que no esté presente $_. Los caracteres coincidentes se almacenan en $pel prefijo $_que luego se imprime.

El -0interruptor lee en la entrada completa en lugar de línea por línea y el -pinterruptor hace que la entrada de lectura e impresión de la salida sea implícita.

svsd
fuente
0

JavaScript (ES7), 101 107-10 = 97

Era más corto antes, e incluso funcionó en los cuatro casos de prueba, pero aparentemente omití una regla, así que ...

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 correctamente en Firefox 42. Esto originalmente comenzó en 119 bytes, pero un truco de la respuesta de @ edc65 ayudó a acortarlo mucho. Creo que todavía hay margen de mejora. Como siempre, las sugerencias son bienvenidas!

ETHproductions
fuente
Falla cuando falta nueva línea en la entrada. Prueba obj-> job, no debe modificarse (regla 3)
edc65
@ edc65 Ah, sí, los casos de prueba solo cubren el 75% de los casos límite. Incluso podría eliminarlo is awesomey aún funcionaría correctamente en los cuatro. Arreglaré esto lo antes posible.
ETHproductions