Introducción
Mi abuelo es fanático de James Bond, pero siempre no está seguro de cómo clasificar a sus actores favoritos. Como tal, siempre está haciendo listas, lo cual es mucho trabajo. Me pidió que produjera un programa que le facilitara la vida, pero no tengo tiempo para eso, ¡tengo que trabajar! Así que contaré con ustedes, chicos.
Reto
El desafío es simple. La entrada consistirá en una lista, en el siguiente formato:
<number> <space> <actor's name> <newline>
Su tarea es ordenarlos según el número al principio de la línea, comenzando desde el último y terminando con el primero. Todos los números deben ser eliminados.
Sin embargo, mi abuelo a veces comete errores. Como tal, deberá validar los datos. Si uno de los nombres en la lista no se refiere a uno de los actores que interpretaron a Bond, debe descartarlo. En caso de repeticiones, las repeticiones deben eliminarse y el nombre debe mantener el peso más bajo con el que estaba asociado (ejemplo # 3).
No hay límite para cuántas líneas puede haber.
La salida solo necesita ser una lista de algún tipo, ya sea una matriz, una cadena separada por comas, solo valores separados por espacios o algo completamente diferente, es decir
Pierce Brosnan, Sean Connery, David Niven
Se permite una nueva línea o espacio final.
Ejemplo de entrada y salida
Entrada:
1 Sean Connery
2 Emma Watson
5 Timothy Dalton
4 Roger Moore
3 Daniel Craig
Salida:
Timothy Dalton, Roger Moore, Daniel Craig, Sean Connery
Entrada:
2 Timothy Dalton
4 George Lazenby
5 George Lazenby
3 Bob Simmons
Salida:
George Lazenby, Bob Simmons, Timothy Dalton
Entrada:
3 Sean Connery
2 Pierce Brosnan
1 Sean Connery
Salida:
Pierce Brosnan, Sean Connery
Como se trata de un código de golf, ¡el código más corto (en bytes) gana!
Apéndice
Lista de actores que interpretaron el papel de Bond:
- Barry Nelson
- Bob Simmons
- sean Connery
- Roger Moore
- David Niven
- George Lazenby
- Timothy Dalton
- Pierce Brosnan
- Daniel Craig
echo Sean Connery
porque todos lo saben, solo hay un vínculoRespuestas:
Pyth,
136132 bytesPruébalo aquí!
Explicación
fuente
retina ,
201 197191Pruébalo en línea!
¡6 bytes guardados gracias a Martin!
Whee, tipo burbuja con expresiones regulares. Tenga en cuenta que al principio se gastan diez bytes haciendo la conversión de decimal a unario, si la entrada unaria es correcta, entonces eso no es necesario. Además, si los números no pueden estar en los nombres de las personas, se pueden guardar un par de bytes más moviendo la línea que elimina a los actores que no pertenecen a Bond hasta el final y eliminando el
1+
(no probado con la\D
versión).Explicación:
Un programa de Retina se compone de varias etapas, por lo que explicaré cada etapa por separado.
Nivel 1:
Reemplaza los números en la entrada con unario. Utiliza el token de reemplazo especial de Retina:
$*
que repite el personaje después de varias veces igual al valor base 10 del token anterior.Etapa 2:
Las cosas antes de un
`
en una etapa cambian el modo que se utiliza. Esto activa el modo grep, lo que significa que cada línea que no coincide con la expresión regular se descarta. Los anclajes son necesarios para evitar que se acerquen cerillas cercanas.Etapa 3:
Esta es la etapa de clasificación. En
+
el modo significa que esta etapa debe repetirse hasta que el reemplazo no cambie cuando se aplica (es decir, llegamos a un punto fijo). La expresión regular encuentra un límite de palabras, seguido de un número de1
sy luego todo el resto de la línea hasta la nueva línea. Luego, si la siguiente línea tiene más1
s que ella, la expresión regular coincidirá y cambiaremos las líneas.Etapa 4:
Esta etapa usa el
+
modo nuevamente, pero también usas
para hacer que el.
meta-personaje también coincida con las nuevas líneas. Esto elimina las líneas duplicadas, haciendo coincidir los duplicados exactos después del1
s y capturando las cosas después del primer duplicado para reemplazar la coincidencia completa con él. Esto funcionará sin necesidad de considerar el orden de desempate, ya que los nombres ya están ordenados adecuadamente, con los números más grandes arriba, por lo tanto, siempre mantendremos los valores más pequeños.Etapa 5:
Una muy simple aquí, todo está en orden, excepto que tenemos un montón de
1
s delante de nuestros Bonos, por lo que los reemplazamos y el espacio después de ellos con nada.fuente
TSQL 426 bytes (incluye datos + entrada)
Solución de golf:
Pruébalo aquí
SQL sobresale (sin juego de palabras) en este tipo de tarea: relacionar conjuntos, ordenar, cortar duplicados, etc.
Todo lo que necesitas es crear y completar una tabla de actores como esta:
Ahora, si usamos una variable de tabla como entrada, solo necesitamos obtener la intersección de ambos conjuntos. Eliminar duplicados y ordenar en SQL es realmente fácil.
Ejemplo 1:
Ejemplo 2
La versión de golf es lo más completo, por ejemplo, la entrada 3
Como ventaja, este SQL puede funcionar para versiones anteriores de DBMS (incluso reescribir en ANSI SQL) y ejecutarse sin problemas en computadoras más antiguas que la mayoría de los idiomas.
fuente
order by min(R) desc
con la selección interna y eliminar lamin(R)
de la selección. Eso debería ahorrar 21 bytes.char
lugar devarchar
guardará otros 6 bytes.Perl,
242179217 bytesVersión con mejor formato, con comentarios:
La mayor parte del tamaño es la lista de Bonos; No puedo encontrar una buena manera de comprimir esa expresión regular sin permitir falsos positivos.
fuente
eval
en Perl y un sistema de compresión incorporado ...Python 2, 250 bytes:
Manifestación:
fuente
PowerShell v3 +,
227219 bytes121 bytes de eso es solo la lista de actores ...
Toma información
$args
y-split
la envía a nuevas líneas con`n
. Canalice eso asort
, que ordenará las entradas numéricamente ascendentes, lo cual está bien por ahora. Los canalizamos a un bucle foreach|%{...}
, cada iteración toma la entrada,-split
en espacios, luego-join
la segunda mitad de vuelta junto con un espacio (es decir, quitando los números del principio). Esos nombres ordenados (ascendentes) ahora se dejan en la tubería. Los canalizamos a través de un lugar donde?
eso garantiza que sean-in
la lista aprobada de actores. Finalmente,select
solo las-u
entradas de nique, que para duplicados seleccionarán la primera que encuentre (es decir, la de menor ponderación) y descartaremos el resto. Almacenamos la matriz resultante de nombres en$a
.Entonces, ahora tenemos una lista ascendente ordenada de actores. Dado que el desafío requiere descender, hacemos una operación de reversión en el lugar
$a
al indexar de$a.count
abajo a0
.Ejemplo
Editar: no es necesario usar [array] :: Reverse () cuando la indexación servirá
fuente
sort -Des
lugar de la inversión de la matriz? De acuerdo, esto podría romperse en versiones posteriores de PowerShell, pero no creo que sea probable o un problema real;)select -u
tomaría y retendría el orden de mayor valor , en lugar del más bajo, por lo que, por ejemplo, las posiciones de Daniel Craig y Roger Moore cambiarían. Mis intentos de arreglar eso resultaron en un código más largo que la inversión de la matriz.Pitón
309286 bytesfuente
print
o después de un)
o]
JavaScript (ES6), 232 bytes
Explicación
fuente