stringtranslate.com

Programa de una sola línea

En programación de computadoras , un programa de una sola línea originalmente era una entrada textual a la línea de comando de un shell del sistema operativo que realizaba alguna función en una sola línea de entrada. En la actualidad, una frase sencilla puede ser

Ciertos lenguajes dinámicos para secuencias de comandos , como AWK , sed y Perl , tradicionalmente han sido expertos en expresar frases ingeniosas. Los intérpretes de shell, como los shells de Unix o Windows PowerShell, permiten la construcción de potentes frases ingeniosas.

El uso de la frase one-liner se ha ampliado para incluir también la fuente del programa para cualquier lenguaje que haga algo útil en una sola línea.

Historia

El concepto de programa de una sola línea se conoce desde la década de 1960 [1] con el lanzamiento del lenguaje de programación APL . Con su sintaxis concisa y poderosos operadores matemáticos, APL permitió representar programas útiles en unos pocos símbolos.

En la década de 1970, las frases ingeniosas se asociaron con el auge de la computadora doméstica y BASIC . Las revistas de informática publicaron programas mecanografiados en muchos dialectos de BASIC. Algunas revistas dedicaban columnas periódicas únicamente a impresionantes programas breves y de una sola línea. [2]

La palabra One-liner también tiene dos referencias en el índice del libro The AWK Programming Language (a menudo se hace referencia al libro con la abreviatura TAPL ). Explica el lenguaje de programación AWK , que forma parte del sistema operativo Unix . Los autores explican el nacimiento del paradigma de una sola línea con su trabajo diario en las primeras máquinas Unix :

La versión de 1977 tenía sólo unas pocas variables integradas y funciones predefinidas. Fue diseñado para escribir programas cortos […] Nuestro modelo era que una invocación tendría una o dos líneas de largo, se escribiría y se usaría inmediatamente. Se eligieron valores predeterminados para que coincidieran con este estilo […] Nosotros, como autores, sabíamos cómo se suponía que debía usarse el lenguaje, por lo que solo escribimos frases ingeniosas.

Tenga en cuenta que esta definición original de una sola línea implica la ejecución inmediata del programa sin ninguna compilación. Entonces, en sentido estricto, solo el código fuente para lenguajes interpretados califica como one-liner . Pero esta comprensión estricta de una sola línea se amplió en 1985 cuando el IOCCC introdujo la categoría de Mejor One Liner para C , que es un lenguaje compilado.

Ejemplos

Las frases ingeniosas también se utilizan para mostrar el poder expresivo diferencial de los lenguajes de programación . Con frecuencia, se utilizan frases ingeniosas para demostrar la capacidad de programación. A menudo se realizan concursos para ver quién puede crear la frase más excepcional.

BÁSICO

Salida simulada del programa BÁSICO de una sola línea 10PRINT para el Commodore 64

Una sola línea de BASIC normalmente puede contener hasta 255 caracteres, y una línea abarca desde juegos simples [3] hasta demostraciones gráficas. Una de las frases de demostración más conocidas se conoce coloquialmente como 10PRINT , escrita para el Commodore 64 :

10 IMPRIMIR CHR$ ( 205,5 + RND ( 1 )); : IR A 10     

C

El siguiente ejemplo es un programa C (una entrada ganadora en la categoría "Mejor frase ingeniosa" del IOCCC ).

principal ( int c , char ** v ) { retorno ! m ( v [ 1 ], v [ 2 ]);} m ( char * s , char * t ) { return * t -42 ?* s ? 63 ==* t |* s ==* t && m ( s + 1 , t + 1 ) :!* t : m ( s , t + 1 ) ||* s && m ( s + 1 , t ); } 

Este programa de una sola línea es un comparador de patrones globales. Entiende los caracteres globales *, es decir, cero o más caracteres, y ?, es decir, exactamente un carácter, al igual que la mayoría de los shells de Unix .

Ejecútelo con dos argumentos, la cadena y el patrón global. El estado de salida es 0 (shell verdadero) cuando el patrón coincide, 1 en caso contrario. El patrón global debe coincidir con toda la cadena, por lo que es posible que quieras usar * al principio y al final del patrón si buscas algo en el medio. Ejemplos:

$ ./a.out  foo 'f??' ; eco $? $ ./a.out 'mejor programa corto' '??st*o**p?*' ; eco $?       

AWK

El libro TAPL contiene 20 ejemplos de frases ingeniosas al final del primer capítulo del libro.

Aquí están los primeros de ellos:

  1. Imprima el número total de líneas de entrada (como wc -l ):
    FIN  {  imprimir  NR  }
  2. Imprima la décima línea de entrada:
    RN  ==  10
  3. Imprima el último campo de cada línea de entrada:
    {  imprimir  $ NF  }

j

Aquí hay ejemplos en J :

perla

A continuación se muestran ejemplos en el lenguaje de programación Perl :

perl -0777 -ne ' ' print "$.: doubled $_\n" while /\b(\w+)\b\s+\b\1\b/gi
perl -lne ' ' /usr/dict/palabrasprint if $_ eq reverse
perl -p -i.bak -e ' s/\bfoo\b/bar/g' *.c

Muchas frases ingeniosas son prácticas. Por ejemplo, el siguiente resumen de Perl invertirá todos los bytes de un archivo:

perl  -0777e 'imprimir escalar inverso <>' nombre de archivo  

Si bien la mayoría de las frases ingeniosas de Perl son imperativas, el soporte de Perl para funciones anónimas, cierres, mapas, filtros (grep) y plegados (List::Util::reduce) permite la creación de frases ingeniosas "funcionales".

