En este desafío, los usuarios se turnarán para completar tres tareas de codificación bastante simples en lenguajes de programación que pueden ser progresivamente más antiguas.
La primera respuesta debe usar un lenguaje de programación que se hizo en el año 2015. Una vez que haya al menos una respuesta de un idioma de 2015, las respuestas pueden usar lenguajes de programación que se hicieron en 2014. Del mismo modo, las respuestas que usan idiomas de 2013 no están permitidas hasta que haya al menos una respuesta de 2014.
En general, el uso de un lenguaje de programación del año Y no está permitido hasta que se haya enviado una respuesta utilizando un lenguaje del año Y + 1. La única excepción es Y = 2015.
Encontrar el año de tu idioma
Para responder a esta pregunta, debe saber el año en que su lenguaje de programación fue "creado". Este es, por supuesto, un término subjetivo; algunos idiomas se desarrollaron en el transcurso de varios años, y muchos idiomas todavía se actualizan cada año. Sea el año en que se "hizo" un idioma el primer año que apareció una implementación para ese idioma en el público en general.
Por ejemplo, Python se hizo en 1991 , aunque su desarrollo había estado en progreso desde 1989, y la versión 1.0 no se lanzó hasta 1994.
Si este año sigue siendo subjetivo, solo use su sentido común para elegir el año más apropiado. No se empantane con ligeros desacuerdos sobre las elecciones de año. Proporcione un enlace a una fuente que indique cuándo se creó su idioma.
Las diferentes versiones o estándares de un lenguaje de programación (por ejemplo, Python 1, 2, 3) se cuentan como el mismo idioma con el mismo año inicial.
Entonces, a menos que el año de su idioma sea 2015, solo puede enviar su respuesta una vez que se haya enviado una respuesta cuyo año de idioma es el año anterior al suyo.
Si ya existe una respuesta válida con el mismo año que la suya, entonces puede responder. No importa si su idioma se desarrolló antes o más tarde en el año.
Tareas
Debe completar las tareas 1 a 3. La tarea 0 es opcional.
Estas tareas fueron más o menos elegidas para corresponder a tres aspectos importantes de la programación: proporcionar salida (Tarea 1), bucle (Tarea 2) y recursividad (Tarea 3).
Tarea 0 - Historial de idiomas (opcional)
Escriba al menos un párrafo que explique la historia de su lenguaje de programación elegido: quién lo desarrolló, por qué, cómo, etc. Esto se recomienda especialmente si usted estuvo presente cuando surgió el lenguaje, y tal vez incluso participó en su desarrollo. Siéntase libre de relatar anécdotas personales sobre el efecto que tuvo el lenguaje en usted o su trabajo, o algo así.
Si eres demasiado joven para saber mucho sobre la historia de tu idioma sin mucha investigación, considera dejar una nota a los usuarios mayores que diga que pueden editar tu publicación y agregar algo de historia de primera mano.
Tarea 1: "¡Hola, mundo!" Variante
Escribe un programa que imprima
[language name] was made in [year made]!
al área de salida estándar de su idioma (stdout para los idiomas más recientes).
Por ejemplo, si el lenguaje fuera Python, el resultado sería:
Python was made in 1991!
Tarea 2 - ASCII Art N
Escriba un programa que permita al usuario ingresar un entero positivo impar (puede suponer que la entrada siempre es válida) e imprime una letra N ASCII con el carácter N
.
Si la entrada es 1, la salida es:
N
Si la entrada es 3, la salida es:
N N
NNN
N N
Si la entrada es 5, la salida es:
N N
NN N
N N N
N NN
N N
Si la entrada es 7, la salida es:
N N
NN N
N N N
N N N
N N N
N NN
N N
El patrón continúa así. La salida puede contener espacios finales.
Tarea 3 - MCD
Escriba un programa que permita al usuario ingresar dos enteros positivos (puede suponer que la entrada siempre es válida) e imprime su máximo divisor común . Esto se define como el número entero positivo más grande que divide ambos números sin dejar un resto. Se puede calcular fácilmente utilizando el algoritmo euclidiano .
Ejemplos:
8
, 12
→ 4
12
, 8
→ 4
3
, 30
→ 3
5689
, 2
→ 1
234
, 876
→6
Puede usar una función incorporada, pero intente averiguar si estaba allí en la primera versión de su idioma. Si no, intente no usarlo.
Reglas
- Puede responder varias veces, pero cada nueva respuesta debe usar un idioma hecho al menos 5 años antes del idioma en su última respuesta. Entonces, si respondió con un idioma de 2015, no podría responder nuevamente hasta que se permitan los idiomas de 2010. Si comienza con una respuesta de 2010, no puede hacer que una respuesta de 2015 sea su segunda respuesta porque 2015 no es antes de 2010.
- Si es posible, escriba su código para que haya funcionado en la primera versión de su idioma (o una versión tan antigua como sea posible). (Esto no es un requisito porque encontrar compiladores / intérpretes antiguos para algunos idiomas puede ser difícil).
- Abstenerse de publicar un idioma que ya ha sido publicado a menos que la respuesta publicada tenga errores significativos o tenga una forma muy diferente de completar las tareas.
- Golfing su código está bien, pero no es obligatorio.
- Una nueva línea final en la salida de cualquier programa está bien.
- Para las tareas 2 y 3, todos los valores de entrada por debajo de un máximo razonable como 2 16 deberían funcionar (256 como mínimo).
- Su idioma debe haber existido antes de que se publicara esta pregunta.
- Los lenguajes de programación muy antiguos pueden tener diferentes formas de entrada y salida de lo que pensamos hoy. Esto esta bien. Complete las tareas lo mejor que pueda en el contexto de su idioma.
Puntuación
La puntuación de su envío es:
upvotes - downvotes + (2015 - languageYear) / 2
Por lo tanto, se agrega 0.5 al conteo de votos para cada año antes de 2015, dando la ventaja a los idiomas más antiguos. La presentación con la puntuación más alta gana.
Lista de respuestas
El fragmento de pila a continuación enumera todas las respuestas válidas según su año de idioma.
Debes comenzar tu publicación con esta línea de Markdown para asegurarte de que esté lista correctamente:
#[year] - [language name]
Por ejemplo:
#1991 - Python
El nombre del idioma puede estar en un enlace (será el mismo enlace en la lista de respuestas):
#1991 - [Python](https://www.python.org/)
Las respuestas que no siguen este formato, o tienen un año que aún no está permitido, o provienen de un usuario que ya respondió en los últimos 5 años están marcadas como no válidas.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>$(function(){function e(e,r){var a="https://api.stackexchange.com/2.2/questions/48476/answers?page="+e.toString()+"&pagesize=100&order=asc&sort=creation&site=codegolf&filter=!YOKGPOBC5Yad160RQxGLP0r4rL";$.get(a,r)}function r(e){if(e.items.forEach(function(e){var r=e.link,a=e.owner.display_name,i=e.body.match(/<h1\b[^>]*>(\d{4}) - (.*?)<\/h1>/);if(i&&i.length>=3)var h=parseInt(i[1]),u=i[2];h&&u&&n>=h&&h>=t&&(!d.hasOwnProperty(e.owner.user_id)||d[e.owner.user_id]-h>=p)?(d[e.owner.user_id]=h,h==t&&--t,o.hasOwnProperty(h)||(o[h]=[]),o[h].push({language:u,user:a,link:r,score:e.score+(n-h)/2})):s.push(' <a href="'+r+'">'+a+"</a>")}),e.has_more)runQuery(++a,r);else{for(var i=n,h=[];o.hasOwnProperty(i);){for(var u=$("<tr>").append($("<td>").text(i.toString())),l=$("<td>"),c=$("<td>"),g=$("<td>"),f=0;f<o[i].length;f++){var v=o[i][f];l.append(v.language),c.append($("<a>").html(v.user).attr("href",v.link)),g.append(v.score),f+1<o[i].length&&(l.append("<br><br>"),c.append("<br><br>"),g.append("<br><br>"))}u.append(l).append(c).append(g),h.push(u),--i}$("#answers").find("tbody").append(h),s.length>0?$("#invalid").append(s):$("#invalid").remove()}}var a=1,n=2015,t=n-1,p=5,o={},s=[],d={};e(1,r)})</script><style>html *{font-family: Helvetica, Arial, sans-serif;}table{border: 4px solid #a4a; border-collapse: collapse;}th{background-color: #a4a; color: white; padding: 8px;}td{border: 1px solid #a4a; padding: 8px;}div{font-size: 75%;}</style><table id='answers'> <tr> <th>Year</th> <th>Language</th> <th>User (answer link)</th> <th>Score</th> </tr></table><div id='invalid'><br>Invalid Answers:</div>
fuente
Respuestas:
2013 - Dogescript
Dogescript es un lenguaje creado en 2013 por Zach Bruggeman. No es más que un reemplazo de sintaxis para Javascript para que se lea como los monólogos internos del memético Shiba Inus.
Hola dux
Arte ASCII
GCD
fuente
s[i]
parte también!2015 - Retina
Retina es un lenguaje de programación basado en expresiones regulares, que escribí para poder competir en desafíos de PPCG con respuestas solo de expresiones regulares, sin tener la sobrecarga innecesaria de llamar a las expresiones regulares en algún lenguaje anfitrión. La retina está completa de Turing. Para demostrarlo, he implementado un solucionador de sistema de 2 etiquetas, así como la Regla 110 . Está escrito en C #, por lo tanto, admite tanto el sabor de .NET (por defecto) como el sabor de ECMAScript (a través de un indicador).
La retina puede funcionar en múltiples modos, pero el más relevante para los cálculos (y el de Turing completo) es el modo Reemplazar. En el modo Reemplazar, le da a Retina un número par de archivos de origen. Estos se emparejan, el primero de cada par es una expresión regular y el segundo un reemplazo. Estos se ejecutan en orden, manipulando la entrada paso a paso. La expresión regular también puede estar precedida por una configuración (delimitada por
`
). La opción más importante (que hace que Retina Turing sea completa) es+
, que hace que Retina aplique el reemplazo en un bucle hasta que el resultado deje de cambiar. En los siguientes ejemplos, también estoy usando;
, que suprime la salida en etapas intermedias.En cada una de las siguientes presentaciones, cada línea va en un archivo fuente separado. (Alternativamente, puede usar la nueva
-s
opción y poner todas las líneas en un solo archivo). Los archivos / líneas vacíos se representan como<empty>
. Los archivos / líneas que contienen un solo espacio se representan como<space>
.Las explicaciones son bastante largas, así que las he movido al final de la publicación.
Los programas
"¡Hola Mundo!" Variante
ASCII Art N
Esto supone que STDIN se termina con una nueva línea.
GCD
Esto requiere que STDIN no finalice con una nueva línea.
Explicaciones
"¡Hola Mundo!" Variante
Esto es bastante trivial. No necesita entrada (es decir, una cadena vacía), no coincide con nada y la reemplaza por
Retina was made in 2015!
. También se puede hacer que funcione para entradas arbitrarias, reemplazando el patrón con,[\s\S]*
por ejemplo. Eso sorbería STDIN y lo reemplazaría todo con la salida.ASCII Art N
Esto tiene muchas etapas. La idea es convertir la entrada a unaria, crear un bloque N x N de
N
sy luego "tallar" dos triángulos. Veamos las etapas individuales. Recuerde que;
simplemente suprime las salidas intermedias, pero+
hace que el reemplazo se aplique en un bucle.Simple: anteponga a
#
a la entrada. Esto se usará como marcador en la conversión a unario.Esto convierte un dígito a unario. Toma los dígitos ya convertidos
(\d*)
y los repite 10 veces. Y luego toma el siguiente dígito y agrega el número apropiado de dígitos. El valor real de los dígitos es irrelevante en esta etapa. Cuando#
llega al final del número, la expresión regular ya no coincide y se realiza la conversión. Como ejemplo, el número127
se procesará comodonde la última línea contiene exactamente 127 caracteres de dígitos.
Dos etapas simples que eliminan eso
#
y luego convierten todos los dígitos aN
. A continuación, usaré input7
como ejemplo. Entonces ahora tenemosLa siguiente etapa
reemplaza cada una
N
con la cadena completa (recuerde que contiene una nueva línea final) y también elimina la nueva línea final. Por lo tanto, esto convierte la fila individual en una cuadrícula cuadrada:Ahora el triángulo superior. Primero, comenzamos las cosas convirtiendo la N en la esquina inferior derecha en un espacio:
La búsqueda anticipada asegura que estamos modificando la correcta
N
. Esto daY ahora
es una expresión regular que coincide con una
N
que está arriba o en la esquina superior izquierda de un carácter de espacio, y la reemplaza con un espacio. Debido a que el reemplazo se repite, esto es esencialmente un relleno de inundación, que convierte el tercer octante del espacio inicial en más espacios:Y finalmente, repetimos lo mismo con el triángulo inferior, pero usamos un carácter diferente, por lo que los espacios ya existentes no causan un relleno de inundación incorrecto:
establece la semilla:
Entonces
¿Se llena el diluvio?
Y finalmente
Los convierte
S
en espacios y listo:GCD
GCD en unario es realmente muy trivial con regex. La mayor parte de esto consiste en la conversión de decimal a unario y unario a decimal. Esto podría hacerse de manera más compacta, pero este no es un código de golf, así que ...
Estas etapas son esencialmente las mismas que las anteriores, excepto que ambos números de entrada se convierten y el resultado usa
1
s en lugar deN
s (no es que importe). Entonces, si la entrada fue18 24
, entonces esto produciríaAhora
es todo el cálculo de GCD. Hacemos coincidir un divisor común capturando un número de
1
s, y luego usando referencias posteriores para asegurar que ambos números puedan escribirse repitiendo esa cadena (y nada más). Debido a cómo funciona el retroceso en el motor regex (es decir, que.+
es codicioso), esto siempre generará el mayor divisor común automáticamente. Como la coincidencia cubre toda la cadena, simplemente escribimos de nuevo el primer grupo de captura para obtener nuestro GCD.Finalmente, la conversión de unario a decimal ...
Agregue un marcador
#
, un delimitador:
y todos los dígitos a la cadena. Esto es necesario, porque no puede producir nuevos caracteres condicionalmente en un reemplazo de expresiones regulares. Si desea un reemplazo condicional, debe extraer los caracteres de la cadena en sí, por lo que los colocamos allí.Esta es la inversa de la expansión unaria anterior. Encontramos el múltiplo más grande de 10 que se ajusta a la cadena actual. Luego, elegimos el siguiente dígito en función del resto, y dividimos el múltiplo por 10, mientras movemos el marcador a través de los dígitos.
Y, por último, solo un paso de limpieza para deshacerse del marcador, delimitador y los dígitos auxiliares.
fuente
2013 - Snap !
Snap ! es un lenguaje basado en Scratch , hecho en la Universidad de Berkeley. Es una actualización a Scratch con datos de primera clase y bloques personalizados (funciones). Al igual que Scratch, no se basa en texto, sino que se realiza mediante "bloques" visuales que se unen.
Snap ! , escrito en JavaScript, es el sucesor de BYOB, que fue escrito en Squeak Smalltalk. Snap ! se lanzó en beta para consumo público en marzo de 2013 .
Snap ! en realidad no es un lenguaje esotérico. Se utiliza como lenguaje de programación para el curso AP CS de Belleza y Alegría de la Computación (BJC) en Berkeley y otros.
Ayudé con las pruebas y esas cosas.
Variante "Hola mundo"
Arte ASCII "N"
Esto usa stdlib para algunos de los bloques.
Bucle bastante básico aquí. Toma una entrada. Luego lo agregamos todo junto y lo decimos (resultado para n = 5):
Me tomé la libertad de usar solo 2 espacios en lugar de 1, porque ¡Snap! no dice cosas en el monoespacio.
GCD
El algoritmo euclidiano no es muy rápido, pero funciona y es bastante simple. (Lo siento, hice un error tipográfico en el nombre del bloque. Ahora cerré la pestaña sin guardar. Solo tendrá que quedarse).
Esta definición de función producirá este bloque:
fuente
2007 - LOLCODE
Historia del lenguaje
LOLCODE fue creado en 2007 por Adam Lindsay, investigador de la Universidad de Lancaster. Su sintaxis se basa en los memes de lolcats popularizados por Cheezburger, Inc.
"¡Hola Mundo!" Variante
ASCII Art N
Los valores se leen como cadenas (YARN) de stdin usando
GIMMEH
. Se pueden convertir a numéricos (NUMBR) multiplicando por 1.Los valores se imprimen en stdout usando
VISIBLE
. Por defecto, se agrega una nueva línea, pero se puede suprimir agregando un signo de exclamación.GCD
SMOOSH
realiza la concatenación de cadenas.fuente
IM IN YR toilet UPPIN YR butt
Buenos nombres de variablesx1
,x2
, etc.1982 - PostScript
PostScript es un lenguaje para crear gráficos vectoriales e imprimir.
Adobe fue fundado en 1982, y su primer producto fue PostScript. El lenguaje se usaba en las impresoras: la impresora interpreta los comandos para crear una imagen ráster, que luego se imprime en la página. Era un componente muy común de las impresoras láser en la década de 1990. Pero obviamente es bastante CPU intensiva en la impresora, y a medida que los procesadores de la computadora se volvieron más potentes, tenía más sentido hacer la rasterización en la computadora que en la impresora. PostScript ha desaparecido en gran medida en las impresoras de consumo, aunque todavía existe en muchas más impresoras de gama alta.
El estándar que reemplazó a PostScript es un formato poco conocido llamado PDF.
PostScript había pasado de moda cuando comencé a programar, pero aprendí un poco mientras estaba en la universidad como otra forma de crear documentos para TeX. Era bastante diferente a otros lenguajes de programación que había usado (notación infijada inversa, apilar, imprimir en una página en lugar de una consola), pero fue agradable desempolvar este viejo lenguaje para divertirme un poco.
Dado que PostScript es un lenguaje de impresión, parece más apropiado usarlo para imprimir algo y luego enviar una salida a la consola.
Tarea 1
Las primeras líneas configuran un lienzo para dibujar. Luego, el
moveto
comando le dice a PS que dibuje en una posición particular eshow
imprime la cadena en la página. Tenga en cuenta que los paréntesis marcan una cadena en PostScript, no comillas.Tarea 2
Escribí una función para dibujar el "arte ASCII" N, pero no hay forma de que las funciones PostScript tomen un argumento. En cambio, empuja sus argumentos a la pila, luego los retira. Esa es la
/x exch def
linea.Un ejemplo: supongamos que la pila es
8 9 2
. Primero empujamos el nombre/x
a la pila, entonces la pila es8 9 2 /x
. Elexch
operador intercambia los dos valores de la pila, por lo que ahora la pila es8 9 /x 2
. Luegodef
muestra los dos valores superiores de la pila, y define/x
tener el valor2
. La pila es ahora8 9
.Cuando comencé a usar PostScript, encontré esto un poco confuso. Había leído sobre la pila como un concepto teórico, pero esta era la primera vez que la usaba en la práctica.
El resto de la función es un código de dibujo: comience en la esquina inferior derecha, completando una fila a la vez de izquierda a derecha a diagonal.
Tarea 3
Nuevamente, utilicé una forma del algoritmo de Euclid, pero olvidé que PostScript tiene un operador de módulo incorporado, así que tuve que escribir el mío. Esto resultó ser un recordatorio útil de las limitaciones de la programación basada en pila. Mi primera implementación de
modulo
se basó en la recursividad:lo cual está bien hasta que intente ejecutar esto cuando
x
es grande yy
pequeño (por ejemplo, 5689 y 2). Solo puede tener hasta 250 elementos en la pila, por lo que estaba superando el límite de la pila. Ups Tuve que volver al tablero de dibujo en ese.El código GCD en sí es bastante simple. Pero así como las funciones no pueden tomar argumentos, tampoco tienen valores de retorno. En su lugar, debe empujar el resultado a la pila donde alguien más puede reventarlo más tarde. Eso es lo que
a
yb a gcd
que hacen las líneas : cuando terminan de evaluar, empujan el valor a la pila.Si coloca todo el código en un documento e lo imprime, así es como se ve la salida:
fuente
2009 - > <>
Inspirado por Befunge,> <> (Fish) es un lenguaje 2D esotérico basado en la pila, es decir, el flujo del programa puede ser hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha. La versión inicial de> <> presentaba subprocesos múltiples donde
[
y]
creaba y terminaba hilos, pero por razones de simplicidad, estas instrucciones se cambiaron para crear y eliminar nuevas pilas respectivamente.El intérprete oficial actual para> <> se puede encontrar aquí . Desafortunadamente, el enlace al antiguo intérprete en la wiki de Esolang está roto.
"¡Hola Mundo!" Variante
Observe cómo la cadena se escribe hacia atrás -> <> técnicamente no tiene cadenas, con el único tipo de datos que es una extraña mezcla de char, int y float.
"
alterna el análisis de cadenas y empuja a cada personaje a la pila hasta que se alcanza un cierre"
.La segunda mitad del código luego empuja la longitud de la pila
l
, comprueba si es cero?!
y, de ser así, el programa termina;
. De lo contrario, el puntero de instrucción continúa, generando la parte superior de la pilao
antes de ejecutarlobb+0.
, lo que teletransporta el puntero a la posición(22, 0)
justo antes del
, creando un bucle.ASCII Art N
Con espacio para mayor claridad. Puede probar esto en el nuevo intérprete en línea aquí y ver el puntero de instrucciones dar vueltas y vueltas, solo recuerde ingresar un número en el cuadro de texto "Pila inicial". Si está ejecutando a través del intérprete de Python, use la
-v
bandera para inicializar la pila, por ej.Para este programa, colocamos la entrada
n
en el registro con&
y presionamos un 0, que llamaremosi
"iteraciones". El resto del programa es un bucle gigante que dice así:Luego repetimos el ciclo desde el principio.
Las flechas
^>v<
cambian la dirección del flujo del programa y los espejos/\
reflejan la dirección del flujo del programa.GCD
Aquí hay un ejemplo de cómo se vería un programa de golf> <>. Una vez más, puede probar esto en el intérprete en línea (ingrese dos valores separados por comas en el cuadro "Pila inicial", por ejemplo
111, 87
) o utilizando el-v
indicador del intérprete de Python, por ejemploEste programa utiliza el algoritmo euclidiano. Aquí hay un GIF que preparé antes:
Tenga en cuenta que> <> es toroidal, por lo que cuando
v
se ejecuta la instrucción de la parte inferior izquierda, el puntero de la instrucción va hacia abajo, se envuelve y vuelve a aparecer en la parte superior.Editar: Al hacer que el código se ejecute completamente de derecha a izquierda , @randomra logró reducir tres bytes con
Supongo que no lo jugué lo suficiente :)
fuente
><>
es un palíndromo.2012 - Elemento
Este es un lenguaje que inventé a principios de 2012 para ser un lenguaje simple de golf. Con esto, quiero decir que hay muy poca o ninguna sobrecarga del operador. Los operadores también son más simples y menos numerosos que la mayoría de los idiomas modernos de golf.
Las características más interesantes de este lenguaje son sus estructuras de datos. Hay dos pilas y un hash que se utilizan para almacenar información.
La pila m es la pila principal, donde se realizan operaciones aritméticas y la mayoría de las demás operaciones. Cuando se ingresan o imprimen datos, aquí es donde van o se recuperan.
La pila c es la pila de control. Aquí es donde tiene lugar la aritmética booleana. Los bucles If y While utilizan los valores superiores de la pila c como condición.
El hash es donde se almacenan las variables. los
;
y~
almacenar y recuperar datos del hash, respectivamente.Element es un lenguaje muy débilmente escrito. Utiliza la capacidad de Perl para interpretar libremente los números como cadenas y viceversa.
Mientras lo hago, también podría incluir toda la documentación para el idioma. Puede encontrar el intérprete original de 2012, escrito en Perl, aquí mismo . Actualización: he creado una versión más utilizable, que puedes encontrar aquí .
Tarea 1 - Imprimir texto
Una de las partes más incómodas del lenguaje es la falta de delimitadores de cadena, por lo que se necesitan caracteres de escape en esta cadena. El
`
al final imprime la cadena.Tarea 2 - ASCII Art N
Aquí, serás testigo de alguna manipulación de la pila. Para que la explicación sea un poco más fácil de formatear, reemplazaré la nueva línea con una
L
y el espacio con unaS
.Después de hacer un poco de golf extremo de esta respuesta, encontré una solución de 39 bytes, aunque es mucho más complicado.
Tarea 3 - MCD
Este es un método basado en pila.
fuente
2012 - Julia
Historia del lenguaje
Julia fue desarrollada en 2012 por Jeff Bezanson, Stefan Karpinski y Viral Shah, mientras que Jeff era estudiante en el Instituto de Tecnología de Massachussets (MIT), asesorado por el profesor Alan Edelman. Fueron motivados por el deseo de un lenguaje de programación que fuera de código abierto, rápido y dinámico (entre muchas otras cosas) mientras mantenía la facilidad de uso en una variedad de aplicaciones. El producto fue Julia, un nuevo enfoque para la informática científica de alto rendimiento.
"¡Hola Mundo!" Variante
¡Imprimir en STDOUT en Julia es bastante simple!
ASCII Art N
El código tiene sangría para facilitar la lectura, pero Julia no impone restricciones al espacio en blanco.
GCD
Lo último enumerado en la función se devuelve implícitamente.
fuente
1988 - Mathematica
¿O debería llamarlo Wolfram Language? ?
Tarea 0
El creador de Mathematica es Stephen Wolfram, el Fundador y CEO de Wolfram Research. Antes del desarrollo de Mathematica, era físico. Hubo una gran cantidad de cálculo algebraico en física, por lo que se convirtió en un usuario de Macsyma .
Wolfram obtuvo su PHD en 1979, cuando tenía 20 años. Pensó que necesitaba un mejor CAS que Macsyma para hacer física, por lo que comenzó a escribir SMP (el "Programa de Manipulación Simbólica"). La primera versión de SMP se lanzó en 1981. SMP fue el predecesor de Mathematica. Aunque tuvo una profunda influencia en Mathematica, ninguno de sus códigos fue utilizado para Mathematica.
En 1986, Wolfram decidió escribir un "sistema de cómputo definitivo". Comenzó a escribir el código en 1986 y fundó Wolfram Research en 1987. Finalmente, Mathematica 1.0 fue lanzado el 23 de junio de 1988.
No encontré Mathematica 1.0. De hecho, Mathematica 1.0 no tenía una versión de Windows ni de Linux. Pero encontré Mathematica 2.0 en un sitio web chino. Todavía se puede ejecutar en Windows XP.
Tarea 1
O simplemente:
Tarea 2
En Mathematica de hoy, podemos escribir:
Al igual que Julia y R , esta es una solución matricial. En Mathematica, puede definir una matriz dispersa utilizando la coincidencia de patrones.
Sin embargo,
SparseArray
se introdujo en Mathematica 5.0, por lo que no podemos usarlo en Mathematica 1.0.Aquí hay una solución que funciona en Mathematica 1.0:
No podemos escribir
f[i_, 1 | i_ | n] = "N"
porqueAlternatives
se introdujo en Mathematica 2.0.Tarea 3
Podemos usar la función incorporada:
O podemos usar la definición del MCD:
O podemos usar el LCM , aunque más comúnmente el LCM se calcula a partir de GCD:
O podemos usar el algoritmo euclidiano con coincidencia de patrones:
O como una función anónima:
Todas las funciones anteriores se introdujeron en Mathematica 1.0.
fuente
1999 - XSLT
El Consorcio de la World Wide Web (W3C) creó XSLT para transformar XML en HTML, texto, etc. Los siguientes ejemplos asumen que la entrada está encerrada en
<input>..</input>
etiquetas.Tarea 1
Este es simple. Coincide con un
input
etiqueta en el nivel superior y la reemplaza con la salida deseada.Tarea 2
Este define 2 plantillas recursivas,
loop
yspaces
.loop
con parámetrosi
yn
generará la salida deseada paran
, comenzando en la posicióni
.spaces
con parámetron
generarán
espacios.Tarea 3
La entrada para esto debe estar en las
<input><num>..</num><num>..</num></input>
etiquetas.Esta es solo una plantilla recursiva
gcd
que utiliza el algoritmo euclidiano.fuente
2014 - CJam
CJam fue creado por el usuario aditsu PPCG y fue lanzado alrededor de abril de 2014 .
"¡Hola Mundo!" Variante
CJam imprime automáticamente el contenido de la pila al final del programa
ASCII Art N
Explicación del código:
Toma la altura / anchura de N como entrada a través de STDIN. Pruébalo en línea aquí
GCD
Toma los dos números como entrada a través de STDIN. Pruébalo en línea aquí
fuente
ri_S*0'NtW'Nta1$*\,Sf*'Nf+..e>N*
en la CJam moderna.1990 - Haskell
Haskell es un lenguaje funcional puro (¿o debería decir: el más popular ?). Se destaca de la corriente principal por su modelo de evaluación inusual (por defecto, todo es vago o, técnicamente, no estricto) y por su sistema de tipo basado en Hindley-Milner que, incluso ahora, sigue siendo uno de los más poderosos.
Tarea 1
Tarea 2
Demostración, imprima toda la lista infinita (hasta que el usuario aborte o el mundo termine ...)
Por supuesto, puede acceder fácilmente a uno de estos, accediendo solo a un elemento de la lista infinita:
Tarea 3
fuente
1972 - INTERCAL
Y pensaste que Fortran y Cobol eran raros. ¡Esto es una locura!
Tarea 1
No voy a tratar de explicar el sistema de entrada y salida de INTERCAL; Solo lee esto y espero que no mueras.
Tarea 2
Gracia divina. Esto me llevó un poco entender. Los números de las etiquetas son un desastre y, por lo tanto, reflejan eso. No voy a tratar de explicar esto a menos que alguien pregunte.
Tarea 3
Este es un poco más simple. Debido a la rareza de INTERCAL, debe ingresar los números de esta manera:
Por ejemplo, para obtener el MCD de 42 y 16, ingresaría:
También imprime el número en números romanos ... ¡porque eso es INTERCAL para ti!
fuente
PLEASE GIVE UP
. Ya lo hice .-.1967 - APL
En 1957, en la Universidad de Harvard, Ken Iverson comenzó a desarrollar una notación matemática para la manipulación de matrices. Durante la década de 1960, su notación se desarrolló en un lenguaje de programación en IBM. La primera implementación parcial se creó en 1963, e incluso se usó en una escuela secundaria para enseñar a los estudiantes sobre las funciones trascendentales. Una implementación completa y utilizable tuvo que esperar hasta 1965. Durante dos años solo fue utilizada internamente por IBM. En 1967, IBM lanzó al público un intérprete APL que se ejecutó en la computadora IBM 1130, que se había terminado en 1966. Puede comprender que es un poco difícil elegir un año para ello, sin embargo, creo que debería ser 1967, Como este es el primer año, se puso a disposición del público una implementación completa. Si alguien realmente no está de acuerdo, podría cambiarlo.
El código fuente de APL \ 360 está en línea , al igual que un emulador. Esto es lo que he usado para probar estos ejemplos. Data de 1967, y junto con APL \ 1130 (para el mencionado IBM 1130) es más o menos el verdadero original. Como se esperaba, es muy primitivo. Carece de soporte para sutilezas como letras minúsculas, cualquier operador solo funciona con funciones incorporadas, y el conjunto de funciones incorporadas es muy escaso (en particular,
∨
es únicoor
y no se duplicagcd
). La descripción completa original está disponible aquí , sin embargo, noté que la versión que tenía ni siquiera está completa con respecto a ese documento, faltando⍎
entre otros.He proporcionado los programas tanto en formato Unicode (para que pueda leerlos) como en la codificación original (para que pueda cortarlos y pegarlos en la ventana APL del emulador).
Increíblemente, estos programas se ejecutan correctamente sin ningún cambio (excepto la codificación) en las versiones modernas de Dyalog, NARS2000 y GNU APL. Así que creo que he encontrado la manera de escribir APL portátil: ¡solo finja que es 1967!
Tarea 1:
Unicode:
APL \ 360:
Tarea 2:
Unicode:
APL \ 360:
Tarea 3:
He resuelto esto de la manera recursiva estándar. En teoría, podría hacer algo inteligente y orientado a la matriz, como la respuesta J; en la práctica, sin embargo, el uso de memoria O (N) y abruma rápidamente el hardware y el software de la era Flower-Power.
Unicode:
APL \ 360:
fuente
1996 - Ocaml
Estaba esperando más de un día para que alguien llenara 1996, para poder llenar Ruby. Bueno, ¿por qué no aprender OCaml entonces, parece similar a haskell ...
Hola Mundo
ASCII
Cuerdas mutables!
GCD
No
==
e infijomod
, eso es lindofuente
2005 - Preludio
Preludio es un lenguaje muy divertido, cuyo código fuente se compone de varias "voces" que se ejecutan en paralelo y que yo realmente disfruto de la solución de problemas en . Se supone que es la representación ASCII de su fuga de lenguaje hermano , que en realidad toma archivos .midi como código fuente y codifica las instrucciones que se encuentran en Prelude como intervalos en las melodías de las voces.
Prelude es bastante minimalista, pero Turing completo (siempre que esté utilizando al menos 2 voces). Como dije, las voces (líneas de código) se ejecutan simultáneamente, columna por columna. Cada voz opera en su propia pila, que se inicializa en un número infinito de ceros. Prelude admite las siguientes instrucciones:
Algunas notas adicionales:
^
en la parte superior se copian las voces de la voz inferior (y viceversa).?
y!
en la misma columna se ejecutan de arriba a abajo.?
y!
leer y escribir caracteres con el código de caracteres correspondiente. Sin embargo, el intérprete de Python también tiene un interruptor en su código para imprimir los números en su lugar. Para fines de prueba, en realidad estoy usando una versión modificada que también puede leer números en lugar de caracteres. Pero el consenso aquí es que la entrada / salida numérica en realidad se puede dar como valores de byte, por lo tanto, estas modificaciones no son necesarias para hacer programas válidos que se ocupen de números.(
y)
no necesita estar en la misma voz. La voz utilizada para la condición es siempre la que(
aparece. Por lo tanto, la posición vertical de la)
es completamente irrelevante.(
se ejecuta solo una vez antes de que comience el ciclo, independientemente de si se ingresó o no. Del mismo modo, cualquier instrucción en la misma columna que a)
se ejecuta al final de cada iteración, independientemente de si el bucle se cerrará después de esta iteración.Primero te mostraré los tres programas sin mucho comentario. Puede encontrar explicaciones extensas a continuación.
Los programas
"¡Hola Mundo!" Variante
Si está utilizando el intérprete de Python, asegúrese de que
NUMERIC_OUTPUT = False
.ASCII Art N
Para facilitar su uso, este programa se beneficia de leer la entrada como números, pero la salida no debe ser numérica. Entonces, si está utilizando el intérprete de Python modificado, establezca
GCD
Esto se usa mejor con todas las entradas / salidas numéricas, es decir
Explicaciones
"¡Hola Mundo!" Variante
Esto es bastante sencillo. Estoy usando 3 voces para generar sucesivamente los códigos de caracteres para todos los personajes
Prelude was made in 2005!
. Comienzo computando8 + 9*8 = 80
, que es el código de caracteres deP
:Después de eso, solo copie el código de caracteres anterior y sumo o reste la diferencia al siguiente. Aquí está el código, pero con cada uno
!
reemplazado por el carácter que se está imprimiendo (y_
para espacios y%
para los dígitos):El final
55+!
imprime una nueva línea final, solo porque es más agradable.Como nota al margen, el número de voces es bastante arbitrario para esta tarea, pero 3 es bastante conveniente porque es el número más grande en el que cada voz puede acceder directamente entre sí.
ASCII Art N
Con 5 voces, este es definitivamente uno de los programas más complejos que he escrito hasta ahora. Las voces tienen aproximadamente los siguientes propósitos:
N-1
para usar en el bucle interno.32
espacio para imprimir convenientemente.78
para imprimir convenientementeN
s.Veamos el código parte por parte. Primero, estoy creando el
32
as-4 + 9*4
y el78
as6 + 9*8
:Ahora estoy imprimiendo un solo
N
(porque siempre necesitamos uno) mientras leo la entradaN
y el almacenamientoN-1
yN-2
en las dos primeras voces:A continuación, hay un "bucle" condicionado
N-1
. Al final del ciclo, la segunda voz siempre se reduce a0
, y el ciclo sale después de la primera iteración. Entonces, esencialmente, esto soloif(N > 1){...}
. Después del bucle, imprimimos una nueva línea final. Para recapitular, ahora tenemos el siguiente marco:Dentro de este condicional, primero
N-2
espacios y un soloN
para completar la primera fila, y también almacenamosN-1
en la primera voz para uso futuro:Ahora la verdadera carne del código. Primero, hay un bucle externo, que imprime
N-1
filas. Para cada fila, primero imprimimos una nueva línea y unaN
. Luego, recorremos losN-2
tiempos, imprimiendo espacios oN
s (más sobre eso más adelante). Y finalmente imprimimos otroN
:Finalmente, la parte divertida: imprimir cada fila (y obtener la posición de la
N
derecha). Realmente no hay un if / else en Prelude, así que tengo que construirlo yo mismo usando dos bucles en diferentes voces. La condición se puede obtener fácilmente restando la variable de bucle interno y externo; obtenemos0
si queremos imprimirN
y algo distinto de cero si queremos imprimir un espacio.La idea básica de un if / else en Prelude es colocar un bucle después del valor relevante, el código "if" (o no cero), y salir inmediatamente presionando a
0
. En otra voz, mantienes un valor distinto de cero y otro ciclo después del ciclo "if". Durante el ciclo "if" pones un cero encima de esa otra voz, para evitar que se ejecute el "else". Hay cierta flexibilidad en si empuja los valores cero encima de los valores distintos de cero o simplemente descarta el valor distinto de cero si hay un cero debajo, pero esta es la idea general. Es posible que también deba realizar una limpieza posterior, si desea seguir usando la voz relevante. Así es como se ve el código:¡Y eso es!
GCD
Esto es "solo" una implementación iterativa del algoritmo euclidiano. Pero el módulo en Prelude es un poco molesto, principalmente porque no se puede verificar fácilmente si un número es positivo o negativo. Este código hace uso de una implementación de signum que escribí hace un tiempo . Es decir, una gran parte del código simplemente convierte un número en
-1
,0
o1
. Esto puede convertirse fácilmente en una condición para números positivos o negativos sumando o restando1
.Entonces tenemos cuatro voces esta vez. La primera voz simplemente realiza un seguimiento
b
y contiene la condición de terminación principal (es decir, el bucle sale cuando seb
convierte0
). La segunda voz contienea
y con la ayuda de las voces tres y cuatro cálculosa % b
, antes de intercambiar el resultado con el anteriorb
. Finalmente, las!
impresionesa
cuandob == 0
.Veamos primero la parte de signum :
El número de entrada
n
se encuentra en la primera de esas voces (la segunda voz en el programa completo). El resultado terminará en la voz inferior. Se espera que las otras dos voces estén vacías (es decir, llenas de ceros). Tenga en cuenta que, sin == 0
, se saltan ambos bucles y la voz de fondo todavía contiene0
, justo lo que queremos.Si
n
no es cero, se ingresa el primer bucle pequeño. Presionamos un cero para salir de inmediato, colocamos dos copiasn
en la voz media y una1
en la voz inferior. Ahora la idea básica es incrementar una de las copiasn
mientras se disminuye la otra copian
hasta que una de ellas llegue a cero. Mientras lo hace, la1
voz en la parte inferior cambia su signo todo el tiempo (lo que se hace fácilmente restando de0
debajo de él en la pila). Esto se configura de tal manera que cuando uno de los números llegue a cero, la voz inferior contendrá el signo correcto.Ahora módulo se implementa restando
b
a partira
hasta que el resultado es negativo. Cuando eso sucede, agregamos unob
nuevamente. Esa es esta parte:Observe la construcción if / else en la parte inferior, que es similar a la que utilicé para la Tarea 2.
fuente
2007 - Scratch
Scratch es un lenguaje hecho por el MIT con fines educativos. He estado muy involucrado con esto durante 5 años; Más sobre eso más tarde.
Todo esto se puede ver aquí .
Estoy muy apurado ahora y explicaré los fragmentos más tarde. Sin embargo, espero que se expliquen por sí mismos.
Tarea 1
Tarea 2
Tarea 3
fuente
1972 - C
Todos sabemos acerca de C, ¿no? C fue creado en Bell Labs, junto con Unix. Unix se escribió en gran parte en C. Todos los derivados modernos de Unix todavía se escriben en gran medida en la sintaxis de C. C ha influido en muchos, muchos lenguajes de programación. Es probablemente el lenguaje de programación más antiguo que todavía se usa ampliamente para nuevos desarrollos.
C en sí es un descendiente de B, que espero que también termine en esta lista. No había lenguaje de programación 'A': B es una variante de BCPL, que a su vez es una CPL reducida. Ninguno de estos idiomas fue muy popular. Sin embargo, BCPL fue el idioma en el que se escribió el primer programa "Hello World". Otro hecho interesante es que B tenía ambos
/* */
y//
comentarios, pero C dejó caer los//
comentarios. Posteriormente se reintrodujeron en C con el estándar C99.Los programas C aquí se probaron con el compilador Unix V5 C, de 1974. Este fue el compilador C más antiguo que pude encontrar y poner en funcionamiento, y estos programas no se compilarán en un compilador C moderno. (Uno de los cambios realizados es que los operadores de mutación como se
+=
solían escribir=+
).#include <
...>
aún no existía. Tampoco gran parte de la biblioteca estándar. Tenía que escribir el míoatoi
. Revisé parte del código fuente V5 para descubrir qué cosas estaban permitidas y cuáles no. La versión que utilicé fue la primera en incluirstruct
s, pero como no los usé , y la sintaxis no parece haber cambiado mucho hasta V7 (como K&R C), esto podría funcionar también con versiones anteriores.He hecho todo lo posible para escribir mi código en el mismo estilo que usa el código fuente V5. (Sin embargo, eso no es terriblemente consistente).
Busque aquí enlaces a Unix V5, un emulador, e instrucciones sobre cómo ejecutarlo en una computadora moderna.
Tarea 1
Tarea 2
Tarea 3
fuente
cat > file.c
. (Termina con Ctrl-D, como siempre). También, C ha cambiado menos de lo que parece: si se cambia la=*
y=+
en lasatoi
funciones de los equivalentes modernos*=
y+=
, un moderno GCC los compilará bien y correr, también. Casi ninguna advertencia, incluso.2009 - Idris
Idris es un lenguaje funcional puro de tipo confiable que enfatiza que, de hecho, es prácticamente utilizable para aplicaciones del mundo real, además de ofrecer las posibilidades de prueba extremadamente rigurosas que se pueden lograr con tipos dependientes.
Tarea 1
Tarea 2
Este no es un programa sino solo una función (más precisamente, valor dependiente ), que produce la letra N deseada como una matriz bidimensional.
Tarea 3
Tenga en cuenta que tuve que elegir el nombre
gcd'
porque yagcd
está definido en el preludio Idris.fuente
:
y::
, y cambiaron_
aZ
.Z
es en realidad el constructor de0 : Nat
. El guión bajo se usa en Idris al igual que en Haskell.:)
2014 - Pyth
Como tenemos CJam, también podríamos tener Pyth para completar :)
Pyth es un lenguaje de golf de @isaacg que se compila en Python. Es notable por ser procesal y por usar la notación de prefijo. Pyth apareció por primera vez alrededor de junio de 2014 .
"¡Hola Mundo!" Variante
Tenga en cuenta la falta de una cita de cierre, que es opcional si un programa Pyth termina en una cadena.
ASCII Art N
Pruébalo en línea . El Python equivalente es:
O expandido (la primera y la tercera línea son implícitas):
GCD
Este programa utiliza el algoritmo euclidiano y toma dos números separados por una nueva línea. Pruébalo en línea .
i.uQ
es aún más corto si usamos el incorporado para GCD. Esto es equivalente aprint(gcd(*eval(input())))
(tomar dos números separados por comas como entrada).fuente
1964 - Dartmouth BASIC
BÁSICO es una familia de lenguajes de programación de alto nivel y propósito general cuya filosofía de diseño enfatiza la facilidad de uso. En 1964, John G. Kemeny y Thomas E. Kurtz diseñaron el lenguaje BASIC original en el Dartmouth College de New Hampshire. Querían permitir que los estudiantes en otros campos además de las ciencias y las matemáticas usen computadoras.
Estoy mirando este manual en BASIC de 1964, y este emulador del Sistema de Tiempo Compartido de Darthmouth que funcionaba. El servidor aún está activo, pero lamentablemente, registrar una cuenta parece ser imposible. Por ahora, estos programas deberían funcionar teóricamente:
Tarea 1
Tarea 2
Salida de algo como:
Observe cómo se ingresa la entrada como parte del programa (
70 DATA 5
); laREAD
forma de instrucción en la parte superior obtiene datos desde allí. No hay concatenación de cadenas, pero la sección 3.1 del manual describe cómoPRINT
se escriben los resultados en "zonas" tabuladas en la salida.Tarea 3
La versión lenta del algoritmo de Euclides:
Salida:
fuente
2010 - WTFZOMFG
WTFZOMFG es un lenguaje esotérico basado en Brainfuck. Fue creado por Jay Songdahl en 2010. "WTFZOMFG" es la abreviatura de "¿Cuál es esa función? ¡Zen optimizado archivos maliciosos optimizados!" .
Aquí hay un compilador para sistemas * nix .
Tarea 1
Tarea 2
Explicación:
Lo siento. No soy bueno escribiendo explicaciones.
Tarea 3
Algoritmo euclidiano. WTFZOMFG no tiene un comando para mod, así que tengo que usar
d
(dividir),m
(multiplicar) ys
(restar).fuente
2009 - Ir
Go es un lenguaje de programación desarrollado por Google. El desarrollo comenzó en 2007, pero Go se anunció en noviembre de 2009.
Go es un lenguaje de tipo estático influenciado por C que enfatiza la concisión, simplicidad y seguridad.
Tarea 1:
La primera línea declara el paquete del código. Incluso un ejemplo simple como imprimir una línea debe ser parte de un paquete. Y el ejecutable siempre se llama
main
.Tarea 2:
Go tiene una declaración variable bastante concisa (
i := 0
es lo mismo quevar i int = 0
), y el compilador determina el tipo. Esta suele ser una característica más común en lenguajes dinámicos. Usando esta notación corta también es muy fácil asignar funciones a variables (f := func(x int) int {/* Code */}
) y crear Closures.Tarea 3:
Aquí puedes ver el
a, b = b, a%b
sintaxis, que es realmente agradable. No sé el nombre exacto, pero en Python se llama desempaquetado de tuplas. Usando la misma manera, puede devolver múltiples valores de una función (func f() (int, string) { return 42, "Hallo"}
).Otra cosa que sucede en este código es el bucle. El bucle for es el único bucle en Go. Los bucles while o los bucles do-while no existen. Pero puede crear fácilmente un equivalente para el bucle while
for condition {}
o un bucle infinitofor {}
.fuente
1991 - Python
Historia del lenguaje
A finales de la década de 1980, Guido van Rossum comenzó a idear Python como un pasatiempo. Su nombre proviene de Flying Circus de Monty Python, un programa de televisión británico del que Rossum es fanático. La primera implementación de Python comenzó en 1989 y se lanzó en 1991. Ha aumentado su popularidad a lo largo de los años, convirtiéndose en el idioma de elección para muchos cursos introductorios de informática.
"¡Hola Mundo!" Variante
Tenga en cuenta los paréntesis alrededor de la entrada a
print
. Aunque esta sintaxis funciona en Python 2, normalmente en Python 2 omitiría estos paréntesis. Sin embargo, son necesarios en Python 3. Como lo sugirió Zach Gates, los paréntesis se utilizan para garantizar que el código presentado aquí funcione en todas las versiones.ASCII Art N
Las funciones se definen usando
def
. La concatenación de cadenas se realiza utilizando+
y la repetición de cadenas con*
.GCD
Tenga en cuenta que Python requiere espacios en blanco estructurados.
fuente
1968 - Algol 68
Algol 68 fue definido por el IFIP Working Group 2.1 como sucesor de Algol 60.
Es un lenguaje orientado a la expresión en el que todo tiene un valor. También es ortogonal, en el que puede usar cualquier construcción de cualquier manera. Esto significa que las expresiones pueden estar en el RHS y el LHS de una tarea, por ejemplo.
Todas las estructuras de control tienen una forma abreviada, así como una forma larga con expresiones. También permite las definiciones de operadores.
Los objetivos del lenguaje se citan como:
Estos programas han sido probados con el intérprete Algol 68 Genie , que es una implementación completa del lenguaje.
Algunas características que los programadores modernos pueden encontrar diferentes, es que las declaraciones vacías no están permitidas. No puedes simplemente agregar en
;
todas partes. Debe usar laSKIP
declaración si no quiere tener nada explícitamente. También permitió la codificación de programas concurrentes muy fácilmente. Algol 68 también, en particular, utilizó palabras clave hacia atrás como terminadores, como esac , od , fi , etc.El lenguaje tenía una representación utilizada para escribir el código que usaba muchas fuentes que representaban palabras clave en negrita e identificadores en cursiva , por ejemplo. En ese momento, y probablemente aún, ningún compilador implementó esta característica del diseño. El lenguaje permitió varias representaciones concretas diferentes de programas que utilizan modos de eliminación . Esto permitió que los programas se prepararan utilizando conjuntos de caracteres limitados, como los que se pueden encontrar en las computadoras en la década de 1960. Considere el fragmento de un programa corto, que se representaría como:
Esto podría prepararse para un compilador en modo de eliminación principal como:
En el modo de eliminación de puntos , esto sería:
En caso de modo de eliminación, esto sería:
Tengo un gran cariño por este lenguaje, ya que trabajé en una de las implementaciones del compilador, así como en la programación exclusiva durante muchos años.
Tarea 1
El punto a tener en cuenta aquí son los paréntesis dobles. Esto es porque imprimir es una función que toma un solo argumento, que es una matriz de longitud variable de la unión de todos los tipos. Los paréntesis internos son el constructor de la matriz. Así es como se maneja el polimorfismo en este lenguaje fuertemente tipado.
En caso de modo de pelado:
Tarea 2
En caso de modo de pelado:
Tarea 3
En caso de modo de pelado:
fuente
1962 - SNOBOL
El "Lenguaje orientado a cadenas y simbólico". Al principio, al parecer, se llamó al intérprete de expresión simbólica, 'SEXI', que luego tuvo que cambiarse para evitar que los nerds de la década de 1960 se sonrojaran al presentar sus trabajos. Historia verdadera.
Este fue uno de los primeros idiomas que podía lidiar con cadenas y patrones de forma nativa. De hecho, la primera versión de SNOBOL tenía la cadena como su único tipo de datos. Las matemáticas se hicieron luego mediante análisis. La implementación inicial se realizó en el IBM 7090. Parece haber desaparecido hace mucho tiempo, al menos, no pude encontrarlo. Lo que encontré fue el documento original que lo describía, así como un intérprete SNOBOL3 en Java, que puede ejecutarse en una computadora moderna .
El primer SNOBOL tenía casi solo coincidencia de patrones y aritmética básica. SNOBOL 3 luego agregó funciones y cambió la E / S, pero por lo demás parece haberse mantenido compatible con versiones anteriores. SNOBOL 4 cambió la sintaxis y, a partir de ahí, se convirtió en Icon , que mantiene la coincidencia de patrones pero, de lo contrario, casi parece un lenguaje de programación "normal".
Los programas que he escrito utilizan solo la funcionalidad descrita en el documento original, por lo que deberían funcionar con el SNOBOL original con la excepción de las E / S, que hice en el estilo SNOBOL3 para que el intérprete de Java pudiera ejecutarlas. Según el artículo, parece que la diferencia es que SNOBOL1 usa la coincidencia de patrones con una
SYS
variable especial , mientras que SNOBOL3 usa variables de entrada y salida:SYS .READ *DATA*
DATA = SYSPPT
SYS .PRINT 'A STRING' AND VARIABLES
SYSPOT = 'A STRING' AND VARIABLES
Hacer estas sustituciones debería hacerte SNOBOL "real" 1. Por supuesto, entonces no puedes ejecutarlo.
Tarea 1
Tarea 2
Esto muestra matemática, manejo de cadenas y control de flujo. SNOBOL3 tiene funciones útiles, como
EQ
verificar la igualdad; el SNOBOL original no lo hizo, así que no los he usado.Tarea 3
Primero, el aburrido. Lo único que se debe tener en cuenta es el cheque más pequeño que, que muestra exactamente cómo estaba realmente SNOBOL orientado a cadenas:
(B - A) '-'
significa "¿el resultado de BA contiene un signo menos?". SNOBOL3 también puede hacerloLE(B,A)
, pero SNOBOL 1 no pudo (al menos el artículo no lo menciona).Por supuesto, cuando tiene un lenguaje basado completamente en cadenas y coincidencia de patrones, sería una lástima no poder usar la coincidencia y el reemplazo de patrones. Por lo tanto, aquí hay uno de esos GCD basados en unario, incluidas las rutinas para convertir ay desde unario.
fuente
2012 - TypeScript
TypeScript es un lenguaje de programación gratuito y de código abierto desarrollado y mantenido por Microsoft.
El objetivo principal es: cualquier navegador. Cualquier anfitrión Cualquier sistema operativo Fuente abierta. Fue lanzado en octubre de 2012.
Hola TypeScript
Arte ASCII
GCD
Pruébelo en línea y haga una captura de pantalla del mismo.
fuente
2011 - Dart
Dart es un lenguaje de programación de código abierto desarrollado por Google que se desarrolla como un reemplazo para Javascript (aunque se compila a JavaScript). Fue presentado por Google en 2011 durante la conferencia GOTO.
"¡Hola Mundo!" Variante:
ASCII Art N:
Método de fuerza bruta, se ejecuta en 0 (n²), pero realmente no debería importar a menos que use un número gigante.
GCD
Método simple de Euclides portado desde Snap! ejemplo anterior
fuente
2010 - óxido
Rust es un lenguaje de programación compilado de múltiples paradigmas y propósito general desarrollado por Mozilla Research. Está diseñado para ser un "lenguaje seguro, concurrente y práctico", que admite estilos puramente funcionales, de actor concurrente, de procedimiento imperativo y orientado a objetos. Wikipedia
Tarea 1
Tarea 2
Explicación:
se encarga de imprimir solo vertical (izquierda y derecha
|
) y diagonal (\
)Tarea 3
implementación simple de Euclidean_algorithm
fuente
2015 - Muffin MC
Muffin MC es un macro-lenguaje Turing completo, divertido (pero serio), funcional y minimalista escrito por Franck Porcher ( http://franckys.com ) a mediados de febrero de 2015 por necesidad como una herramienta (rápida) para potenciar un hoja de cálculo que se utilizará como el único controlador front-end para pilotear e impulsar todas las operaciones relacionadas con el inventario asociadas con un sitio comercial basado en Prestashop para una nueva marca de moda tahitiana: Mutiny Tahiti ( http://mutinytahiti.com - próximamente lanzado).
Muffin MC es un acrónimo de MU tiny F unctional F lexible IN line M acro C ommand language.
Para cumplir con nuestros requisitos, las características centrales de Muffin MC se han diseñado en torno a construcciones semánticas integradas flexibles y eficientes de primera clase, como iteradores , evaluación perezosa , multifunctores , productos de cadena .
Muffin MC tiene sus raíces en la programación funcional (pragmática), FLisp y Perl. Es totalmente compatible con la recursividad (sin ninguna optimización), se escribe de forma dinámica y se define de forma dinámica (enlace superficial). Ofrece a sus usuarios una estructura de datos solamente, aparte de los átomos de tipos de datos básicos (átomos, cadenas, números): ¡listas!
La semántica de la lista MC de Muffin (tipo de) toma prestada la semántica de conjunto de potencia , es decir:
Para conciliar con esto, lo siguiente puede ayudar:
Como tal, acceder a un elemento de lista vacío produce la lista vacía, ¡y no es un error! De hecho, Muffin MC se esfuerza por arrojar la menor cantidad de errores posible al extender de ese modo la semántica de muchas operaciones tradicionales.
Tarea 1
#(...)
es el comando macro Muffin MC para aplicar una función en una lista de argumentos no evadidos, aquí la función incorporadasay
, tomada de Perl.#(say 1 2 3 ...)
es funcionalmente idéntico amap {say $_} (1,2,3,...)
Tarea 2
Define la función
ascii-art()
:Ascii-art()
La forma de trabajo más corta (88 bytes):=(var val...)
es el comando macro de Muffin MC para definir una variable o reasignarla.$(var)
es el comando macro de Muffin MC para acceder al valor de una variable. Naturalmente acepta el formulario$(v1 v2 ...)
para acceder a muchas variables a la vez.=(* var1 val1 var2 val2 ...)
es la extensión del comando macro Muffin MC=(...)
para manejar asignaciones paralelas.Las variables
_1, _2
, ... tienen un alcance dinámico (mecanismo de encuadernación superficial) y se configuran automáticamente para que se unan a los argumentos de la función. Tomado de Perl5, las variables del sistema#
(número de argumentos) y@
(lista de argumentos) también se configuran automáticamente.Las funciones son simplemente variables vinculadas a cualquier número de declaraciones de Muffin MC .
Esta solución interesante proviene de combinar dos características integradas naturales de Muffin MC :
El comando macro Muffin MC
I(...)
, para definir iteradores de ciclos, más tarde utilizado con la forma funcional#(my-iterator want-number-of-values)
,El muffin MC cadena de producto constructo, una extensión de la interpolación de variables natural, que, dado cualquier cadena
"F1 F2 F3..."
, donde el F i s son o bien mollete MC literales de cadena o mollete MC comando de macro (formas funcionales aka), producirá tantas cadenas como dado por el producto cardinal (F1) x cardinal (F2) x ....Por ejemplo, dada la variable xa que contiene 2 valores, dice ayb, y otra variable que contiene 3 valores, dice, 1 2 3, entonces la evaluación de la cadena
"x=$(x) y=$(y))"
producirá 6 valores diferentes, a saber, en ese orden:Esta es una de las características altamente deseables del proyecto MUTINY para la que Muffin MC fue diseñada.
Ejecutarlo !
Como funciona
Nuestro algoritmo se basa en lo siguiente:
Dado un llamado a ascii-art (n), {n = 2p + 1 | p entero, p> = 0}, el arte a generar comprende n cadenas de n caracteres, entre los cuales, dos, el más a la izquierda y el más a la derecha, son fijos y siempre iguales: 'N'. Esto permite reducir el problema al producir solo las cadenas intermedias. Por ejemplo, dado n = 5, desmalezaríamos para producir las siguientes 5 cadenas intermedias, cada una compuesta de n-2 caracteres (hemos reemplazado el espacio por una '_' en aras de una mejor visualización):
Dichas cadenas intermedias se pueden producir fácilmente ciclando sobre la secuencia de 4 elementos
('_' '_' '_' 'N')
en 5 grupos de 3; dada n, la entrada de la función, dicha secuencia está hecha de n-2 caracteres'_'
, seguidos del carácter'N'
. Recorrer esta secuencia no requiere nada más que integrar la secuencia dentro de un iterador incorporado Muffin MCI(sequence)
(un iterador que realiza un ciclo para siempre sobre su secuencia inicial de valores).Luego, simplemente producimos las cadenas intermedias, de longitud n-2, pidiéndole a nuestro iterador que nos dé sus próximos valores n-2 (n - 2 caracteres), que se concatenan juntos para producir la cadena intermedia esperada.
Las n cadenas intermedias se producen repitiendo n veces el proceso anterior, utilizando un mapa para recopilar los n resultados (n cadenas de n-2 caracteres).
Utilizamos otro poderoso mollete MC constructo incorporado, es decir, el producto de cadena , para producir las n cadenas finales:
"N#(map...)N"
.Y eso es !
Tarea 3
Define la función
gcd()
:gcd()
La forma más corta real (37 bytes - 2bytes de ganancia gracias a Rodolvertice)Ejecutarlo !
rinde 9.
Eso es.
Gracias por el buen juego, y posiblemente por tu interés. El idioma está disponible para cualquiera que quiera jugar, usarlo o incluso extenderlo. Solo pídalo y con gusto lo enviaré.
Salud
Franck
PD. La implementación actual de Muffin MC está en Perl5. El código fuente es de aproximadamente 2000 líneas de Perl moderno, incluidos los comentarios, y viene incluido con un conjunto de pruebas de no regresión, que es excelente para aprender construcciones y semánticas de Muffin MC .
fuente