Este resumen crea una función que se puede usar para devolver una lista de números primos hasta el valor del primer parámetro:

mi $z = sub { grep { $a = $_ ; ! grep { ! ( $a % $ _ ) } ( 2 .. $_ - 1 )} ( 2 .. $_ [ 0 ]) }                

Se puede utilizar en la línea de comando, así:

perl -e' ' número$,=",";print sub { grep { $a=$_; !grep { !($a % $_) } (2..$_-1)} (2..$_[0]) }->(shift)

para imprimir una lista de números primos separados por comas en el rango 2 - número.

Haskell

El siguiente programa de Haskell es de una sola línea: ordena sus líneas de entrada de forma ASCIIbética .

main = ( mapM_ putStrLn . Data . List . sort .lines ) =<< getContents - En ghci , un nombre calificado como Data.List.sort funcionará, aunque como ejecutable independiente necesitarías importar Data.List.          

Una versión aún más corta:

principal = interactuar ( unlines . Datos . Lista . ordenar . líneas ) - Lo mismo.        

Utilizable en la línea de comando como:

 nombre de archivo del gato | ghc -e "interactuar (unlines. Data.List.sort. líneas)"    

Raqueta

El siguiente programa Racket es equivalente al ejemplo de Haskell anterior:

#lang raqueta ( para-cada displayln ( ordenar ( puerto->líneas ) cadena<? ))    

y esto se puede usar en la línea de comando de la siguiente manera:

raqueta -e ' '(for-each displayln (sort (port->lines) string<?))

Pitón

La ejecución de frases ingeniosas directamente en la línea de comandos de Unix se puede lograr utilizando el indicador -cmd de Python (-c para abreviar) y, por lo general, requiere la importación de uno o más módulos. Las declaraciones se separan mediante ";" en lugar de nuevas líneas. Por ejemplo, para imprimir el último campo de un listado largo de Unix:

ls -l | pitón -c " "import sys;[sys.stdout.write(' '.join([line.split(' ')[-1]])) for line in sys.stdin]

Envoltorios de Python

Se han desarrollado varios scripts de código abierto para facilitar la construcción de frases ingeniosas en Python. Los scripts como pyp o Pyline importan módulos de uso común y proporcionan más variables legibles por humanos en un intento de hacer que la funcionalidad de Python sea más accesible en la línea de comandos. Aquí hay una repetición del ejemplo anterior (imprimiendo el último campo de una lista larga de Unix):

ls  -l | pyp "espacio en blanco[-1]" # "espacio en blanco" representa cada línea dividida en un espacio en blanco en pyp
ls -l | pyline "palabras[-1]" # "palabras" representa cada línea dividida en espacios en blanco en pyline         

Bibliotecas ejecutables

El módulo Python CGIHTTPServer, por ejemplo, también es una biblioteca ejecutable que funciona como servidor web con CGI. Para iniciar el servidor web ingrese:

$ python  -m  CGIHTTPServer Sirviendo HTTP en 0.0.0.0 puerto 8000…

tcl

Tcl (Tool Command Language) es un lenguaje de programación/scripting dinámico basado en conceptos de shells Lisp, C y Unix. Se puede utilizar de forma interactiva o ejecutando scripts (programas) que pueden utilizar un sistema de paquetes para estructurar. [4]

Muchas cadenas también son listas bien formadas. Cada palabra simple es una lista de longitud uno, y los elementos de listas más largas están separados por espacios en blanco. Por ejemplo, una cadena que corresponde a una lista de tres elementos:

ejemplo de  ejemplo { foo bar grill }   

Las cadenas con comillas o llaves desequilibradas, o caracteres que no sean espacios directamente después de las llaves de cierre, no se pueden analizar directamente como listas. Puede dividirlos explícitamente para hacer una lista.

El "constructor" de listas se llama, por supuesto, lista. Se recomienda usarlo cuando los elementos provienen de una sustitución de variables o comandos (las llaves no sirven). Como los comandos Tcl son listas de todos modos, lo siguiente es un sustituto completo del comando list:

argumentos de la  lista de procesos {establecer argumentos }   

WindowsPowerShell

Encontrar palíndromos en el archivo palabras.txt

 Palabras de obtención de contenido . texto  |  Donde {  $_  -eq  -join  $_ [( $_ . longitud - 1 ).. 0 ]  }

La semántica de canalización en PowerShell ayuda a habilitar escenarios complejos con programas de una sola línea. Este script de una sola línea en PowerShell toma una lista de nombres y recuentos de un archivo de valores separados por comas y devuelve la suma de los recuentos para cada nombre.

ipcsv .\ fruta . txt  H F ,  C | Grupo F |%{@{ " $( $_ . Nombre ) " =( $_ . Grupo | medida C  -suma ). Suma }}| ordenar valor

Ver también

Referencias

  1. ^ 10 IMPRIMIR CHR$ (205,5 + RND (1)); : IR A 10 (PDF) . Prensa Mit. 2014. pág. 148.ISBN​ 9780262526746. Consultado el 3 de julio de 2018 .
  2. ^ "Revista RUN número 35".
  3. ^ "Juegos de una línea para usuarios de Acorn (Escape From Voros, Lexxias, Race To Varpon, Storm Clouds Over Zaqqit, Zander (AKA Lurch))". bbcmicro.co.uk . Consultado el 3 de julio de 2018 .
  4. ^ A continuación se muestran citas directas deProgramación Tcl en Wikilibros que están disponibles bajo la licencia Creative Commons Attribution-ShareAlike .

enlaces externos