Muestra de idiomas


508

Notas

  • Este hilo está abierto y desbloqueado solo porque la comunidad decidió hacer una excepción . Por favor, no use esta cuestión como prueba de que usted puede hacer preguntas similares aquí. Por favor, no crear adicionales preguntas.

  • Esto ya no es un , ni las longitudes de fragmentos están limitadas por el recuento de votos. Si conoce este hilo de antes, asegúrese de familiarizarse con los cambios.

Este hilo está dedicado a mostrar características interesantes, útiles, oscuras y / o únicas que sus lenguajes de programación favoritos tienen para ofrecer. Esto no es un desafío ni una competencia, sino un esfuerzo de colaboración para mostrar tantos lenguajes de programación como sea posible.

Como funciona esto

  • Todas las respuestas deben incluir el nombre del lenguaje de programación en la parte superior de la publicación, con el prefijo a #.

  • Las respuestas pueden contener un (y solo un) factoide, es decir, un par de oraciones sin código que describan el lenguaje.

  • Aparte del hecho real, las respuestas deben consistir en fragmentos de código, que pueden (pero no tienen que ser) programas o funciones.

  • Los fragmentos no necesitan estar relacionados. De hecho, los fragmentos que están demasiado relacionados pueden ser redundantes.

  • Como esto no es un concurso, todos los lenguajes de programación son bienvenidos, siempre que se hayan creado.

  • Las respuestas que contienen más de un puñado de fragmentos de código deben usar un fragmento de pila para colapsar todo, excepto el factoid y uno de los fragmentos.

  • Siempre que sea posible, solo debe haber una respuesta por lenguaje de programación. Esta es una wiki comunitaria, así que siéntase libre de agregar fragmentos a cualquier respuesta, incluso si no la ha creado usted mismo. Hay un fragmento de pila para comprimir publicaciones , que debería mitigar el efecto del límite de 30,000 caracteres.

Se deben editar las respuestas anteriores a estas pautas. Por favor, ayuda a actualizarlos según sea necesario.

Respuestas actuales, ordenadas alfabéticamente por nombre de idioma

$.ajax({type:"GET",url:"https://api.stackexchange.com/2.2/questions/44680/answers?site=codegolf&filter=withbody",success:function(data){for(var i=0;i<data.items.length;i++){var temp=document.createElement('p');temp.innerHTML = data.items[i].body.split("\n")[0];$('#list').append('<li><a href="/a/' + data.items[i].answer_id + '">' + temp.innerText || temp.textContent + '</a>');}}})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><base href="http://codegolf.stackexchange.com"><ul id="list"></ul>

Respuestas:


413

Mathematica

Es posible que desee leer esto de abajo hacia arriba, ya que ese es el orden en que se escribió, y algunas explicaciones se referirán a fragmentos anteriores o asumirán explicaciones de más abajo.

La lista está creciendo bastante larga. He comenzado a eliminar fragmentos menos interesantes, y comenzaré a omitir fragmentos ahora. Consulte el historial de revisiones para obtener una lista completa de fragmentos hasta 41. Para algunas gemas reales, consulte los fragmentos 81 , 64 , 44 , 23 , 19 , 12 y 8 .

Longitud 143 y 144 fragmentos

Finalmente ... He estado esperando esto por un tiempo (y he estado jugando al golf durante el mismo tiempo, así que no tengo que esperar aún más). Mencioné anteriormente que también puedes ecuaciones numéricas, y que también puedes resolver ecuaciones diferenciales. Quería mostrar un ejemplo no trivial de eso.

Considere un péndulo doble en una barra (es decir, un péndulo unido a otro). Cada barra tiene una unidad de longitud y cada uno de los dos pesos de péndulo tiene una unidad de masa. También he usado la unidad de gravedad para acortar la ecuación. El siguiente fragmento de 143 caracteres resuelve las ecuaciones de movimiento lagrangianas para dicho sistema (en términos de ángulos de péndulo y momentos angulares). Se puede encontrar una derivación en este PDF , aunque es un ejercicio bastante sencillo si está familiarizado con la mecánica lagrangiana.

Es bastante ilegible, porque tuve que jugar mucho golf:

d@t@t;NDSolve[{#''@t==-#4#2''[t]Cos@d-##3#2'@t^2Sin@d-Sin@#@t&@@@{{θ,φ,1,.5},{φ,θ,-1,1}},θ@0==2,φ@0==1,θ'@t==φ'@t==0/.t->0},{θ,φ},{t,0,60}]

Lo bueno es que Mathematica muestra inmediatamente un diagrama en miniatura de cómo se ven las soluciones:

ingrese la descripción de la imagen aquí

Está bien, pero eso es un poco cojo. Queremos saber cómo se ve realmente el movimiento de la péndula. Así que aquí hay un fragmento de 144 caracteres, que anima la péndula mientras traza la trayectoria del péndulo inferior:

Graphics@{Line@{{0,0},p=θ~(h={Sin@#@#2,-Cos@#@#2}&)~t,p+φ~h~t},White,{0,0}~Circle~2.2}~Show~ParametricPlot[θ~h~u+φ~h~u,{u,0,t}]~Animate~{t,0,60}

La animación resultante se ve así:

ingrese la descripción de la imagen aquí

Tuve que hacer trampa levemente: si trazas más allá t = 30, ParametricPlotpor defecto usa muy pocos puntos de trama y la línea se vuelve bastante irregular. Pero la mayoría de las dinámicas interesantes ocurren después de ese tiempo, así que utilicé la opción PlotPoints -> 200para que la segunda mitad de la animación se vea más fluida. No es nada sustancialmente diferente, y la primera mitad parecería indistinguible de todos modos.

Creo que este será mi último fragmento, a menos que se me ocurra algo realmente alucinante. ¡Espero que hayas disfrutado esto!

Fragmento de longitud 100

GeoGraphics[{GeoStyling[Opacity[0.5]], NightHemisphere[]}, GeoBackground -> GeoStyling["ReliefMap"]]

Estaba pensando en algunas Geofunciones agradables para el fragmento 100, pero finalmente encontré algo realmente ingenioso en Tweet-a-Program , que solo tuve que robar. Lo anterior genera un mapa solar de la Tierra muy bonito para la hora y el día actuales, al superponer una forma semiopaca del hemisferio nocturno sobre un mapa en relieve:

ingrese la descripción de la imagen aquí

Longitud 81 fragmento

CellularAutomaton[{{0,2,3,If[0<Count[#,1,2]<3,1,3]}[[#[[2,2]]+1]]&,{},{1,1}},i,n]

Prometo que es el último autómata celular. Pero eso justo allí es Wireworld en 81 caracteres. Esta vez no codifiqué la regla en un solo número, a) porque creo que sería ridículamente enorme (no me molesté en descifrarlo) yb) para mostrarle otro uso más CellularAutomaton. Esta vez, la regla simplemente se especifica como una función pura, que recibe una vecindad de celdas y devuelve el nuevo valor de la celda. Este es un enfoque mucho más factible para autómatas celulares con más de 2 colores / estados.

De todos modos, configuré el ejemplo de Wikipedia en i(dos relojes que generan señales y una puerta XOR) y lo dejé correr por unos 50 pasos:

ingrese la descripción de la imagen aquí

Si está interesado, el trazado y la animación reales podrían haber sido el fragmento 77:

ListAnimate[ArrayPlot[#,ColorRules->{0->Black,1->Blue,2->Red,3->Yellow}]&/@w]

Fragmento de longitud 69

DSolve[r^2*R''[r]+2r*R'[r]-R[r]==0&&(R[r]==1&&R'[r]==2/.r->1),R[r],r]

De vuelta a algo útil. Además de los sistemas normales de ecuaciones, Mathematica también puede resolver sistemas de ecuaciones diferenciales. Lo anterior es técnicamente solo una ecuación diferencial con condiciones de contorno, pero también puede proporcionarla como un sistema de tres ecuaciones. Similar a las funciones integradoras DSolvees para soluciones exactas, mientras NDSolveque resolverá el sistema numéricamente. Lo anterior produce una solución única

{{R[r] -> 1/2 r^(-(1/2) - Sqrt[5]/2) (1 - Sqrt[5] + r^Sqrt[5] + Sqrt[5] r^Sqrt[5])}}

que ahora podría usarse fácilmente para cálculos adicionales o trazarse.

Fragmento de longitud 64

CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},i,n]

¡Te prometí más CellularAutomatonmagia! Este fragmento calcula el juego de la vida de Conways con la condición inicial ide los npasos y le brinda el resultado para todos los pasos intermedios.

Algunas palabras sobre los parámetros: 2es el número de estados de la celda. {{2,2,2},{2,1,2},{2,2,2}}da los pesos para las 9 celdas en el vecindario 3x3. Asegura que la celda en sí es distinguible de la suma de los 8 vecinos. {1,1}dice que la regla de CA depende de las celdas a 1 paso en cualquier dirección. Finalmente, 224la regla de actualización real está codificada en un solo número. Determinar este número puede ser un poco complicado, pero hay un tutorial bastante útil en la documentación . Para autómatas más complicados, un solo número no lo cortará (porque el número sería enorme). ¡Quizás lleguemos mañana! ;)

De todos modos, si introduzco una cuadrícula aleatoria iy 200 n, y envío el resultado a través de una animación ArrayPlot, podemos ver que realmente está funcionando:

ingrese la descripción de la imagen aquí

Fragmento de longitud 59

SphericalPlot3D[Re[Sin[θ]Cos[θ]Exp[2I*φ]],{θ,0,π},{φ,0,2π}]

¿Recuerdas la trama polar del fragmento 26? ¡Podemos hacer lo mismo en 3D! (De hecho, hay dos funciones: RevolutionPlot3Dpara polares cilíndricos y SphericalPlot3Dpara polares esféricos). Al igual que Graphics3Dtodas las tramas tridimensionales pueden rotarse automáticamente en Mathematica, por lo que no tiene que preocuparse por un buen ángulo de cámara por adelantado. Lo anterior traza algo así como un armónico esférico (aunque no del todo) y se ve así:

ingrese la descripción de la imagen aquí

Fragmento de longitud 52

Manipulate[Plot[x^2a+x*b,{x,-3,3}],{a,.1,3},{b,0,3}]

Este es bastante ingenioso. Manipulatetoma cualquier expresión, la parametriza con un montón de variables y luego le proporciona un widget, donde puede ajustar los parámetros y ver en vivo cómo cambia la expresión. Como expresión, generalmente tendrás algún tipo de trama. Esto es particularmente útil si está usando Mathematica en conferencias para demostrar cómo las familias de soluciones responden a la modificación de los parámetros. Lo anterior muestra cómo las ay bescalan coeficientes y el cambio de una parábola:

ingrese la descripción de la imagen aquí

Longitud 48 fragmento

Import["http://www.google.com/doodles","Images"]

ImportEs un comando bastante poderoso. Se usa tanto para cargar archivos desde el disco como desde la web. Conoce muchos formatos de archivo diferentes, y para algunos de ellos (como las páginas HTML) en realidad puede extraer datos de inmediato. Lo anterior descarga todas las imágenes de la página del doodle de Google.

Fragmento de longitud 45

EdgeDetect@ExampleData@{"TestImage","Splash"}

Tiempo para un poco de procesamiento de imágenes. Mathematica viene con una gran cantidad de datos de ejemplo, que incluyen imágenes (como Lena), texturas, modelos 3D y fragmentos de audio. Primero, cargamos uno de esos:

ingrese la descripción de la imagen aquí

¿Quieres detectar bordes? Es una llamada de función única:

ingrese la descripción de la imagen aquí

Longitud 44 fragmento

ArrayPlot@CellularAutomaton[110,{{1},0},100]

Finalmente, tengo suficientes caracteres para usar CellularAutomatony también renderizo el resultado. :) Hasta donde yo sé, CellularAutomatones la única función en Mathematica relacionada con las CA. Pero Stephen Wolfram parece considerarse el hombre número uno cuando se trata de autómatas celulares, por lo que esta función es increíblemente poderosa. Lo anterior muestra más o menos su uso más simple. Esto simula un autómata celular 1D para 100 pasos, y en realidad devolverá el estado del autómata en cada uno de esos pasos, por lo que el resultado es bidimensional. La regla es el primer parámetro, que puede especificarse en detalle a través de listas o simplemente codificarse en un solo número. Para este ejemplo, he elegido la Regla 110 bastante famosa, completa de Turing . {{1},0}define la condición inicial: una sola1delante de un fondo de ceros. Quizás muestre algunas características más CellularAutomatonen el futuro cuando tenga más caracteres disponibles: puede simular AC en dimensiones más altas, utilizando vecindarios más grandes y con más de dos estados.

ArrayPlotes otra buena utilidad de trazado que simplemente traza una lista 2D como una cuadrícula de colores sólidos que indica su valor. En el caso más simple, 0es mappend al blanco y 1al negro. El resultado del fragmento es:

ingrese la descripción de la imagen aquí

Fragmento de longitud 43

HighlightGraph[graph,FindVertexCover@graph]

Ha pasado un tiempo desde que mencioné los gráficos. Existen muchos problemas teóricos gráficos comunes en Mathematica, junto con buenas herramientas de visualización. Lo anterior, para un determinado graph, encontrará una cobertura mínima de vértice del gráfico, y luego renderizará el gráfico con esos vértices resaltados. Por ejemplo, si graphestá PetersenGraph[7,2]detrás de fragmento 18, obtenemos:

ingrese la descripción de la imagen aquí

Fragmento de longitud 42

Animate[Plot[Sin[t-x],{x,0,10}], {t,0,10}]

Es bastante simple animar cosas en Mathematica (y ni siquiera tienen que ser imágenes). Simplemente le da la expresión que se evaluará para cada cuadro y un grupo de parámetros que deberían variar en los cuadros. Lo anterior simplemente anima una trama de una onda sinusoidal en movimiento. La animación se verá como el siguiente GIF:

ingrese la descripción de la imagen aquí

Fragmento de longitud 40

SortBy[PlanetData[#, "EscapeVelocity"]&]

SortByhace lo que espera: ordena una lista en función de los valores obtenidos al asignar una función determinada a cada elemento de la lista. Pero espera, la llamada anterior no contiene una lista en absoluto. Desde Mathematica 10, hay soporte para curry o aplicación parcial para algunas funciones. Esta no es una característica del lenguaje como en los lenguajes funcionales más puristas, sino que solo se implementa manualmente para un montón de funciones donde esto a menudo es útil. Significa que el fragmento anterior devuelve una nueva función, que solo toma una lista y luego la ordena por la función dada. Esto puede ser muy útil si este orden de clasificación es algo que usará con más frecuencia en todo el código.

Y sí, hay otra buena *Datafunción: lo anterior ordenará los nombres de los planetas por las velocidades de escape de los planetas .

Longitud 39 fragmento

f[1]=1
f[2]=1
f[n_]:=f[n]=f[n-1]+f[n-2]

Prometí hacer que la función de Fibonacci sea más eficiente. Este fragmento muestra cuán trivial es la memorización en Mathematica. Tenga en cuenta que todo lo que ha cambiado es un adicional f[n]=en la tercera línea. Entonces, cuando fse solicita un nuevo valor (por ejemplo f[3]), f[3]=f[3-1]+f[3-2]se evaluará. Esto calcula f[2]+f[1], luego lo asigna a f[3](con =, no con :=!), Y finalmente devuelve el valor de nuestra llamada inicial. Entonces, llamar a esta función agrega una nueva definición para este valor, que obviamente es más específica que la regla general y, por lo tanto, se utilizará para todas las llamadas futuras fcon ese valor.

¿Recuerdas que la otra función de Fibonacci tomó 4 segundos para 30 valores? Esto necesita 3 segundos para 300,000 valores.

Longitud 37 fragmento

l//.{a___,x_,b___,x_,c___}:>{a,x,b,c}

En el último fragmento mencioné patrones. Estos se usan con mayor frecuencia en reglas , que (entre otras cosas) se pueden usar para modificar estructuras que coinciden con un cierto patrón. Así que echemos un vistazo a este fragmento.

{a___,x_,b___,x_,c___}:>{a,x,b,c}Es una regla. x_con un solo guión bajo es un patrón que se refiere a un único valor arbitrario (que podría ser una lista o similar). a___es un patrón de secuencia (véase también el fragmento 15), que se refiere a una secuencia de 0 o más valores. Tenga en cuenta que estoy usando x_dos veces, lo que significa que esas dos partes de la lista tienen que tener el mismo valor. Entonces, este patrón coincide con cualquier lista que contenga un valor dos veces, llama a ese elemento xy llama a las tres secuencias alrededor de esos dos elementos a, by c. Esto se reemplaza por {a,x,b,c}, es decir, el segundo xse descarta.

Ahora //.aplicará una regla hasta que el patrón ya no coincida. Por lo tanto, el fragmento anterior elimina todos los duplicados de una lista l. Sin embargo, es un poco más poderoso que eso: //.aplica la regla en todos los niveles. Por lo tanto, si lcontiene listas (a cualquier profundidad), también se eliminarán los duplicados de esas sublistas.

Fragmento de longitud 36

f[1]=1
f[2]=1
f[n_]:=f[n-1] + f[n-2]

¡Hora de nuevas funciones de lenguaje! Mathematica tiene algunas cosas buenas sobre la definición de funciones. Para empezar, puede proporcionar varias definiciones de funciones para el mismo nombre, para diferentes números o tipos de argumentos. Puede usar patrones para describir a qué tipo de argumentos se aplica una definición. Además, incluso puede agregar definiciones para valores individuales. Mathematica elegirá la definición aplicable más específica para cualquier llamada de función y dejará las llamadas indefinidas sin evaluar. Esto permite (entre otras cosas) escribir funciones recursivas de una manera mucho más natural que usar un Ifinterruptor para el caso base.

Otra cosa a tener en cuenta sobre el fragmento anterior es que estoy usando ambos =y :=. La diferencia es que el lado derecho de =se evalúa solo una vez, en el momento de la definición, mientras que :=se vuelve a evaluar cada vez que se hace referencia al lado izquierdo. De hecho, :=incluso funciona al asignar variables, que luego tendrán un valor dinámico.

Entonces, lo anterior, por supuesto, es solo una función de Fibonacci. Y muy ineficiente en eso. Calcular los primeros 30 números lleva unos 4 segundos en mi máquina. En breve veremos cómo podemos mejorar el rendimiento sin tener que deshacernos de la definición recursiva.

Fragmento de longitud 35

StreamPlot[{x^2,y},{x,0,3},{y,0,3}]

Un gráfico muy ordenado, que genera las líneas de flujo de un campo vectorial 2D. Esto es similar a un gráfico vectorial normal, ya que cada flecha es tangente al campo vectorial. Sin embargo, las flechas no se colocan en una cuadrícula fija sino que se unen en líneas (las líneas de corriente). La importancia de estas líneas es que indican la trayectoria de una partícula (por ejemplo, en un fluido) si el campo vectorial era un campo de velocidad. La entrada anterior se ve así:

ingrese la descripción de la imagen aquí

Fragmento de longitud 34

Solve[a*x^4+b*x^3+c*x^2+d*x==0, x]

Mathematica también puede resolver ecuaciones (o sistemas de ecuaciones, pero solo tenemos tantos caracteres en este momento). El resultado será, como siempre, simbólico.

{
  {x -> 0}, 
  {x -> -(b/(3 a)) - (2^(1/3) (-b^2 + 3 a c))/(3 a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) + (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)/(3 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 + I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 - I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/(6 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 - I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 + I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/( 6 2^(1/3) a)}
}

Tenga en cuenta que las soluciones se dan como reglas , que probablemente mostraré con más detalle en algún fragmento futuro.

Fragmento de longitud 33

Dynamic@EdgeDetect@CurrentImage[]

Gracias a benwaffle por esta idea. CurrentImage[]carga la imagen actual de tu cámara web. EdgeDetectconvierte una imagen en una imagen en blanco y negro donde los bordes son blancos y el resto es negro (vea el fragmento 45 para un ejemplo). La verdadera diversión viene con lo Dynamicque hace que la expresión se actualice. Entonces, el resultado de esto en realidad transmitirá imágenes desde su cámara web y hará una detección de bordes en vivo en ellas.

Fragmento de longitud 32

NumberLinePlot[x^2<2^x,{x,-2,5}]

Un tipo de trama bastante inusual. Puede trazar un montón de cosas diferentes a lo largo de la recta numérica, como puntos e intervalos. También puede darle una condición, y le mostrará la región donde esa condición es verdadera:

ingrese la descripción de la imagen aquí

La flecha indica que la región continúa hasta el infinito. Los círculos blancos indican que esos son intervalos abiertos (los puntos finales no son parte del intervalo). Para los extremos cerrados, los círculos se llenarían.

Fragmento de longitud 28

Graphics3D@{Sphere[],Cone[]}

Tiempo para algunos gráficos en 3D. Lo anterior representa una esfera y cono superimpuestos con parámetros predeterminados, que se parece a una bola de cristal:

ingrese la descripción de la imagen aquí

En Mathematica, puedes hacer clic y arrastrar este pequeño widget para rotarlo.

Fragmento de longitud 27

CountryData["ITA", "Shape"]

Más *Data! CountryDataes bastante loco Obtener la forma de un país ni siquiera es la punta del iceberg. Hay tantos datos sobre países que probablemente podría escribir un libro completo sobre esta función. Como ... hay FemaleLiteracyFraction. También puede consultar esos datos para diferentes puntos en el tiempo. Para obtener una lista completa, consulte la referencia.

ingrese la descripción de la imagen aquí

Longitud 26 fragmento

PolarPlot[Sin[5θ],{θ,0,π}]

Tiempo para una trama más interesante. PolarPlotes simplemente una trama en coordenadas polares. En lugar de especificar y para una x dada, especifique un radio r para un ángulo dado θ:

ingrese la descripción de la imagen aquí

Fragmento de longitud 25

{{1,5},{2,3},{7,4}}.{8,9}

Finalmente tenemos suficientes caracteres para algunas matemáticas vectoriales. Lo anterior calcula la multiplicación de matrices de una matriz de 2x3 y un vector de fila 2:

{53, 43, 92}

Fragmento de longitud 23

Rotate[Rectangle, Pi/2]

Je Jeje. Crees que sabes lo que hace esto. Pero tu no. Rectanglepor sí solo es una función con nombre. Para obtener un objeto que represente un rectángulo, necesitará llamar a esa función con algunos parámetros. Entonces, ¿qué crees que sucede cuando tratas de rotar Rectangle? Esta:

ingrese la descripción de la imagen aquí

Fragmento de longitud 22

30~ElementData~"Color"

Otra de las *Datafunciones integradas. Sí, para elementos químicos, no solo obtienes cosas como su número atómico, punto de fusión y nombre ... en realidad puedes obtener su color a temperatura ambiente. Lo anterior da el color del zinc:

SlateGray

Fragmento de longitud 21

Integrate[E^(-x^2),x]

Tuvimos diferenciación hace algún tiempo. Tiempo de integración. Mathematica puede manejar integrales definidas e indefinidas. En particular, Integratele dará una solución exacta, y puede manejar un montón de integrales estándar y técnicas de integración (para obtener resultados numéricos, hay NIntegrate). Si conoce su cálculo, habrá notado que la integral gaussiana anterior en realidad no tiene una forma cerrada integral indefinida ... a menos que considere la forma cerrada de la función de error , es decir. Mathematica devuelve:

1/2 Sqrt[π] Erf[x]

Fragmento de longitud 20

"Sun"~StarData~"Age"

Volver a los datos integrados . Debe haber al menos dos docenas de *Datafunciones para todo lo que se te ocurra. Cada uno de ellos toma un identificador de la cosa para la que desea obtener los datos y una propiedad (o lista de propiedades) para recuperar. Lo anterior es solo uno de los más cortos que puede obtener Sun, Stary Agetodo es bastante corto, porque no podía esperar para mostrar esta función.

Ah sí, y ¿mencioné que Mathematica (desde 9) admite cantidades con unidades? (Más sobre eso más adelante). Lo anterior evalúa a:

Quantity[4.57*10^9, "Years"]

que se muestra como

ingrese la descripción de la imagen aquí

Fragmento de longitud 19

MandelbrotSetPlot[]

Sí ... función muy útil ... Lo uso todo el tiempo. (A veces, su deseo de admitir cualquier cosa que sea computable puede llegar un poco lejos ...)

Gráficos de Mathematica

En su defensa, la función es un poco más útil que eso: puede darle una sección particular del gráfico que desea trazar.

Longitud 18 fragmento

PetersenGraph[7,2]

Desde Mathematica 8, entiende qué son los gráficos, por lo que viene con todo tipo de funciones relacionadas con la teoría de gráficos. Y no era Mathematica si no incluyera un montón de elementos integrados. Lo anterior genera los datos del gráfico para un gráfico de Petersen generalizado . Produce la estructura de datos real que se puede manipular, pero Mathematica muestra de inmediato esos datos gráficos ... gráficamente:

Gráficos de Mathematica

Fragmento de longitud 17

Plot[x^x,{x,0,2}]

Finalmente suficientes personajes para hacer algunas tramas. Lo anterior es realmente el ejemplo más simple de una trama unidimensional. Prometo mostrar tramas más frías más adelante

Gráficos de Mathematica

Fragmento de longitud 15

{##4,#,#2,#3}&

Esto muestra dos de las características más potentes (y también útiles para jugar al golf). Todo es una función pura sin nombre , comparable con lambdas en Python o Procs en Ruby. La función pura simplemente termina en a &. Este operador tiene muy poca prioridad, por lo que generalmente incluye casi todo lo que queda de él. Se hace referencia a los argumentos de una función pura #, a veces seguidos de otras cosas. El primer argumento es #o #1, el segundo es #2, y así sucesivamente.

La otra característica es Sequences. Estos son básicamente como símbolos en otros idiomas. Una secuencia es como una lista sin la lista que la rodea: es literalmente solo una secuencia de valores, que se puede usar en listas, argumentos de función, etc. ##en particular es una secuencia de todos los argumentos de función pura. ##2es una secuencia de todos los argumentos que comienzan desde el segundo. Entonces, si nombramos la función anterior fy la llamamos como

f[1,2,3,4,5]

Nosotros obtendriamos

{4,5,1,2,3}

entonces la función gira los argumentos de entrada 3 elementos a la izquierda. Tenga en cuenta que se ##4refiere a los 4,5que se aplanaron en la lista.

Longitud 12 fragmento

D[x^y^x,x,y]

Diferenciación parcial Ddiferenciará la primera expresión sucesivamente con respecto a sus otros argumentos, proporcionándole una expresión simbólica como resultado. Entonces lo anterior es d² (x ^ y ^ x) / dxdy (donde las d s son parciales), que Mathematica informa que es

x^y^x (y^(-1 + x) + y^(-1 + x) Log[x] + x y^(-1 + x) Log[x] Log[y]) + 
  x^(1 + y^x) y^(-1 + x) Log[x] (y^x/x + y^x Log[x] Log[y])

Fragmento de longitud 9

Exp[I*Pi]

¡Todavía no hemos hecho ninguna aritmética compleja! Como puede ver, en πrealidad era solo un alias para Pi. De todos modos, lo anterior en realidad devolverá correctamente el entero -1 .

Fragmento de longitud 8

Sunset[]

Sí. Habla sobre locos incorporados. Sin parámetros que realmente le brinden un objeto de fecha y hora de la próxima puesta de sol en su ubicación actual. También toma parámetros para otras fechas, otras ubicaciones, etc. Esto es lo que me parece en este momento:

ingrese la descripción de la imagen aquí

Fragmento de longitud 7

9!/43!!

Este fragmento muestra algunas cosas geniales.

Mathematica no solo tiene un operador factorial incorporado !, también tiene un factorial doble !!(que multiplica cada número de nabajo a abajo 1). Además, admite enteros de precisión arbitraria. El 43!!será evaluado exactamente, hasta el último dígito. Además, los números racionales también se evaluarán exactamente. Entonces, dado que tanto el numerador como el denominador son enteros, Mathematica reducirá las fracciones lo más posible y luego le presentará

128/198893132162463319205625

Por supuesto, puede usar flotantes cuando lo desee, pero en general, si su entrada no contiene flotantes, su resultado será exacto.

Fragmento de longitud 4

Here

Ya es hora de que empecemos con la gran cantidad de locos complementos de Mathematica. Lo anterior hace lo que dice en la lata y (para mí) se evalúa GeoPosition[{51.51, -0.09}].

Fragmento de longitud 3

x-x

Solo para mostrar el Factoid original : lo anterior funciona incluso si aún xno está definido y realmente dará como resultado 0en ese caso.

Fragmento de longitud 2

3x

Multiplicación por yuxtaposición! Si está claro que un identificador finaliza y comienza otro, no necesita un *espacio en blanco para multiplicarlos. Esto funciona con casi todo, incluidas cadenas y variables que aún no tienen valores. Muy conveniente para jugar al golf. ;)

Fragmento de longitud 1

π

Adivina qué, es Pi. Y, de hecho, no se trata de una representación aproximada de punto flotante, es Pi exactamente, por lo que todo tipo de funciones complejas y trigonométricas en las que se utiliza producirá resultados exactos si se conocen.

Factoid

Mathematica puede realizar manipulación simbólica, por lo que las variables no necesitan valores para trabajar con ellas.


19
El fragmento 23 es bastante curioso. Si lo hiciera Translate[Scale[Rectangle, 80], {0, 0, 100}], ¿ aparecería la gran palabra Rectangleflotando frente a su monitor?
Aficiones de Calvin

53
@ Calvin'sHobbies Lo intenté ... elegí un desafortunado zdesplazamiento ... me golpeó en la cara.
Martin Ender

45
El sitio web oficial de Mathematica debería estar absolutamente vinculado a esto.
Caridorc

77
@ durron597 Manteniéndolo como un símbolo y haciendo que todas sus funciones trigonométricas y complejas sepan qué hacer con un π.
Martin Ender

16
Una vez que vi que el legendario Martin Büttner había publicado una respuesta de Mathematica, supe que no tenía ninguna posibilidad de ganar un concurso de popularidad. Usted señor es un verdadero mago.
Alex A.

187

El infame lenguaje de programación de Shakespeare

Shakespeare Programming Language fue creado en 2001 por dos estudiantes suecos, Karl Hasselström y Jon Åslund, y combina, como proclaman los autores ,

La expresividad de BASIC con la facilidad de uso del lenguaje ensamblador.

Las respuestas van de arriba a abajo. Además, es común verme referirme a fragmentos anteriores o anteriores.

( enlace para mí: editar )

Hecho:

El código de Shakespeare se asemeja, como cabría esperar, a una obra de Shakespeare, donde las variables son personajes de la obra y su valor cambia a medida que son "insultados" o alabados.

Fragmento de longitud 1:

I

El código de Shakespeare se divide en Actos, y los actos se dividen en Escenas, para las causalidades de "salto a". Definir un acto como Act Isignifica que será la primera parte del código que se ejecutará, por ejemplo, pero no solo.

Fragmento de longitud 2:

as

Utilizado en una comparativa entre dos "personajes".

Fragmento de longitud 3:

day

A estas alturas, puede tener la sensación de que SPL es muy detallado. Y raro Y aún no has visto nada. day, en SPL, es 1. Todos los sustantivos "positivos" y "neutros" se consideran 1, así como todos los sustantivos "negativos" -1.

Fragmento de longitud 4:

rich

¿Qué es rich? Un adjetivo. En SPL, los adjetivos hacen que el valor del sustantivo al que están unidos se multiplique por dos. Ver implementación en el fragmento 14.

Fragmento de longitud 5:

Act I

Implementación del primer fragmento. A todos los actos se les puede dar un título, como Act I: Hamlet must die!, ya que el analizador ignora todo después del número romano.

Fragmento de longitud 6:

better

Cada idioma tiene condiciones, y SPL no es una excepción. Excepto que, dado que este es un lenguaje con una larga sintaxis (¿lo mencioné como extraño?), Sus declaraciones condicionales serán largas. Hacer que Ophelia le pregunte a Juliet Am I better than you?es como tener la if (Ophelia > Juliet)mayoría de los idiomas "normales". Y, por supuesto, puede preguntar al revés: Am I not better than you?es el equivalente de if (Ophelia < Juliet). Y ya puede adivinar cómo =se traduce al SPL: as good as- uso del fragmento de código 2.

Sin embargo, good/betterno es la única forma de hacer comparaciones en este lenguaje shakesperiano, puede usar cualquier adjetivo. El mismo principio del fragmento 3 también se aplica aquí, con adjetivos "positivos" que tienen el valor >, mientras que los "negativos" significan <.

Fragmento de longitud 7:

Juliet:

Esta es la invocación de una variable; después de esto, sus instrucciones / declaraciones / lo que sea que siga.

Una limitación de SPL es que tiene un número limitado de variables: Romeo, Juliet, Hamlet, Ophelia, MacBeth, etc., son algunos ejemplos de "personajes" que aparecerán en un programa de Shakesper.

Fragmento de longitud 8:

[Exeunt]

[Exeunt]se coloca cuando todos los "personajes" salen del "escenario". Espero poder elaborar un poco más adelante sobre la interacción entre los personajes. Generalmente es la última instrucción de cualquier programa SPL, aunque [Exeunt]no es específicamente el "carácter" terminal del lenguaje. Para otro ejemplo, vea el fragmento 27.

Fragmento de longitud 9:

as bad as

Nueve caracteres solo para representar un mero =uso del fragmento 2. ¿He mencionado que SPL es extraño? Ver fragmento 30 para ejemplos. (y sí, hay más de una forma de generarlo)

Fragmento de longitud 10:

difference

Una forma elegante de representar -, una resta. Puede realizar operaciones matemáticas en SPL, aunque probablemente necesite un día completo para hacerlo bien.

Factoid (ya que de alguna manera logré alcanzar diez fragmentos de código, tomemos un descanso y tengamos otro factoid sobre SPL)

Si desea ejecutar su código shakesperiano en todo su esplendor, existe este sitio , aún lo estoy probando, ya que lo descubrí hace apenas cinco minutos. También hay una manera de traducirlo a C usando un traductor .

Otro sitio para ejecutar código SPL es este que funciona traduciendo internamente el código SPL a otro lenguaje esotérico: Oracle PL / SQL.

Fragmento de longitud 11:

[Exit Romeo]

¡Si! ¡Por fin puedo hablar sobre la interacción entre los personajes! Para que su valor cambie o para interactuar con otros, un "personaje" debe estar en el escenario, entrando con [Enter Romeo]. Si se dirige a un personaje pero no está presente, hay un error de tiempo de ejecución y el programa se detiene. Porque, en SPL, el valor de las variables se establece por la cantidad de nombres con los que los elogian, o los insultan, los otros personajes en el escenario. Siento que debería poner un ejemplo para aclarar la confusión que puede generar mi cojera explicación, pero tal vez sea mejor retrasar algunos fragmentos.

Fragmento de longitud 12:

Remember me.

SPL es bastante "básico", está bien, ¡pero tiene pilas! Cuando, por ejemplo, Romeo le dice a Juliet que "lo recuerde", en realidad le dice a su ser querido que empuje el valor del Romeo a su pila. Hacer estallar el valor se hace con Recall your happy childhood!, o Recall your love for me, básicamente, cualquier oración que comience Recall; el resto es solo tontería artística, como el fragmento 22.

Fragmento de longitud 13

Let us return

La forma shakesperiana de tener un goto. Y aquí es donde los actos y escenas son útiles. Si Romeo le dice a Julieta we shall return to Act II(sí, de nuevo, hay varias formas de escribirlo), el programa saltará a esa parte específica del código. También se ve junto con declaraciones condicionales.

Fragmento de longitud 14

my little pony

Sí, fue una serie en los años 80. Aquí está 2*1. ¿Por qué? Porque a ponyes un sustantivo (algo) positivo y littlees un adjetivo. Entonces, recordando los fragmentos 3 y 4, tenemos little = "2 *"y pony = "1".

Fragmento de longitud 15

Speak thy mind!

En un programa SPL, verá esto (o lo Speak your mind!que es lo mismo) mucho . Básicamente, esto genera el valor de cada "carácter" en dígitos, letras o cualquier otra cosa, dependiendo del juego de caracteres que esté utilizando su computadora. También hay Open your mind.que hace casi lo mismo, aunque solo se genera en forma numérica.

Fragmento de longitud 16

You are nothing!

Cuando alguien te dice esto en la vida real, te sentirás deprimido. Cuando Ophelia le dice esto a Hamlet en la programación de Shakespeare, Hamlet se siente inútil. ¿Qué significa esto? Eso Hamlet = 0.

Fragmento de longitud 17

Ophelia, a wench.

En un guión, antes de que comience la obra, los personajes deben ser presentados. En la mayoría de los lenguajes de programación, las variables también deben declararse antes de su uso. Al ver que SPL es un lenguaje de programación que se asemeja a un guión, así es como declara sus variables, indicando cuáles son las que aparecen durante el programa.

Pero, ¿qué significa "una moza"? ¿Significa que es un nombre de tipo de datos específico (y genial)? Bueno ... odio decepcionarte, pero no significa nada: todo después de que la coma es ignorada por el analizador, lo que significa que puedes poner allí la tontería más escandalosa que puedas imaginar.

Longitud 18 fragmento

lying sorry coward

-4para todas las criaturas terrenales. ¿Por qué? Debido 2*2*(-1) = -4.

Fragmento de longitud 19

Romeo:
 Remember me.

¡¡¡Al final!!! ¡Finalmente puedo generar una instrucción de sintaxis correcta completa (aunque sea breve)! Así es como usas el fragmento 12: primero declaras quién está hablando, luego en la siguiente línea escribes el "diálogo". Normalmente, solo dos "personajes" están en el escenario, para evitar que el analizador esté triste y confundido. Cuando necesitas otro "personaje", tomas uno del escenario y lo reemplazas por uno nuevo.

Fragmento de longitud 20

cube of thy codpiece

Quería elaborar un poco más para este, pero, a decir verdad, las cosas que se me ocurren todavía son demasiado cortas para esta longitud de fragmento. Y, entonces, les traigo esto, que termina siendo -1- porque (-1) 3 = -1 (y codpiecees un sustantivo "negativo", ya que son incómodos y todo). SPL entiende algunas operaciones aritméticas más elaboradas como algunas exponenciaciones y raíces cuadradas.

Factoid (otro más, ya que hemos alcanzado otro hito)

El "Programa Hello World" en Shakesperian tiene 89 líneas y más de 2400 caracteres de largo, como se ve aquí .

Fragmento de longitud 21

Listen to your heart.

En el fragmento 15, sacaste algo; aquí, ingresa un número al programa. Si desea ingresar un carácter, lo usará Open your mind.en su lugar. Y, no hace falta decir que este valor se almacenará en el "personaje" con el que se habla.

Fragmento de longitud 22

Recall your childhood!

Hacer estallar un número entero de una pila, como se explica en el fragmento 12. Cuando, por ejemplo, Ofelia le dice a Hamlet la oración antes mencionada, hace que Hamlet tome un número entero de su pila y asuma ese valor.

Por supuesto que, siempre que la palabra recallcomience la oración, puedes completar el resto con casi cualquier cosa que tu creativa mente shakesperiana desee.

Fragmento de longitud 23

Are you better than me?

Implementación del fragmento 6. Cuando un "personaje" le hace una pregunta como esta a otro, lo que él / ella está haciendo equivale a if (x > y)los lenguajes de programación más comunes. El seguimiento de esta instrucción debe retrasarse hasta que tenga más caracteres disponibles.

Longitud 24 fragmento

[Enter Romeo and Juliet]

Sí, los "caracteres" pueden ingresar en pares. No es necesario tener un "personaje" entrando en el escenario, seguido de otro.

Fragmento de longitud 25

remainder of the quotient

25 caracteres solo para escribir a %. 25 personajes para tener el resto de una división. ¿Y para usarlo? Bueno, eso es aún más grande: vea el fragmento 75.

Longitud 26 fragmento

Let us return to scene II.

Aquí está, un gotoen SPL, que funciona como cabría esperar en un lenguaje de programación. Una cosa es: puedes saltar entre escenas en el mismo acto, y entre actos; pero no puedes saltar entre escenas en diferentes actos.

Fragmento de longitud 27

[Exeunt Ophelia and Hamlet]

Cuando más de un "personaje" abandona el escenario, en lugar de Exitseguir la tradición con la naturaleza teatral de SPL, se usa la palabra latina "Exeunt". A veces se puede reemplazar solo por el fragmento 8.

Fragmento de longitud 28

Scene I: Ophelia's flattery.

Declarando una escena. Como ya puede esperar si me ha estado haciendo frente, lo importante es que Scene I, el resto es una pelusa artística.

Se han realizado algunos compiladores (como este que compila de SPL a C, escritos en Python ) que, en cambio, hacen referencia al texto después de la numeración de Act / Scene. Si bien es más lógico (después de todo, durante una obra, hacer que los personajes digan líneas como "volvamos al Acto I" puede considerarse una tontería), me mantengo en la forma original.

Fragmento de longitud 29

You pretty little warm thing!

Sí, otra constante más (ya que necesitamos muchos más caracteres para tener operaciones aritméticas). Este es igual a 8, porque 2*2*2*1 = 8.

Fragmento de longitud 30

You are as cowardly as Hamlet!

Decir esto a, por ejemplo, Romeo, significa eso Romeo = Hamlet. Como fragmento 9.

Factoid (sí, ¡otro hito alcanzado!)

Este lenguaje fue creado para una tarea en un curso de Análisis de sintaxis, por lo tanto, los autores no crearon ningún compilador SPL. Más: parece que los autores de SPL han roto sus lazos con su creación, ya que nada parece haber sido modificado en el lenguaje desde 2001 ...

Fragmento de longitud 31

Am I as horrid as a flirt-gill?

Sí, lo sé, es un fragmento 23 algo repetitivo, aunque, aquí, estamos comparando el "personaje" que habla con un "coqueteo" (de, si lo prefiere if (Ophelia == -1)). La cosa es...

Fragmento de longitud 32

If so, let us return to scene I.

... ahora puedo presentar el thenSPL, el salto condicional y la forma Shakesperiana de implementar bucles. Puede, por ejemplo, hacer que Romeo asuma el valor 0, incremente su valor mientras realiza alguna otra tarea y se detenga cuando llegue a 10, luego continúe con el programa.

Fragmento de longitud 33

If not, let us return to scene I.

Solo un recordatorio de que, en cambio, podemos avanzar a otra escena si la condición que probamos es falsa .

Fragmento de longitud 34

Open your mind! Remember yourself.

¡Dos instrucciones seguidas, yippie! El primero lee un personaje, el segundo lo empuja a la pila de memoria del otro personaje.

Fragmento de longitud 35

Act I: Death!

Scene I: Oh, shit.

La forma correcta de declarar un acto y una escena. Agregue papilla artística con buen gusto.

Fragmento de longitud 36

Thou art as sweet as a summer's day!

Otra forma de decir que el "personaje" con el que se habla recibirá el valor 1, porque los días de verano son agradables y agradables.

Longitud 37 fragmento

Art thou more cunning than the Ghost?

Ofelia hacer esta pregunta a los medios de Hamlet, que se traduce a un lenguaje de programación menos legible, if (Hamlet > the Ghost). Es el fragmento 23 de nuevo, sí, pero demuestra que no es necesario preguntar a los "personajes" si son mejores entre sí: cualquier otra pregunta también funcionará.

Longitud 38 fragmento

[Enter the Ghost, Romeo and the Ghost]

Sí, estoy llamando a un "personaje" dos veces, porque quería que el programa me diera un error. Llamar a un "personaje" que ya está en el escenario, o decirle a uno que está ausente que salga, causará un gran dolor al analizador / compilador.

Longitud 39 fragmento

the sum of a fat lazy pig and yourself!

La instrucción completa se ve mejor que esto, te daré eso, pero ... ¡aquí está nuestra primera operación aritmética! ¿Qué significa todo en realidad? Bueno, piges un animal sucio (aunque sabroso), por lo que es equivalente a -1, tiene dos adjetivos, lo que significa fat lazy pigigual 2*2*(-1) = -4. ¿Pero que pasa yourself? Es un pronombre reflexivo, no un nombre ni un adjetivo. Bueno, recuerde que SPL se basa en diálogos entre "personajes"; así, se yourselfrefiere al otro "personaje" en el escenario. Entonces, llegamos al final y descubrimos que "la suma de un cerdo gordo y perezoso y usted mismo" es, de hecho -4 + x,.

Fragmento de longitud 40

the sum of a squirrel and a white horse.

Sí, otra suma, pero éste es más sencillo que fragmento 39. Esto es simplemente 1 + 2- 3, si mis matemáticas son correctas.

Factoid (¿sigues conmigo después de estos cuarenta fragmentos de pelusa artística? Te mereces un premio).

SPL, en su versión 1.2.1, se puede descargar aquí .

Fragmento de longitud 41

Juliet:
 Speak thy mind!

[Exit Romeo]

A veces, los "personajes" solo son llamados al escenario para cambiar su valor, lo que, en una obra de teatro real, sería algo bastante extraño. De todos modos, aquí, Julieta hace que su amado Romeo imprima su valor almacenado, después de lo cual sale del escenario.

Fragmento de longitud 42

Speak YOUR mind! You are as bad as Hamlet!

De nuevo dos instrucciones en una línea (podemos tener múltiples, pero la longitud del fragmento aún no lo permite); aquí tenemos un "personaje" que le dice a otro que muestre su valor y asuma el valor que tenga Hamlet. ¿Confuso? Quizás.

Fragmento de longitud 43

Am I as horrid as a half-witted flirt-gill?

Juliet preguntando esto no significa que tenga baja estima (aunque podría tenerla en la vida real); es simplemente otro if, como los fragmentos 23 y 37. Oh, casi lo olvido: esto se traduce en if (Juliet == -2).

Longitud 44 fragmento

You are as evil as the square root of Romeo!

Sí, las raíces cuadradas son malvadas, ¿no lo sabías? De todos modos, esta instrucción es lo suficientemente sencilla como para comprender lo que hace: atribuye el "carácter" que se habla al valor de la raíz cuadrada del valor almacenado en Romeo.

Fragmento de longitud 45

Hamlet:
 Art thou more cunning than the Ghost?

Fragmento 37 escrito correctamente con el personaje que habla la línea.

Fragmento de longitud 46

the product of a rural town and my rich purse.

De acuerdo ... de todos modos, SPL puede ser el único idioma en el mundo que te permite multiplicar ciudades con monederos. Esto significa (2*1)*(2*1)que, si no estoy muy equivocado, es igual a 4.

Fragmento de longitud 47

Romeo:
 Speak your mind.

Juliet:
 Speak YOUR mind!

Te lo diré: puede ser uno de los diálogos más extraños de la historia. Pero es lo que obtienes cuando eliges un idioma extraño para mostrar. Romeo y Julieta se están diciendo, en resumen, que expresen sus valores.

Longitud 48 fragmento

You lying fatherless useless half-witted coward!

Traducirlo directamente 2*2*2*2*(-1). -16, ¿derecho?

Fragmento de longitud 49

Scene V: Closure.

Hamlet:
 Speak your mind!

[Exeunt]

Un ejemplo de cómo terminar un programa en SPL. Puedes declarar una escena específicamente para ella (aunque no es obligatorio), luego Hamlet le pide a otro "personaje" que muestre su valor, y luego todos salen del escenario. Y sí, se requiere que todos salgan del escenario.

Fragmento de longitud 50

Othello, a young squire.
Lady Macbeth, an old fart.

Más presentación de "personaje", antes de las instrucciones adecuadas. Como siempre, lo único que le importa al compilador es Othelloy Lady Macbeth, por lo que el resto de la línea está en juego ...

Una cosa más: los "personajes" no tienen que estar relacionados entre sí para aparecer en un programa SPL, por lo que puedes tener a Romeo, Othello y Hamlet en la misma jugada.

Factoid (¿medio siglo de estas cosas? ¡Uf! Después de esto creo que voy a odiar a William Shakespeare ...)

El traductor de SPL a C, mencionado hace un tiempo y desarrollado por los creadores de SPL, se basó en Flex y Bison .

Fragmento de longitud 51

Othello:
 Recall your great dreams. Speak your mind!

(Tan harto de Romeo, Julieta y Hamlet ... ¡traigamos a Othello, para variar!)

Recall, como puedes adivinar, es la clave aquí. El "personaje" al que se dirige Othello tomará un valor de su pila, asumirá ese valor y, luego, lo generará.

Fragmento de longitud 52

Thou art as pretty as the sum of thyself and my dog!

Otra suma Bostezo. Asumir que este está dirigido a Hamlet, significa eso Hamlet = Hamlet + 1. O Hamlet += 1. O Hamlet++.

Fragmento de longitud 53

Romeo:
 You are as vile as the sum of me and yourself!

Ah, sí, algo que olvidé mencionar antes: los "personajes" que hablan pueden mencionarse en sus propias líneas.

Fragmento de longitud 54

Juliet:
 Is the sum of Romeo and me as good as nothing?

Otro ejemplo del fragmento anterior, incluido en una condición. Entonces lo que tenemos aquí es if (Romeo + Juliet == 0).

Fragmento de longitud 55

Juliet:
 You are as lovely as the sweetest reddest rose.

Entonces, aquí, Juliet está elogiando al "personaje" con el que está hablando (supongamos que es Romeo, por el bien de Shakespeare), declarando que él / ella tiene 4. Sí, otra asignación de valores.

Fragmento de longitud 56

Othello:
 You lying fatherless useless half-witted coward!

Fragmento 48 hecho correctamente, con un "personaje". Si eres demasiado vago para desplazarte hacia arriba (como lo estaría yo), esto significa que el que está siendo insultado está recibiendo el valor -16.

Fragmento de longitud 57

Romeo:
 If not, let us return to Act I. Recall thy riches!

Ya he explicado cómo funcionan las condiciones en SPL de forma general; sin embargo, se necesita un análisis más en línea. No tenemos elseaquí: por ejemplo, en este ejemplo, si la condición falla, el programa volverá al Acto I; pero si fuera cierto, continuaría con la siguiente instrucción, que es Recallun pop de la pila, es decir.

Longitud 58 fragmento

Romeo:
 You are as disgusting as the square root of Juliet!

Agarrando el fragmento 44 y presentando cómo se debe presentar la instrucción. Si se tratara de un diálogo entre Romeo y Othello, podríamos traducirlo a Java como Othello = Math.sqrt(Juliet).

Fragmento de longitud 59

Othello:
 You are as vile as the sum of yourself and a toad!

Bien, si Othello está hablando con Romeo, esto sería equivalente a Romeo+(-1); Romeo--, para abreviar. Bastante básico, ¿verdad? Eso es SPL para ti.

Fragmento de longitud 60

Is the quotient between the Ghost and me as good as nothing?

Para abreviar, if (The Ghost/Hamlet == 0)suponiendo que el "yo" pertenece a Hamlet.

Fragmento de longitud 61

Thou art as handsome as the sum of yourself and my chihuahua!

Una vez que despega las capas y capas de palabras e insultos, nota que SPL es prácticamente una cosa básica, sin funciones y cosas geniales. Entonces tenemos montones y montones de funciones aritméticas en el cuerpo del programa. Entonces, si este fuera dirigido a Julieta, sería equivalente a Juliet++.

Fragmento de longitud 62

twice the difference between a mistletoe and a oozing blister!

Sí, sí, más operaciones aritméticas. Aproximadamente, estos 62 bytes de SPL se pueden traducir a 2*(1-2*(-1)). Este sería un lenguaje de golf bastante impresionante, ¿verdad? Derecha.

Fragmento de longitud 63

You lying stupid fatherless rotten stinking half-witted coward!

Fragmento de 48 da salida -16, éste es igual a -64: 2*2*2*2*2*2*(-1).

Fragmento de longitud 64

your coward sorry little stuffed misused dusty oozing rotten sky

Por lo que entiendo de SPL, esto es perfectamente legítimo. Tienes muchos adjetivos insultantes que dan lugar a un sustantivo "positivo". Dado que los adjetivos no tienen una distinción especial si son negativos o no (su único valor es multiplicar el número a la derecha por dos), podemos tener oraciones completamente tontas como esta. Lo que equivale a 256. Porque 2*2*2*2*2*2*2*2*1=256.

Fragmento de longitud 65

You are nothing! You are as vile as the sum of thyself and a pig.

Hmm, tanto odio, ¿no? Entonces, lo que tenemos aquí es equivalente a y=0; y=y+(-1);Probablemente podría haber sido "golfizado" You are a pig!, pero je.

Fragmento de longitud 66

You are as beautiful as the difference between Juliet and thyself.

Entonces, resta a Juliet de ti, ¿eh? Este es bastante simple de decodificar: Romeo=Juliet-Romeo;suponiendo que se esté hablando con Romeo.

Fragmento de longitud 67

Juliet:
 Am I better than you?

Romeo:
 If so, let us proceed to Act V.

Cómo funcionan la mayoría de las condiciones en SPL. Usted prueba la expresión y, si es verdadera (o no: vea el fragmento 33), salta a otra parte del programa; de lo contrario, continuará con la siguiente oración.

Fragmento de longitud 68

The Ghost:
 You are as small as the sum of yourself and a stone wall!

Sí, sí, me estoy volviendo un poco monótono. Pero SPL es así. Como dije un poco antes, sus expresiones son una mezcla de operaciones aritméticas. Por lo tanto, este es otro incremento más, ya que stone walles un "sustantivo" neutral.

Fragmento de longitud 69

Thou art as disgusting as the difference between Othello and thyself!

En lugar de una suma, tenemos la resta entre dos personajes, Othello y con quien se le está hablando.

Fragmento de longitud 70

You are as handsome as the sum of Romeo and his black lazy squirrel!

Volvemos a las adiciones, sí, llámame formulaic, je. Traducimos esto a Romeo + 2*2*1.

Longitud 71 fragmento

Scene I: Dialogues.

[Enter Juliet]

Othello:
 Speak your mind!

[Exit Juliet]

Una escena puede ser tan pequeña como esta. Julietentra al escenario, Othello le dice que muestre su valor almacenado, luego se baja del escenario nuevamente.

Fragmento de longitud 72

twice the difference between a mistletoe and an oozing infected blister!

Una operación aritmética más, porque SPL está plagado de ellos. Podemos traducir esto a 2*(1-2*2*(-1)).

Fragmento de longitud 73

You are nothing! Remember me. Recall your unhappy story! Speak your mind!

¿Cuatro instrucciones seguidas? Estoy bastante orgulloso de mí mismo, en realidad. De todos modos, supongamos que este es un diálogo entre Romeo y Julieta (y él está hablando): esto significa que el valor de Julieta comienza en 0; luego, Juliet empujará el valor de Romeo en su pila de memoria, lo abrirá y lo mostrará en su forma ingresada. Simple, verdad?

Fragmento de longitud 74

You are as sweet as the sum of the sum of Romeo and his horse and his cat!

Sí, sí, ejemplo aburrido, lo sé. Pero esto es X = (Romeo + 1) + 1.

Fragmento de longitud 75

Is the remainder of the quotient between Othello and me as good as nothing?

Bueno, esto es bastante sencillo. Si sus habilidades de decodificación no funcionan correctamente, se traduce en if (Othello % X == 0).

Fragmento de longitud 76

Thou art as rich as the sum of thyself and my dog! Let us return to scene I.

El salto del fragmento 26 con una expresión delante. A gotoen SPL no siempre se encuentra cerca de una condición, puede ser así, y, por supuesto, este tipo de gotosiempre se encontrará al final de un Acto o Escena, ya que las instrucciones posteriores nunca se compilarán / ejecutarán. La primera instrucción es bastante simple: x=x+1.

Longitud 77 fragmento

[Exit Hamlet]

[Enter Romeo]

Juliet:
 Open your heart.

[Exit Juliet]

[Enter Hamlet]

Entonces, tenemos a Juliet y Hamlet en el escenario; pero necesitamos el valor de Romeo. Por lo tanto, para evitar que el compilador tenga un dolor de cabeza muy desagradable, en primer lugar eliminamos a Hamlet del escenario (aunque podría haber sido Juliet quien fuera), le decimos a Romeo que suba al escenario, Juliet le da instrucciones para emitir un número (vea la explicación del fragmento 21), luego Romeo sale del escenario y Hamlet regresa. Bastante sencillo y simple.

Longitud 78 fragmento

The Ghost:
 Speak thy mind.

Lady Macbeth:
 Listen to thy heart! Remember thyself.

Entonces, The Ghost (el padre fallecido de Hamlet) le está diciendo a Lady Macbeth que muestre su valor, mientras ella le ordena a The Ghost que lea un número y lo meta en su pila.


32
Esto es increíblemente interesante y su foto de perfil se ajusta perfectamente, se ve exactamente como me imagino que sería un programador SPL.
overactor

3
@overactor No sé si sentirme insultado u orgulloso de ser comparado con un Gumby. ^ _ ^
Rodolfo Dias

99
Curiosamente, este NO es el ejemplo más oscuro para leer aquí ... y parece estar vinculado a "menos práctico".
HRRambler

66
ROFL aquí tiene +1 para ayudarlo en el camino - ¡Una vez más en la brecha Rodolfo!
HRRambler

3
@RodolfoDias Puedes comenzar. Estoy esperando verlos. Tienes 120 votos positivos.
ghosts_in_the_code

176

Piet

Factoid

Piet es un lenguaje de programación donde el código fuente consiste en imágenes. El flujo del programa comienza con el píxel superior izquierdo y se mueve alrededor de la imagen entre píxeles y grupos de píxeles hasta que termina.

Para legibilidad, los programas de Piet se muestran comúnmente en una versión ampliada. En tal caso, el término codelse utiliza para describir un grupo de píxeles del mismo color que corresponden a un píxel individual en la imagen de origen.

Para este desafío, dado que Piet no usa caracteres, se usará un códec por voto para los programas de muestra.

1 Codel

1 Codel

Este es un programa válido, no hace nada y termina. El flujo de control comienza en el píxel superior izquierdo (solo) y no tiene salida, lo que finaliza el programa.

El píxel en este caso puede ser de cualquier color para el mismo efecto exacto.

2 codeles

2 codeles

Esto leerá continuamente caracteres de stdin y mantendrá un total acumulado de sus valores Unicode (aunque no se hace nada con este total y no se muestra).

El flujo del programa se mueve hacia adelante y hacia atrás entre los 2 códeles, ya que la única forma de salir de cada uno es hacia el otro. Los comandos en piet se ejecutan mediante el movimiento de un códec o región a otro, dependiendo de la diferencia de tono y claridad de las 2 regiones. El inputes el comando que se mueve de izquierda a derecha y luego el de addderecha a izquierda. En el primer addcomando, no sucederá nada, ya que solo hay un valor en la pila, y la especificación dice que los comandos sin suficientes valores disponibles se ignoran.

Este programa es un ciclo que nunca terminará, ya que la mayoría de los programas piet tendrán tamaños extremadamente pequeños, ya que se necesitan al menos algunos códeles para "atrapar" adecuadamente el flujo del programa y finalizarlo.

3 codeles

3 codeles

Este es un programa básico de tipo echo, leerá un carácter a la vez desde stdin y lo imprimirá en stdout.

De nuevo, este es un bucle infinito. El programa comienza viajando de izquierda a derecha, lo que hace inputentonces output. El programa continuará fluyendo en la misma dirección siempre que pueda. En el códec verde claro, la única salida es comenzar a moverse hacia el otro lado. Cuando viaja de derecha a izquierda, intenta ejecutar subtracty addcomandos, pero la pila está vacía, por lo que se convierten en no-ops.

4 codeles

4 codeles

Imprime 2 en stdout indefinidamente.

No es un programa particularmente interesante funcionalmente, pero ahora que finalmente tenemos un número compuesto de códeles podemos mostrar un flujo un poco más avanzado que de izquierda a derecha. Cuando el flujo del programa intenta salir de un codel, primero intenta la dirección actual. Si no puede (en este caso debido al borde de la imagen), gira 90 grados en el sentido de las agujas del reloj e intenta salir nuevamente. En este caso, el programa gira en sentido horario 1 codel a la vez, pushcolocando 1 en la pila dos veces, addjuntando los dos y luego outputobteniendo el resultado.

5 codeles

5 codeles

Lee repetidamente un carácter a la vez desde stdin y rastrea la suma de sus valores unicode.

Esta es esencialmente la misma funcionalidad que la versión de 2 códecs, pero este desafío se trata de mostrar el idioma, y ​​una de las cosas interesantes de piet es cómo puedes tener imágenes de aspecto diferente que hagan lo mismo.

Aquí vemos el códec blanco por primera vez, lo que permite que el flujo del programa se deslice a través de él sin ejecutar instrucciones. Los codeles magenta y azul hacen todo el trabajo aquí. Viajar de azul a rojo no hace nada porque cruza el códec blanco en el medio. Los 2 rojos son solo pushel número 1 en la pila y popretrocede cuando viaja de izquierda a derecha, luego de derecha a izquierda a través de ellos, y luego a través del códec blanco para que no se ejecute ninguna instrucción.

6 codeles

6 codeles

Nuevamente, repitiendo la funcionalidad anterior con un aspecto diferente. Este es otro programa de eco que lee un carácter a la vez de stdin a stdout.

Aquí vemos nuestro primer códec negro. El flujo del programa no puede ingresar un códec negro, por lo que desde el códec magenta claro en la esquina superior derecha, el programa no podrá salir a la derecha debido al borde de la imagen, no podrá salir hacia abajo debido al códec negro y rebotará de nuevo a la izquierda en el códec rojo . Los codeles azul y verde son puramente decorativos, el programa nunca los ingresará.

7 codeles

7 codeles

Sin embargo, otro programa de eco con un aspecto diferente.

Aquí vemos nuestros primeros bloques de codeles más grandes que el tamaño 1. En piet, cualquier bloque contiguo de codels del mismo color se trata como un solo bloque. El tamaño del bloque no importa, excepto al ejecutar la pushinstrucción, por lo que este programa se trata exactamente como la versión de 3 códeles, excepto con diferentes colores.

8 codeles

8 codeles

Lee un número de stdin y genera el cuadrado en stdout, repetidamente.

El flujo de control es un patrón básico en el sentido de las agujas del reloj, como en el programa de 4 códeles. A partir de la parte superior izquierda, las operaciones en orden son input, duplicate(empuja una copia extra del valor superior de la pila en la pila), multiply, output. Luego pushes el valor 1 en la pila, se desliza a través del blanco para que no se ejecute ningún comando, y luego popes ese 1 fuera de la pila cuando se mueve del códec inferior izquierdo a superior izquierdo. Esto lo devuelve al comienzo del programa con una pila vacía y se repite.

9 codeles

9 codeles

Agrega 1 + 2 = 3, y luego termina.

Ahora que tenemos un programa con más de 2 códeles en ambas dimensiones, finalmente podemos configurar una región que atrapará el programa y lo terminará en lugar de repetirlo para siempre. La primera operación que se mueve del códec rojo a la región roja oscura es un push1, luego el programa gira y fluye hacia el códec rojo claro en el medio y tiene pushun valor de 2. Fluyendo del rojo claro al amarillo claro se ejecuta una addoperación La barra amarilla de luz inferior hace que el programa finalice ya que no hay forma de que salga ya que todas las esquinas están bloqueadas.


Los programas de 1 y 2 niveles se están volviendo rápidamente feos y poco interesantes, por lo que a partir de este momento me enfocaré en los números que permiten al menos algunos códeles en cada dirección.

12 codeles

12 codeles

Finalmente, un programa que hace algo que podría considerarse útil (aunque todavía es un poco exagerado). Lee 2 números de stdin secuencialmente y luego genera su suma, y ​​lo hace repetidamente.

El programa fluye de izquierda a derecha a través de las 4 barras de colores que representan 2 inputsseguidas de un addcomando. Luego se mueve al códec inferior derecho y realiza un output, y luego vuelve a la izquierda a través de la región blanca hasta el inicio.

Esto podría haberse hecho en 8 códeles, pero dado que tenemos el espacio extra, podemos hacer algo que esté un poco inspirado en una vieja pantalla de TV sin señal.

15 codeles

15 codeles

Lee un número de stdin y genera su 'cuadrado.

Esto usa un par de trucos para darle un aspecto simétrico a un programa que realmente hace algo. La barra roja más a la izquierda tiene un color diferente en el códec inferior que el resto, aprovechando el hecho de que (al menos para mí) estos 2 tonos de rojo se ven muy similares. el programa se moverá desde la región roja más clara hacia el códec azul claro, y luego directamente a través del medio del programa hacia el verde claro en el lado derecho donde está atrapado. Se lleva a cabo input, duplicate, multiply, y outputoperaciones.

El codel rojo más oscuro, junto con los codeles verdes medianos en la parte superior e inferior de la columna central, son decorativos y el programa nunca los alcanzará.

20 codeles

20 codeles

Lee números de stdin hasta que se lee un 0, momento en el cual genera la suma de todos los números ingresados ​​y sale.

Finalmente tenemos suficiente espacio para controlar el flujo en la forma de la pointeroperación. Los 4 códeles a lo largo de la parte superior realizan input, duplicatey notoperaciones, y luego otra notoperación que se mueve desde el magenta en la parte superior derecha al amarillo de 2 códeles debajo. La notoperación extrae el valor superior de la pila y empuja un 1 si el valor superior era un 0 y un 1 en caso contrario. Por lo tanto, un doble notreemplaza cualquier valor distinto de cero con un 1. Al pasar de la barra amarilla hacia abajo al azul oscuro, se realiza una pointeroperación, que saca el valor superior de la pila y mueve el puntero de dirección en el sentido de las agujas del reloj tantas veces.

Si el valor superior es un 1 (es decir, no ingresamos un cero), el puntero de dirección apuntará a la izquierda, moviéndose a los codeles magenta para una addoperación (que se ignorará la primera vez debido a un solo valor en la pila) y luego a través del blanco de regreso al inicio del programa.

Si el valor superior de la pila es un cero en la operación del puntero, el puntero de dirección no cambiará y el programa continuará hacia abajo. Al pasar a la banda azul más clara, popel 0 que se ingresó fuera de la pila, dejando solo la suma de los números acumulados. Mover hacia la barra cian en la parte inferior hará outputque esa suma, y ​​luego termine ya que el flujo del programa está atrapado.

25 codeles

25 codeles

¡Cuenta regresiva! Lee un número de stdin, y luego imprime una cuenta regresiva a 1 para stdout un número a la vez. Por ejemplo, si se lee 5, imprimirá 54321.

La primera operación de cian a amarillo es la input. Entonces el amarillo es donde comienza el programa "loop". Amarillo> Magenta> Azul es un duplicateentonces un output, por lo que imprime el valor superior en la pila pero conserva una copia. Descendiendo por el lado derecho, que pushel valor 1 en la pila continuación, realizar una subtraction, disminuyendo nuestro valor introducido en 1. Lo siguiente es duplicate, noty otra noten movimiento desde el magenta claro en la parte inferior derecha de la oscuridad de color amarillo junto a él. Esta es la misma verificación cero / no cero que el programa anterior. Moverse a la izquierda hacia el códec azul claro realiza una pointeroperación, que se moverá hacia la izquierda hacia el cian oscuro para finalizar el programa si hemos terminado o hacia el amarillo para reiniciar nuestro bucle sin la entrada inicial, pero el valor original disminuyó por 1.

Los 3 codeles rojos son decorativos y pueden ser de cualquier color.

30 codeles

30 codeles

Generador de Fibonacci. Imprime los términos de la secuencia de Fibonacci en stdout y no se detiene.

Esta es la primera introducción del rolloperador, así como la primera vez que se utiliza un tamaño de región mayor que 1 con el pushoperador para obtener un valor específico en la pila.

Como siempre comienza en la esquina superior izquierda moviéndose a la derecha. Las primeras 2 operaciones pushun 1 en la pila y luego outputya que la secuencia de Fibonacci comienza con dos 1, pero el ciclo principal del programa solo imprimirá 1 una vez. Luego pushquedan 2 1s más en la pila para terminar en el magenta oscuro en la esquina superior derecha para iniciar el ciclo principal del programa.

Desplazándonos por el lado derecho duplicatee outputimprimimos el siguiente término de la secuencia, luego duplicatenuevamente para obtener una copia del valor de secuencia actual. Mover a la izquierda por la parte inferior ejecuta 2 pushoperaciones. Dado que la región roja clara en la esquina inferior derecha tiene un tamaño de 3 codeles, el primero pushempujará un 3 en la pila en lugar de un 1.

Ascender a la luz azul es una rolloperación. Esto extrae los 2 valores superiores de la pila y realiza una cantidad de rollos igual al primer valor reventado, a una profundidad igual al segundo valor reventado. En este caso, realizará 1 tirada a una profundidad de 3. Una tirada a profundidad ntoma el valor más alto de la pila (nuestro valor actual duplicado) y lo entierra nprofundamente. Nuestra pila tiene solo 3 de profundidad en este momento, por lo que enterrará el valor superior en la parte inferior.

Subir una vez más realiza una addoperación que suma el valor de secuencia actual con el valor de secuencia anterior. Nuestra pila ahora tiene el siguiente valor de secuencia (nuevo actual) en la parte superior y el último valor debajo. El programa ahora se mueve a través del blanco hacia el magenta oscuro para comenzar el ciclo nuevamente.

El patrón amarillo en el medio nunca se usa.

54 codeles

54 codeles

Imprime "hola!" stdout

No es un mensaje particularmente largo, pero imprimir en piet requiere una cantidad sorprendente de espacio. La impresión se realiza mediante el uso de valores Unicode, y los enteros se insertan en la pila utilizando el tamaño de la región que se está saliendo. Como tenemos un número muy limitado de códeles para este desafío, utilizamos algunas matemáticas para llegar al rango de impresión que queremos.

El programa comienza con un push5 de la región cian a la izquierda. A partir de aquí, fluye a lo largo de la parte superior con 6 duplicateoperaciones para preparar la pila con un montón de 5s. El siguiente es push1, subtractpara poner un 4 en la parte superior de la pila, luego 2 multiplyoperaciones para poner 4 * 5 * 5 = 100 en la parte superior de la pila. Luego a duplicatepor 2 100s.

Ahora el programa rebota en el negro y comienza a trabajar hacia la izquierda en la parte inferior. Pushoperaciones de 3 y 2 y luego a rollpara enterrar los 2 100 bajo un 5. Luego sigue push1, resta y suma para obtener 100 + 5-1 = 104 en la parte superior de la pila, que es unicode "h". Las siguientes 2 operaciones son push1 y pointerdar la vuelta a la esquina y comenzar a moverse a la derecha en el medio, y luego outputimprimir "h".

El siguiente es add100 + 5 = 105 en la parte superior de la pila, y outputpara imprimir "i". La pila ahora contiene dos 5s. Push1, add, multiplyda (1 + 5) * 5 = 30. Finalmente push3 y addpara 33, y outputpara el final "!". El programa luego pasa a la derecha a través del espacio en blanco restante para terminar en el verde a la derecha.


55
Ja, sí, estaba esperando esto :)
Sp3000

¿Cómo es eso diferente de un lenguaje de caracteres 2D? Es solo la forma en que transmites los valores de las celdas.
JDługosz

25
@jdlugosz Muchos lenguajes de programación esotéricos, a fin de cuentas, son solo unos pocos comandos básicos de manipulación de la pila con una forma única de codificar los comandos. Personalmente, creo que codificarlos en una imagen es una buena idea.
Spencer

13
Si estamos hablando de equivalencia funcional, podría preguntar "¿En qué se diferencia eso de una máquina Turing?" pero entonces podrías hacer esa misma pregunta a un gato, o al planeta Júpiter, o cualquiera de los otros idiomas ...
trichoplax

3
El ejemplo de 9 codeles parece una mini-pokebola. Agradable.
The_Basset_Hound

154

> <> (Pescado)

(Nota: algunos fragmentos se basan en fragmentos anteriores, por lo que, a diferencia de la mayoría de las respuestas, he decidido ponerlas de la primera a la última).

Hecho:

Al igual que Befunge,> <> es un lenguaje 2D basado en pila. Esto significa que las instrucciones no se ejecutan linealmente como la mayoría de los lenguajes tradicionales: ¡el flujo del programa puede ser arriba, abajo, izquierda o derecha!

Fragmento de longitud 1:

X

Xes un comando no válido en> <>, por lo que something smells fishy...se imprime el mensaje de error . De hecho, este es el único mensaje de error en> <>, ya sea que la causa sea la división por cero o que intente reventar una pila vacía.

Fragmento de longitud 2:

1n

El flujo del programa en> <> comienza desde la parte superior izquierda e inicialmente es hacia la derecha. 1empuja un 1 en la pila, luego lo nimprime como un número (en oposición a un carácter ASCII). Pero los programas> <> son toroidales, lo que significa que el puntero de instrucción se ajusta cuando llega al final de una línea. Entonces, después del najuste al principio, presione un 1, imprima, ajuste al principio, presione un 1, imprima ... ¡y terminamos imprimiendo 1s para siempre!

Fragmento de longitud 3:

"o;

Aquí "está el análisis de cadenas, osale como un carácter ASCII y ;termina el programa. Pero, ¿qué hace realmente el programa en su conjunto?

Bueno, primero comenzamos el análisis de cadenas, empujando todos los caracteres que vemos en la pila hasta que encontramos un cierre ". Presionamos un o, luego un ;... y ajustamos el puntero de instrucción de nuevo al inicio. Pero ahora estamos en un "modo de detener el análisis de cadenas, y finalmente ejecutamos oy, ;como de costumbre, para imprimir la parte superior de la pila (the ;) y terminar.

Sí, ¡acabamos de utilizar el mismo carácter de comillas para iniciar y finalizar una cadena!

Fragmento de longitud 4:

42n;

Según lo que hemos visto hasta ahora, puede esperar que esto empuje 42, la salida como un número y luego termine. Pero todas las instrucciones en> <> son caracteres únicos, por lo que esto realmente empuja un 4 y un 2 , luego genera la parte superior de la pila como un número (solo el 2) y termina.

Fragmento de longitud 5:

<v
;>

Recuerde,> <> es un lenguaje 2D. ¡Esto significa que tiene que haber formas de cambiar la dirección del flujo del programa!

Al igual que Befunge, una forma de hacerlo es a través de las flechas >^v<. Para ilustrar cómo funcionan, veamos el programa anterior:

  • El flujo del programa es inicialmente hacia la derecha
  • < hace que el programa fluya hacia la izquierda: salimos por la izquierda y nos acercamos al v
  • v hace que el programa fluya hacia abajo - bajamos al >
  • > hace que el programa fluya hacia la derecha: salimos de la derecha y nos acercamos al ;
  • Finalmente terminamos.

Fragmento de longitud 6:

";"00p

Otra característica interesante de> <> es que es reflexivo: ¡el programa puede modificar su propio código fuente sobre la marcha!

Aquí presionamos a ;, seguido de dos ceros. pa continuación, hace estallar los tres primeros elementos y, x, v( ysiendo la parte superior de la pila) y lugares ven la posición x,y. En otras palabras, el pen este programa pone un punto y coma en la posición 0,0, convirtiendo el código en ;;"00p. Esto permite que el programa finalice, ya que el puntero de instrucción ahora se ajusta y ejecuta el recién colocado ;.

Fragmento de longitud 7:

\7*n;
6

A diferencia de Befunge,> <> también tiene espejos ( \/|_#) que reflejan la dirección del flujo del programa. Entonces aquí nosotros:

  • Comienza hacia la derecha, pero \nos refleja hacia abajo
  • Empuja un 6 y envuelve
  • Golpea la parte trasera del \y reflexiona de nuevo a la derecha
  • Empuja un 7
  • Multiplica los dos primeros de la pila
  • Salida y terminación

Moverse horizontalmente a través de un _espejo o verticalmente a través de un |espejo es un no-op.

Fragmento de longitud 8:

"r00g>o<

Posiblemente el más simple> <> quine si se permite lanzar un error. Las dos nuevas instrucciones aquí son:

  • r: Invierte la pila
  • g: Get - pop y, xy empuja al personaje a x,yla pila (contraparte de p)

Usando el truco de ajuste de cadena de antes, el programa inicialmente empuja y r00g>o<luego golpea la primera cita nuevamente. La pila se invierte, dando <o>g00r. Después de eso, empujamos el char a 0,0, the ", para dar <o>g00r". Finalmente, atrapamos una oentre dos flechas, sacando la parte superior de la pila hasta que no quede nada y obtengamos un error.

Fragmento de longitud 9:

x0\>
\1n>

x(minúscula) mueve el puntero de instrucciones en una dirección aleatoria, y el programa muestra esta funcionalidad al imprimir bits aleatorios para siempre. ¡Intenta seguir las flechas y los espejos para descubrir cómo funciona esto! (No te olvides de revisar las cuatro direcciones, incluyendo arriba y izquierda)

Fragmento de longitud 10:

;a comment

No hay sintaxis de comentarios en> <>: no necesita uno. ¡Solo escribe lo que quieras en cualquier lugar y asegúrate de que no se ejecute como código!

Fragmento de longitud 11:

1!X2!X+!Xn;

!es un trampolín que omite las instrucciones. Es particularmente útil cuando se usa con ?un trampolín condicional que aparece en la parte superior de la pila y ejecuta la siguiente instrucción si el elemento emergente no es cero. Veremos cómo funciona esto más adelante.

El código anterior imprime 3 saltando sobre Xs, solo ejecutándose 1! 2! +! n;.

Fragmento de longitud 12:

01v
ao>:@+:n

Imprime los números de Fibonacci para siempre a partir del segundo 1, uno en cada línea. Los nuevos comandos son:

  • a: Presione 10, que necesitamos para la nueva línea. a-fempuje 10 a 15 respectivamente.
  • :: Duplicar la parte superior de la pila
  • @: Rotar los tres primeros elementos de la pila, por ejemplo [5 4 3 2 1] -> [5 4 1 3 2].

Rastreo de las primeras iteraciones:

ingrese la descripción de la imagen aquí

Fragmento de longitud 13:

i:d=?v
l?!;o>

Un programa "tac" que lee en una línea de entrada y las salidas invertidas. Gracias a @tomsmeding por el fragmento.

=muestra los dos elementos superiores y empuja 1 si son iguales, 0 de lo contrario. La primera línea sigue leyendo en la entrada hasta que se encuentra ASCII char 13 (retorno de carro), en cuyo punto se mueve a la segunda línea.

El l?!;obucle es una construcción importante en> <> que genera la pila completa. A diferencia >o<, no causa ningún error. Así es como funciona:

  • l empuja la longitud de la pila
  • Verificamos la longitud con ?:
    • Si la longitud no es cero, !se ejecuta la siguiente instrucción , omitiendo;
    • Si la longitud era cero, entonces no ejecutamos !y terminamos debido a la;

Tenga en cuenta que en realidad no se produce ninguna salida hasta que se alcanza el retorno de carro.

Fragmento de longitud 14:

32.

   X67*n;

Además de cambiar la dirección del flujo del programa, ¡puedes mover el puntero de instrucciones a donde quieras!

.pops y, xy se teletransporta el puntero de instrucción a x,y, manteniendo la dirección. Sin embargo, tenga en cuenta que debe moverse a un cuadrado antes de donde desea ir: el puntero de la instrucción se actualiza antes de que se ejecute la siguiente instrucción. Entonces, aquí el puntero de instrucción aterriza en el inválido X, pero todo está bien ya que el puntero se mueve al 6antes de continuar la ejecución.

.hace posible convertir la mayoría de los programas> <> en una sola línea, pero ¿por qué querrías perder la diversión del 2D? :)

Fragmento de longitud 15:

01+:aa*=?;:nao!

Imprime los números 0a 99, uno en cada línea. Este programa demuestra un uso ordenado del !trampolín, para garantizar que el 0 inicial solo se presione una vez.

Fragmento de longitud 16:

"r00g!;oooooooo|

Una quine adecuada que no arroja errores, inspirada en la quine en la página de esolang .

Si te preguntaste cómo modificar la quine anterior (fragmento # 8) para que no causara un error y pensaste "¿por qué no agrego un montón de oinstrucciones?", Entonces podrías darte cuenta de eso por cada oadición. , necesitas dar salida a otro o! Esta quine resuelve perfectamente el problema al colocar un |espejo al final, lo que permite que cada uno ose use dos veces .

Si cambiamos a comillas simples (que también son para el análisis de cadenas), entonces una quine alternativa que no usa ges

'r3d*!;oooooooo|

Fragmento de longitud 17:

b2,63,.

   17,n;

Tenemos suma ( +), resta ( -), multiplicación ( *), módulo ( %) ... pero ¿qué pasa con la división? Está allí, pero como ya /es un espejo, a la división se le ha asignado el ,símbolo. Curiosamente, la división es división de flotación , no división entera.

El programa anterior explora algunos comportamientos indefinidos al intentar saltar 11/2, 6/3. El intérprete de Python parece estar bien si la primera coordenada no es un número entero (aunque salta al lugar equivocado), pero se ahoga si la segunda no lo es.

Fragmento de longitud 18:

123456${{$}nnnnnn;

Hemos visto rqué invierte la pila y @qué rota los tres elementos superiores. Aquí hay algunos comandos más que mueven elementos en la pila:

  • $: Intercambia los dos elementos superiores
  • {: Desplazar toda la pila a la izquierda
  • }: Desplaza toda la pila a la derecha

Para mostrar cómo funciona esto, aquí está el seguimiento del programa:

123456 ------> 123465 ------> 234651 ------> 346512 ------> 346521 ------> 134652
       $ Swap        { L shift      { L shift       $ Swap        } R shift

Luego salimos, dando 256431.

Fragmento de longitud 19:

"reward"4[roooo]oo;

Hasta ahora he estado diciendo "la pila", "la pila" ...

Aunque la mayoría de los programas usan solo una pila,> <> en realidad puede tener múltiples pilas. Aquí están las instrucciones relevantes:

  • [: Hace estallar xy mueve los xelementos superiores a una nueva pila
  • ]: Elimina la pila actual y mueve sus valores a la pila subyacente.

Aquí está el rastro para el programa anterior:

       [r e w a r d]       Push "reward"
4[     [r e] [w a r d]     Move four elements to a new stack
r      [r e] [d r a w]     Reverse the current stack
oooo   [r e] []            Output "ward"
]      [r e]               Remove the current stack, no values to move
oo     []                  Output "er", giving "warder" altogether

Tenga en cuenta que simplemente presionando rewardy luego volviendo a ooooooimprimirlo se imprimiría drawer, debido a la naturaleza de "primero en entrar , último en salir" de las pilas.

Fragmento de longitud 20:

aa*5+\
7a*2+\
oo;  \

Una característica poco conocida de> <> es que, como Python, las barras invertidas pueden usarse para la continuación de línea en muchos casos. *

El código anterior es funcionalmente el mismo que

aa*5+7a*2+oo;

* Descargo de responsabilidad: la razón por la que esto funciona puede o no ser por una razón completamente diferente

Fragmento de longitud 22:

1&fv ;n&<
&1->:0=?^:&*

Además de las pilas,> <> también tiene registros (uno para cada pila) que se pueden usar para almacenar valores. Llamar &por primera vez mueve el valor superior de la pila al registro, y ejecutar &nuevamente mueve el valor hacia atrás. Esto puede ser muy útil cuando se acumula un valor, por ejemplo, sumas y factoriales.

El programa anterior calcula el factorial de f(15), imprimiendo 1307674368000. Aquí está el rastro para freemplazar con 4:

ingrese la descripción de la imagen aquí

Fragmento de longitud 24:

"Hello, World!"rl?!;of0.

¡Tenemos suficientes caracteres para el programa favorito de todos! Aquí usamos el .teletransportador para el bucle de salida.

Fragmento de longitud 25:

0i:0(?v$a*$"0"-+!
   ;n~<

Desafortunadamente> <> solo permite leer de STDIN un carácter a la vez, lo que hace que la lectura de números sea un poco complicada. Para la entrada que consta de dígitos 0-9, este programa es esencialmente atoi, y convierte una cadena de dígitos de STDIN en un número en la pila (que luego se imprime).

Otra nota es que en EOF, iempuja -1 en la pila. Esto facilita la comprobación de EOF al comparar con 0 usando (, o "menor que".

Este fragmento también usa ~, que muestra y descarta el elemento superior de la pila.

Fragmento de longitud 33:

i>:nao:1=?;\
 ^  ,2v?%2:/
 ^+1*3<

Hasta ahora, la mayoría de los fragmentos han sido relativamente lineales, o eran simples ejemplos que demuestran la funcionalidad de> <>. Ahora puedo dar un ejemplo que destaca lo fácil que es visualizar el flujo del programa en> <> con un programa bien diseñado.

El programa lee en un solo carácter ASCII y ejecuta el 3x+1algoritmo en su punto de código (En> <>, los caracteres son básicamente enteros). Cada paso del algoritmo se imprime hasta llegar a 1.

Aquí hay un seguimiento de las primeras iteraciones con entrada a(punto de código 97):

ingrese la descripción de la imagen aquí

Fragmento de longitud 44:

a&>i:0(?v"+"$\
/&^?=0l< "a*"/
\:1+&2p/\0
n
;

No creo que haya hecho pjusticia al comando, ya que solo lo he usado una vez en el fragmento # 6, así que aquí hay una función atoi diferente. ¿Qué tiene de bueno este? ¡El programa escribe la expresión necesaria para calcular el número mientras lee la entrada!

Entonces, para entradas como 573, después de leer todos los caracteres, se verá el final de la tercera línea \0a*5+a*7+a*3+, que se evalúa como 573.

Una vez más, se espera que la entrada sea solo dígitos. Traza GIF aquí .

Fragmento de longitud 74:

>i:'A'(?v:'N'(?v:'['(?v\
  :'a'(?v:'n'(?v:'{'(?v\
^      o<    +d<  -d-d<o

Si has logrado llegar hasta aquí, entonces podrías estar de acuerdo conmigo cuando digo que este es un programa ROT13 muy legible. Dado un carácter c1, encontramos el primer carácter c2en AN[an{, de modo que c1 < c2, luego, aplicamos el desplazamiento apropiado sumando / restando d(13). Tenga en cuenta que [y {son los caracteres directamente después Zy zrespectivamente.

¡Pruébalo en la consola y observa cómo se transforman las letras mientras escribes!

(También puede canalizar la entrada, pero como me falta la verificación EOF, :0(?;se detendrá con un error cuando intente imprimir -1 como un carácter)


Una idea para el fragmento de 13: i:d=?v NEWLINE o;!?l<- imprime la línea de entrada al revés
tomsmeding

12
Desearía poder darle más votos, ahora estoy inspirado para comenzar a aprender> <> ...
Robobenklein

66
+1 para comenzar desde arriba y hacia abajo (y también solo porque es divertido de leer).
mbomb007

55
@ mbomb007 es una pena, sin embargo, que el pedido no pueda ir a la izquierda / derecha y pasar al final de la página: P
krs013

Su fragmento de longitud 8 sería una verdadera quine si escribiera something smells fishy...en la siguiente línea.
wizzwizz4

148

C - editar

Gracias por los votos! En comparación con otros lenguajes y lo que pueden hacer en bytes limitados, C parece obsoleto, exigente y demasiado dependiente del desarrollador. En muchos sentidos lo es: los lenguajes de secuencias de comandos y de nivel superior con administración automática de memoria son mucho más expresivos y más rápidos de producción que C.

Entonces, ¿por qué característica C?

El secreto oculto detrás de todos esos lenguajes de script es que los intérpretes probablemente estén escritos en C (o más recientemente, C ++ o Java). Los primeros compiladores de C ++ realmente compilados en código C. De hecho, hasta que haya un mercado para un compilador directo, generalmente es más rentable escribir un compilador para generar C y luego compilarlo.

Si está trabajando en plataformas muy pequeñas, tal vez incluso sin un sistema operativo disponible, es probable que esté trabajando en C. En estos días, casi todos los dispositivos tienen un microcontrolador incorporado, sin duda programado en C. Cuando lo necesitan pequeño y rápido, C es el camino a seguir. (También FORTH, para los masoquistas).

Saber C te lleva lo más cerca posible del metal sin entrar en el ensamblador, y te ayuda en otros idiomas. Tienes una buena idea de cómo funciona probablemente una función virtual de C ++. Cuando escribe esas funciones recursivas de paso por valor en PHP, sabe que internamente está haciendo mucha asignación y copia de memoria, por lo que instintivamente prueba pasar por referencia. Las devoluciones de llamada y las referencias no asustan a los desarrolladores de C, aunque tal vez Haskell sí.

Como Kernighan y Ritchie mencionaron en su prefacio del clásico lenguaje de programación C , segunda edición, C no es un gran lenguaje, y no está bien servido por un gran libro. Estoy tratando de seguir este consejo: los ejemplos hacen doble, triple o más tareas si es posible.

Todos los fragmentos son al menos compilables por sí mismos. Los que son vinculables y ejecutables se indican como tales. Sé que esto no es un requisito, pero lo hace más simple que tratar de explicar el marco requerido para que cualquier fragmento de código funcione.

También traté de asegurarme de que cada fragmento de código fuera lo más corto posible para que no esté introduciendo espacios adicionales solo para rellenar a una cierta longitud. En los casos en que el código está sangrado, las sangrías no se incluyen en la longitud, solo un carácter para cada nueva línea.

Factoid

C rocas.

Longitud 0 fragmento

El programa de autorreproducción más corto del mundo http://www.ioccc.org/1994/smr.hint

Fragmento de longitud 1

;

C hace una distinción entre compilar y vincular. Muchas entidades en C simplemente se compilan y vinculan más tarde; un ejemplo son todas las bibliotecas estáticas y dinámicas.

Otras entidades simplemente se incluyen y no generan código por sí mismas.

¡El punto y coma anterior ciertamente se compilará en código objeto, y no hará nada!

Fragmento de longitud 2

x;

C, al ser un lenguaje de programación más antiguo, ha pasado por varias iteraciones. El primero en uso generalizado fue desarrollado por Kernighan y Ritchie y abreviado K&R. K&R C es notable por hacer muchas suposiciones sobre su código si no las proporciona explícitamente.

En particular, en K&R C, se supone que el código anterior es un entero global xinicializado a 0. Compilarlo en modo K&R producirá un archivo de objeto que proporciona cualquier programa que vincule esta variable para su uso.

Fragmento de longitud 3

??/

C está tan extendido que necesita proporcionar características de compatibilidad para sistemas que no tienen todos los caracteres que usa. Lo anterior es un trigrafo para la barra diagonal inversa, que se utiliza en C como un carácter de continuación de línea. Lo anterior se compilará, probablemente con una advertencia de que no hay una línea siguiente.

Una cultura común en C es ignorar las advertencias de compilación, y muchas bases de código grandes invariablemente tienen algunas o más advertencias cuando se están construyendo.

Fragmento de longitud 4

f();

De nuevo con K&R, lo anterior se "completa" para que signifique en la compilación que "Existe, con un enlace global, una función fque se proporcionará más adelante, que toma un número fijo pero no especificado de argumentos y devuelve un número entero".

Tenga en cuenta las diferencias fundamentales entre esto y f;.

Fragmento de longitud 5

s="";

K&R C es notable por ser verdaderamente indulgente. Tras la compilación, este código proporcionará un número entero spara el enlace global que se inicializa en la dirección inicial de una cadena vacía (creo). K&R maneja silenciosamente todas las coacciones, incluido el truncamiento si un número entero no es lo suficientemente grande como para contener la dirección.

Son construcciones como estas las que han generado muchos errores difíciles de encontrar y han proporcionado mucha inspiración en las competiciones de IOCCC.

Fragmento de longitud 6

o=042;

Un truco de incluso antiguos temporizadores, un 0 inicial en un número literal significa que los siguientes dígitos están en la base octal. El código anterior, una vez compilado, proporcionará un número entero opara el enlace global inicializado al decimal 34.

¡Esta característica de C ha mordido a muchos desarrolladores que se esfuerzan por rellenar sus números para que se alineen de manera agradable e incluso!

Fragmento de longitud 7

f(){f;}

El código anterior es una función con un cuerpo. Pero, ¿qué hace? ¡Recupera la dirección de la función y no hace nada con ella! Normalmente, lo que devolverá la función no está definido. Un código sin sentido como este a menudo puede compilarse sin previo aviso.

Fragmento de longitud 8

main(){}

Esto representa el código compilable y enlazable más corto en C. Mientras que en las versiones modernas de C, las funciones generalmente no pueden definirse implícitamente, por razones históricas esta restricción es relajada main.

Esta maravilla de un programa, que no hace más que devolver 0, se compilará a un tamaño no despreciable y se vinculará en varias rutinas de tiempo de ejecución de C. Puede compilar y vincular con un nivel de verbosidad completo para ver lo que sucede debajo del capó.

Fragmento de longitud 9

#define Z

Un pilar de los archivos de encabezado C es la #definedirectiva de preprocesador. Los programas C se compilan en varias etapas, y en una de estas etapas estas definiciones se sustituyen con sus valores reales.

Cuando falta un argumento, C implicará 1, por lo que lo anterior sustituirá 1donde Zse use en el código fuente.

Lo anterior normalmente se colocaría en un archivo de encabezado #includeyd según sea necesario.

Fragmento de longitud 10

enum{P,Q};

La enumpalabra clave proporciona una forma a veces segura de escribir para definir una serie de constantes. Como define, a menudo se usan en archivos de encabezado. El código anterior cuando se incluye se definiría Pcomo un entero de 0 y Qde 1.

Fragmento de longitud 11

volatile v;

La volatilepalabra clave es informar al compilador que otros agentes pueden cambiar una variable y no hacer suposiciones de que permanecerá constante entre los accesos.

Longitud 12 fragmento

#pragma once

#pragma once es una directiva de preprocesador no estándar pero ampliamente compatible para indicar que el archivo fuente actual se incluya solo una vez en una sola compilación.

La técnica tradicional y totalmente compatible es utilizar #includeguardias con las desventajas de agregar código y posibles conflictos de nombres.

Fragmento de longitud 13

w(){for(;;);}

Existen numerosas convenciones en C, y una de ellas es cómo representar bucles infinitos. En este caso, for(;;)indica que no hay inicialización, no hay verificación de salida, que por defecto es 1, lo que significa verdadero, es decir, no se rompe y no hay código de bucle.

En algún momento es posible hacer todo dentro del ()bucle y no necesita cuerpo. En este caso, se agrega un punto y coma al final.

En el código anterior, cuando se compila, proporcionará una función que entrará en un ciclo de ocupado apretado, uno de los no-no en el diseño de software, y nunca regresará.

Fragmento de longitud 14

int a[]={1,2};

Las matrices en C no necesitan las longitudes especificadas. Los corchetes vacíos le []dicen al compilador que "lo descubras tú mismo". Sin embargo, en C, a diferencia de otros lenguajes, no hay una forma integrada de evitar el acceso a una matriz fuera de estos límites, lo que lleva a la metáfora "disparate en el pie" por la que C es conocido.

El código anterior, cuando se compila, proporcionará una matriz global mutable ade dos enteros inicializados con 1 y 2.

Fragmento de longitud 15

const long k=7;

El constespecificador es una adición posterior a C prestada de C ++. Una pregunta común de la entrevista es "¿Tiene sentido definir una variable como volatile const?". constjunto con enumy inlineestán destinados a reducir la dependencia de los #defineproblemas de seguridad de tipo.

Fragmento de longitud 16

extern void **q;

externse utiliza para indicar que una variable se declara en otro lugar. El void *tipo es el tipo genérico estándar en C, lo que significa que no es necesario convertirlo explícitamente ni en las declaraciones de asignación. La **secuencia del operador significa puntero a un puntero, que a menudo hace volar las mentes de los novatos, pero es perfectamente válido y a menudo se usa C.

Fragmento de longitud 17

double d=4/3-1/3;

Si imprimieras lo anterior, el resultado sería uno, y pensarías, ¡super! Cambiar double d=4/3-2/3;y ¿cuál es la respuesta? ¡Sigue siendo uno! ¡C está usando aritmética de enteros para calcular 4/3 → 1 y 2/3 → 0, y 1 - 0 → 1!

Longitud 18 fragmento

main(){puts("!");}

¡Finalmente llegamos a un código que realmente hace algo! putses un favorito de los golfistas de C porque no requiere un archivo de encabezado para usar.

putstambién agregará un avance de línea a la salida. Por el contrario, su contraparte getseliminará los avances de línea. Nunca se debe usar, getsexcepto en circunstancias muy controladas: no tiene protección para los desbordamientos del búfer y es la causa principal de muchos exploits.

Fragmento de longitud 19

#include <stdlib.h>

La inclusión de archivos de encabezado suele ser una firma personal de los desarrolladores. Muchos incluyen libe ioindependientemente de si son necesarios. Algunos ordenan los archivos de encabezado para que las longitudes aumenten o disminuyan. La mayoría pone <>antes "". Personalmente, he usado esta firma en mis días de asistencia técnica para comprobar si hay trampa entre los estudiantes: ¿la misma firma de encabezado? ¡mira más de cerca!

Fragmento de longitud 20

char*p=(char*)0x300;

C está diseñado para ser utilizado en plataformas rudimentarias de muy bajo nivel. En algunos casos, es posible que necesite acceder a puertos especiales asignados a memoria directamente.

En el código anterior, la dirección de un puerto se define como hexadecimal 300. Para acceder al valor del puerto *p, use , como *p=0xff;para activar todos los bits o v=*p;para recuperar el valor actual.

Fragmento de longitud 21

int w=sizeof(double);

El sizeofoperador proporciona el tamaño en bytes de un tipo. Con nombres de variables, los corchetes no son necesarios, por ejemplo double d;int w=sizeof d;.

Fragmento de longitud 22

asm("xorl %ecx,%ecx");

El asmcompilador define cómo se utilizará. Lo anterior es un ejemplo de código en línea gcc de Linux en una plataforma Intel.

El Unix original tenía una fracción pequeña pero no despreciable de su código en ensamblador. Incluso hoy, si la velocidad es la principal preocupación y la portabilidad no lo es, verá que se usa.

En sistemas compatibles, el código anterior se compilará, ¡y será literalmente una instrucción de ensamblaje aislada sin medios convencionales para acceder a ella! Por cierto, xor R,Res un lenguaje común de lenguaje ensamblador para borrar un registro rápidamente.

Fragmento de longitud 23

union u{char c;int i;};

A unionproporcionará al menos suficiente espacio para el elemento más grande. Puede ver que se usa junto con void *para proporcionar un tipo "opaco" común en ciertas bibliotecas. En este caso, la unión generalmente será parte de una estructura más grande, con la estructura con un campo para identificar el tipo de unión.

Longitud 24 fragmento

/*INTS*/int i,j,k;//INTS

El comentario original de C se delimitó como /* comment */, y tomó prestado el // comment to end of lineformato de C ++.

Fragmento de longitud 25

int main(void){return 1;}

Esta es la versión más compatible del fragmento de longitud 8 anterior. Se especifican el tipo de retorno y los tipos de función, y tiene un valor devuelto explícitamente.

La convención en C es usar un valor de retorno de 0para el éxito y el 1fracaso, o si desea ser estrictamente conforme EXIT_SUCCESSy EXIT_FAILUREcomo se define en stdlib.h.

Longitud 26 fragmento

typedef struct{int x,y;}P;

typedefes extremadamente útil, en particular, typedef struct. En términos modernos, podría llamarlo "luz de orientación a objetos".

Después de incluir lo anterior, el código puede usarse Pcomo un tipo regular en declaraciones y funciones, con verificación de tipo completa. Sin embargo, a diferencia de C ++, no puede definir operadores como +, * o <<, por lo tanto, "objeto-orientación-luz".

Fragmento de longitud 27

#define C(x,y)(((x)+1)*(y))

C tiene una conveniente #definesintaxis macro .

Un error de novato común es omitir los corchetes internos y / o externos, lo que resulta en errores de precedencia del operador difíciles de encontrar.

Fragmento de longitud 28

struct f{int s:1,e:8,m:23;};

C puede definir explícitamente campos de bits que pueden asignarse, leerse y manipularse como cualquier número entero.

Lo anterior es una aproximación de una estructura de datos de coma flotante de ancho único IEEE.

Fragmento de longitud 36

f(unsigned x){return!!x&!(x&(x-1));}

En muchos idiomas, no necesita preocuparse por cómo se representan los números. En C, debe ser íntimamente consciente de su representación interna.

El mejor ejemplo de esto que puedo pensar es determinar si un entero es una potencia de dos {1, 2, 4, 8, ...}. Aquellos que no estén familiarizados con C harán bucles y cambios y todo tipo de cosas para el tiempo de ejecución de O (log (n)), no está mal, pero arriba es una función que hará lo mismo en el tiempo de ejecución de O (1). Lo dejaré como ejercicio para que el lector confirme que funciona, pero realmente funciona ...

La !!convención se usa a menudo para obligar a un entero de distinto de cero y cero a 1 y 0 respectivamente. A muchos desarrolladores de C les gusta usar este tipo de trucos (a menudo en desacuerdo con aquellos que valoran la claridad del código).

Los desarrolladores súper entusiastas de C pueden confirmar que lo anterior funcionará en hardware complementario y firmado. Para aquellos que se preguntan, es casi seguro que trabajarán en hardware de dos complementos en este momento. ¡Solo los realmente afortunados (o desafortunados según su perspectiva) deben preocuparse por esto!

Longitud 48 fragmento

#include<complex.h>
double complex c=3.0+I*4.0;

C99 incluye soporte para números complejos. Como puede ver en el código, toma la forma de un modificador para un tipo real. También podría usar, int complex c=3+I*4;pero internamente coacciona a un tipo de punto flotante. El código anterior se compilará en gcc usando gcc -std=c99 -c length-48.c.

Si desea ver más aspectos internos, intente compilar con el modificador -E. Para mi versión de gcc, la declaración anterior se convierte en double _Complex c=3.0+(__extension__ 1.0iF)*4.0;. Tenga en cuenta que el tipo complejo es una adición significativa al lenguaje, no solo unas pocas macros baratas.

¡Esto es solo un adelanto, cuando llegamos a más de 125 caracteres, entonces podemos comenzar a divertirnos realmente con números complejos!

Fragmento de longitud 51

#include <math.h>
main(){double d=sqrt(sin(3.2));}

Por varias razones, C no se vincula automáticamente a las funciones matemáticas estándar como sin, cos, tan, sqrt, etc. Por lo tanto, si se usan, pero no están vinculadas, se mostrará al desarrollador la referencia indefinida de error del vinculador a 'sqrt' , o algún otro error.

En gcc, el código anterior se compilará y vinculará usando gcc length-51.c -lm.

Note sin(3.2)devolverá un número negativo, del cual la raíz cuadrada no es legal en el dominio real. En C, NaNse devuelve un valor especial para indicar este error, que el programa puede ignorar.

En C99, hay muchas nuevas funciones de manejo de excepciones para proporcionar un control muy seguro y detallado de este tipo de errores matemáticos, ¡que casi nadie usa!

Fragmento de longitud 63

static int w;static int X(int x){static int s=0;s^=x;return s;}

O formateado de manera más sensata:

static int w;
static int X(int x)
{
    static int s=7;
    s^=x;
    return s;
}

Como habrás adivinado, se trata de la palabra clave staticque tiene más de un significado en C.

En los primeros dos casos, staticle dice al compilador que el entero wy la función Xno son visibles fuera de este archivo o unidad de compilación, es decir, son internos.

Estas funciones no están destinadas a ser llamadas externamente, por lo que podrían no verificar la validez de los argumentos y cortar otras esquinas. Debido a que tienen un alcance interno, puede redefinir wy Xen otros archivos, y generalmente estarán separados.

En el último caso, staticindica que el entero sretiene su valor entre llamadas a funciones. La primera vez que Xse llama sserá su valor inicial 7, cuando se ordene con exclusividad, se retendrá xel nuevo valor.

Internamente, aunque depende de la implementación, la organización de memoria habitual es la que sreside en el montón, específicamente la memoria inicializada, mientras que el argumento xreside en la pila. Donde residen las variables es importante si desea implementar algoritmos recursivos, por ejemplo.

Un gotcha en C son choques con variables globales. Hasta wy Xen realidad están definidos como static, si se definen globalmente en algún lugar, a continuación, wy Xse referirán a las entidades globales en su lugar.

Aquí qy wno se puede inicializar con el mismo valor, porque wse está utilizando un global para establecer q:

static int q = w;
static int w;

Si wno existe un global , la compilación debería fallar.

Aquí qy wse inicializará con el mismo valor:

static int w;
static int q = w;

Por lo general, los diseñadores reducirán los conflictos de nombres al agregar un prefijo o sufijo distintivo a sus variables y funciones globales.

En C99, staticha ganado otro uso, por ejemplo, lo int Y(int a[static 10]);que significa que hay una función Yque toma una matriz de al menos 10 enteros.

Fragmento de longitud 74

void f(register int*p,register int*q,register int l){while(l--)*p++=*q++;}

O bien presentado:

void f(register int *p, register int *q, register int l)
{
    while (l--)
        *p++ = *q++;
}

La palabra clave registerproporciona una pista al compilador de que el uso de registros de hardware sería beneficioso aquí. La función anterior copiará lenteros de qa p, utilizando registros de hardware si es posible.

A veces las aceleraciones pueden ser significativas. Por ejemplo, en la familia de microprocesadores 68K, la línea *p++ = *q++podría traducirse a una sola instrucción MOVE.W (Ap)+,(Aq)+frente a seis u ocho si no la usó register. El microprocesador 68K tenía modos explícitos de post-incremento y pre-decremento, por lo que el desarrollador inteligente, si conocía la plataforma, adaptaría el código usando x++y --yvs. ++xy y--.

En la actualidad, los compiladores ignoran la mayoría de las veces register, aparte de no permitir que se les tomen direcciones (por ejemplo, en lo anterior &lse produciría un error del compilador).

Fragmento de longitud 88

#include<stdio.h>
int f(int x){return(x>1)?x*f(x-1):1;}int main(){printf("%d\n",f(12));}

O con un diseño más sano:

#include <stdio.h>

int f(int x)
{
    return (x > 1)? x * f(x - 1): 1;
}

int main()
{
    printf("%d\n", f(12));
}

¡Ah, recursión! El fragmento es un programa completo para compilar, vincular y ejecutar. La función fcalcula el factorial de su argumento xutilizando la fórmula recursiva f (x) = x * f (x - 1). Los factoriales crecen muy rápido, por lo que, por ejemplo, f(12)es el valor más grande que puede obtener en un entero de 32 bits con signo.

Para ver un ejemplo de código realmente recursivo, busque implementaciones ingenuas de la función de Ackermann .

Los compiladores inteligentes pueden optimizar la función, utilizando la sugerencia inliney "desenrollar" la función cuando se proporcionan constantes como argumentos para que:

f(12)

Se convierte en:

12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

¡Sin ninguna función se requieren llamadas!

Otros compiladores pueden reorganizar la función:

int f(int x)
{
    return (x < 2)? 1: f(x - 1);
}

E implementar algo llamado cola-recursión. En efecto, esto reemplaza la última llamada de función a un simple goto y permite que esa función se ocupe del retorno. El beneficio es menos intercambio de fichas, código más rápido y más pequeño.

En lenguaje ensamblador, este tipo de oportunidades de optimización son realmente fáciles de detectar y pueden implementarse mediante algo llamado "optimizador de ojo de cerradura", que básicamente busca pequeños patrones y los reemplaza por algo más rápido y / o más pequeño.

Fragmento de longitud 117

#include<stdio.h>
int main(int c,char**v){int a,b;sscanf(v[1],"%d%*[\t ,]%d",&a,&b);printf("%d\t%d\n",a,b);return 0;}

O:

#include <stdio.h>

int main(int c, char **v)
{
    int a, b;

    sscanf(v[1], "%d%*[\t ,]%d", &a, &b);
    printf("%d\t%d\n", a, b);

    return 0;
}

C tomó prestado de los lenguajes contemporáneos de la época, el concepto de una E / S universal que se podía aplicar de manera consistente a cualquier dispositivo, ya sea consola, tarjeta perforada, cinta, disco o impresora, pero en forma verdadera de C, permitió al desarrollador crear declaraciones muy concisas pero poderosas.

En el fragmento anterior, tomará la entrada de la línea de comandos, analizará dos enteros separados por espacios, tabulaciones o comas y los generará. Aprovecha un scanfespecificador más nuevo %*[\t ,]que: [\t ,]extraerá todas las pestañas, espacios y comas, y los *ignorará.

Recuerdo haber revisado algún código de C ++ donde el desarrollador estaba haciendo todo de la manera "pura" de C ++ <<y un arsenal de métodos como findy substr. Era al menos una docena de líneas y todavía no podía manejar comas como delimitadores. ¡Reemplacé todo ese código torpe con una sola sscanflínea como la de arriba!

Longitud 132 fragmento

#include<stdio.h>
int main(int c,char**v){while(--c){++v;printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n",*v,*v,*v,*v,*v);}return 0;}

O:

#include <stdio.h>

int main(int c, char **v)
{
    while (--c)
    {
        ++v;
        printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n", *v, *v, *v, *v, *v);
    }

    return 0;
}

Las funciones printf, sprintf, fprintfespecificadores etc. formato utilizar para definir el ancho y el relleno de la salida.

Compile y ejecute lo anterior usando argumentos de línea de comando para ver las diferentes salidas:

> main xyz 123456
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                              
|xyz  |                                                                                                                                              
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                 
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|12345|                                                                                                                                              
|12345| 

Tenga en cuenta que la .5salida del especificador se limita a un máximo de cinco caracteres, mientras que el encabezado 5garantiza que la salida sea de al menos cinco caracteres, con -indicación de alineación a la izquierda. Combinarlos establece la salida en exactamente cinco caracteres.


44
No creo que haya un requisito para agregar un nuevo factoid para cada voto a favor :)
Optimizer

28
Una cultura común en C es ignorar las advertencias de compilación , ¡no creo que esto esté cerca de la verdad!
Shahbaz

44
Si tiene un proyecto grande y considera múltiples compiladores, puede ser bastante inútil tratar de eliminar todas las advertencias.
feersum

55
Esto es excelente
Kik

44
Soy programador en C y no le tengo miedo a Haskell.
Shahbaz

138

Código de máquina x86

Hecho:

x86 Machine Code es la versión ensamblada de x86 Assembly que el procesador realmente ejecuta. Fue desarrollado cuando la memoria y el espacio de almacenamiento eran caros, y fue diseñado para ser algo compatible con Intel 8008. Mantener el código ejecutable pequeño era uno de los objetivos, y utiliza instrucciones de longitud variable y una arquitectura CISC para ayudar lograr esto (que ha tenido el inconveniente de hacer que sea más complicado mejorar el rendimiento en los procesadores modernos). Esto, junto con la naturaleza básica del ensamblaje y el código de máquina en general, le da a los programas x86 la capacidad de ser extremadamente compactos.

Longitud 1:

Ahora para el primer programa:

0xC3

Abra un editor hexadecimal, ingrese ese byte y guárdelo como test.com.

Ahora tiene un programa válido de MS-DOS que regresa inmediatamente sin hacer nada, ya que 0xC3 es la instrucción 'RET'. Sin embargo, esto muestra otro aspecto interesante para jugar golf con x86: el formato de archivo .com. Este formato ejecutable no tiene absolutamente ningún encabezado: el archivo simplemente se carga en la memoria comenzando en la dirección 0x100, y luego la ejecución se inicia en 0x100. ¡Esto significa que no se desperdician bytes en los metadatos!

Longitud 2:

Nuestro proximo programa:

0x4D 0x5A

o 'MZ' en ASCII.

Ok, hice trampa un poco, eso realmente no es un programa útil, ya que corresponde a las instrucciones

DEC     BP
POP     DX

Que en realidad no son útiles para iniciar un programa .com. De hecho, ese es el objetivo de esos dos valores: ¡ningún archivo .com razonable debería comenzar con ellos! Los archivos .com estaban limitados a 65280 bytes de tamaño (64KiB - 0x100), por lo que cuando comenzaron a necesitarse programas más grandes, se tuvo que desarrollar un nuevo formato. Este era el formato de archivo .exe, que tiene un encabezado. Sin embargo, MS-DOS necesitaba mantener la extensión .com en ciertos componentes para la compatibilidad con versiones anteriores, por lo que necesitaba una forma de detectar si un archivo .com era realmente un .exe. Eligieron la picadura 'MZ' como este número mágico, y hasta el día de hoy, si abre un archivo .exe (o .dll) de Windows en un editor hexadecimal, verá que comienzan con esos dos bytes. Me divierte que incluso el programa de Windows más moderno comienza con una restricción de compatibilidad de los años 70.

Longitud 3:

Ahora para un bucle infinito:

41 E2 FD

Lo que se traduce en

start:
inc cx
loop start 

Este programa incrementa el valor de CX (que será> 0 para comenzar), luego ejecuta la instrucción de bucle. Loop es un excelente ejemplo de una instrucción CISC, ya que combina 3 operaciones simples en una operación de propósito especial: disminuye el valor de CX, comprueba si es 0 y salta a la etiqueta de destino si no. También hay formas de bucle que comprueban otras banderas además de terminar cuando CX es 0. Podríamos haber hecho simplemente 'salto de arranque' para un bucle infinito de 2 bytes, pero esto fue más interesante.

Longitud 4:

Un programa que es mínimamente útil:

40 CD 10 C3

Traducido al ensamblaje:

inc ax    ; 1 byte
int 10h   ; 2 bytes
ret       ; 1 byte

Este programa establece la consola en 40x25 caracteres, borra la pantalla y luego vuelve a la línea de comando. AX está configurado en el modo de video que queremos (1), luego se llama a la interrupción del BIOS 10h para configurar realmente el modo de video y borrar la ventana, antes de regresar. Espere ver más de estas interrupciones de BIOS en el futuro.

Longitud 5:

Ahora podemos implementar un programa de pausa:

B4 01 CD 21 C3

Traducido al ensamblaje:

mov ah,1  ; 2 bytes
int 21h   ; 2 bytes
ret       ; 1 byte

Este programa le dice al BIOS que espere a que se presione una tecla y lo muestra en la pantalla antes de regresar. Esto también demuestra cómo en el x86, algunos de los registros pueden leerse o escribirse parcialmente. En este caso, establecemos el byte superior de AX (AH) en 1. En los procesadores de 32 bits, también puede operar en los 16 bits bajos sin afectar los 16 bits superiores. Esta capacidad de modificar registros parciales puede ser útil para los programadores de ensamblaje, pero tiene inconvenientes para los procesadores modernos que intentan realizar una ejecución fuera de orden , ya que pueden introducir dependencias de datos falsos.

Longitud 9:

Ahora para mostrar realmente la salida:

68 00 B7 07 AB 40 79 FC C3

Traducido al ensamblaje:

; These two instructions set up ES, the 'extra segment'
push 0xb700 ; 3 bytes
pop  es     ; 1 byte
label:
stosw       ; 1 byte, Store Word - Copy AX to [ES:DI] then add 2 to DI
inc  ax     ; 1 byte
jns  label  ; 2 bytes, Jump Not Signed - Jump unless the sign flag is set (when inc AX yields 0x8000
ret         ; 1 byte

La salida es el juego de caracteres predeterminado que se repite en diferentes colores. El byte bajo de AX es el código de caracteres, y el byte alto especifica los colores a usar. Juego de caracteres predeterminado repetido en diferentes colores

Los programas de 16 bits solo pueden direccionar hasta 64 KB directamente. Para evitar esto, el x86 utilizaba 'segmentos': registros especiales que se multiplicarían por 16 y se agregarían a todos los accesos de memoria para proporcionar 20 bits de memoria direccionable. Un programa podría cambiar los valores de estos registros de segmento para acceder a más memoria, o áreas especiales de memoria: este programa modifica el segmento adicional para escribir en la memoria de video. Los diferentes tipos de acceso a la memoria utilizaron diferentes registros de segmentos, permitiendo que el código, los datos y la pila estén accesibles en diferentes fragmentos de memoria al mismo tiempo. El segmento predeterminado también podría anularse para muchas instrucciones.

Longitud 20:

Hagamos algo reconocible: utilizaremos la 'Regla 90' para dibujar triángulos de Sierpinski.

B0 13 CD 10 68 0F A0 1F AC 31 C2 88 94 3E 01 87 D3 93 EB F4

En asamblea:

mov al,13h      ; 2b
int 10h         ; 2b - Set the video mode to 13h

push    0xA00F  ; 3b
pop     ds      ; 1b - Set the data segment to video memory

start:          ; This loop runs 'Rule 90' to draw Sierpinski triangles
lodsb           ; 1b - load al with [ds:si] then increment si

xor     dx,ax   ; 2b - xor the left and right values of the previous row of pixels
mov     [si+318],dl ;4b - store result to memory

xchg    dx,bx   ; 2b - swap register values
xchg    ax,bx   ; 1b - swapping with ax is 1 byte shorter

jmp     start   ; 2b - infinite loop

Salida de muestra: Triángulos Sierpinski

Para este programa, utilizamos el famoso 'Modo 13', un modo gráfico que tiene una resolución de 320x200 con 256 colores. Fue utilizado por muchos juegos populares de DOS , como Doom.

Longitud 21

Veamos quién fabricó la CPU en la que estamos corriendo

0F A2 66 60 BB EE FF B9 0C 00 8A 17 43 B4 02 CD 21 E2 F7 FF E1

Traducido al ensamblaje:

cpuid         ; 2b  CPU ID - retrieve processor information based on the value in AX. For AX=0,
              ;     the 12 bytes in EBX, ECX, and EDX are loaded with a vendor identification string
pushad        ; 2b  Push all registers on the stack (32 bit version)
mov  bx,0xffee; 3b  Start of the vendor identification string on the stack
mov  cx,12    ; 3b  12 characters to print
print:    
mov  dl,[bx]  ; 2b  Character to print
inc  bx       ; 1b  Advance string position
mov  ah,2     ; 2b  Set AH to the 'Print character to STDOUT' value
int  21h      ; 2b  Call the bios interrupt to print
loop print    ; 2b  Decrement CX and jump if it is not zero
jmp  cx       ; 2b  Instead of restoring the stack, just jump right to the exit point

Salida de muestra:

c:\misc>cpuid.com
GenuineIntel

Este programa utiliza la instrucción CPUID para obtener información sobre el procesador en el que se está ejecutando, en particular, la cadena de identificación del proveedor. La mayoría de las personas verá 'GenuineIntel' o 'AuthenticAMD', a menos que tengan un fabricante de CPU poco común o se ejecuten en ciertas máquinas virtuales.

Longitud 26

Ahora podemos hacer animaciones interesantes.

B0 13 CD 10 C4 07 BB 40 01 59 99 89 F8 F7 F3 31 D0 AA E2 F6 26 FE 05 47 EB FA

En asamblea

mov al,13h     ;2b
int 10h        ;2b Enter Video Mode 13h

les ax,[bx]    ;2b Set ES to (roughtly) video memory
mov     bx,320 ;3b Set up  BX asdivisor
pop     cx     ;1b Zeroize CX

start:
cwd            ;1b Sign extend AX to DX, AX will never have the sign bit set so this zeroizes DX in 1 byte
mov     ax,di  ;2b Copy video memory pointer
div     bx     ;2b Divide by width to get AX = Y pos, DX = X pos
xor     ax,dx  ;2b X pos ^ Y pos
stosb          ;1b Store and increment video pointer
loop    start  ;2b CX starts at 0, so this will loop until it wraps around

cycle:
inc     byte [es:di];3b Increment value in video memory to animate
inc     di     ;1b Increment video memory pointer
jmp     cycle  ;2b Infinite loop 

Y la salida se verá así:

XOR marchando

La función X pos ^ Y pos produce un fractal interesante, especialmente cuando está animado

Longitud 27

No solo puede generar texto y gráficos en un pequeño programa x86 .com, también puede generar sonido y música:

BA 31 03 B0 3F EE BA 30 03 B0 93 EE B4 01 CD 21 3C 1B EE 3C 1B B0 7F EE 75 EC C3

En asamblea:

    mov dx,0x331            ; value for the midi control port
    mov al,0x3F             ; command value to set midi mode to UART
    out dx,al               ; output the command to the midi control port
play_loop:
    mov dx,0x330            ; value for the midi data port
    mov al,0x93             ; midi instrument value (piano)
    out dx,al               ; output to midi data port
    mov ah,1
    int 0x21                ; read character from stdin, with echo
    cmp al,27               ; test if it is escape
    out dx,al               ; output the ascii value as the midi note to play
    mov al,0x7F             ; note duration
    out dx,al               ; output note duration
    jne play_loop           ; loop if escape was not pressed
    ret  

Este programa usa la tarjeta midi para convertir el teclado en un piano. Para hacer esto, la tarjeta midi se configura en modo UART, que reproduce notas midi tan pronto como se reciben. A continuación, el programa espera a que se presione un carácter y muestra el valor ASCII como una nota en la tarjeta midi. El programa se ejecuta hasta que se presiona escape.

Longitud 29

Usemos un sistema de funciones iteradas para generar un fractal de curva de dragón:

B0 13 CD 10 89 D0 01 CA 29 C1 D1 FA D1 F9 73 03 83 E9 7A B4 01 CD 16 B8 02 0C 74 E6 C3

Traducido al ensamblaje:

mov  al,13h
start:
int  0x10    ; This does double duty, setting the video mode to 13h at program start,
             ; and calling the 'draw pixel at coordinates' interrupt when looping
mov  ax,dx   ; The next couple instructions are our IFS, the algorithm is aproximately
add  dx,cx   ; f(y) = 0.5x + 0.5y
sub  cx,ax   ; f(x) = 0.5x - 0.5y OR f(x) = 0.5x - 0.5y - 1
sar  dx,1    ;
sar  cx,1    ;
jnc  skip    ; This jump handles pseudo-randomly switching between the two functions for x,
             ; based on if the previous value of x was odd or not.
sub  cx,122  ; Magic number, chosen since it provides sufficent 'randomness' for a filled in
             ; fractal and a good scale to the fractal. 102 and 130 also work.
skip:
mov  ah,1
int  0x16    ; Get keyboard state, zero flag will be set if no key has been pressed
mov  ax,0xC02; Set up AH for the draw pixel function when int 0x10 is executed,
             ; AL = color, CX = column, DX = row
jz   start   ; Loop if a key hasn't been pressed
ret  

Salida:

Curva del dragón

Al presionar una tecla sin control, el programa saldrá. Esto se basa en Fire Coral by Desire en Pouet.net.

Longitud 52

Este programa es una característica doble, muestra un poco del coprocesador de coma flotante x87 y el código de auto modificación.

B3 07 D9 E8 B1 11 DE 0E 32 01 E2 FA BE 0A 24 56 B1 09 DF 34 AC D4 10 
86 E0 05 30 30 50 E2 F5 44 B4 2E 50 89 E2 B4 09 CD 21 FE 06 03 01 4B
75 D2 CD 20 0A 00

Cuando se ejecuta, el programa generará varias constantes matemáticas:

1.00000000000000000
3.32192809488736235
1.44269504088896341
3.14159265358979324
0.30102999566398120
0.69314718055994531
0.00000000000000000

Estos son One, Log2 (10), Log2 (e), Pi, Log10 (2), Log e (2) y Zero.

En asamblea:

org 100h

mov     bl,7         ;Counter for the total number of constants to print
start:
fld1                 ;Floating point constant to load on the FP stack,
                     ;start with 1 since it's op-code is the lowest

mov     cl,17        ;Multiply the constant by 10, 17 times to get the
mult:                ;printing part as an integer
fimul   word[ten]
loop    mult

mov     si,10+'$'*256;ASCII new line (10) and the end-of-string ($)
                     ;characters. These are used both as
push    si           ;a constant memory location, and stored to the
                     ;stack to format and printing

mov     cl,9         ;print 18 digits (9 pairs)
fbstp   [si]         ;store the integer part of the floating point
                     ;number on top of the FP stack as a packed
                     ;binary-coded decimal number (1 digit/nibble),
                     ;and then pop the number off the FP stack

convert:
lodsb                ;load a pair of packed digits

db 0xd4,16 ; AAM 16  ;ASCII Adjust For Multiply instruction using
                     ;non-standard base 16. This puts AL/16 in AH,
                     ;and AL%16 in AL, unpacking the digit pair.

xchg    ah,al        ;Swap the digit order
add     ax,'00'      ;Convert the digits to ASCII values
push    ax           ;Store digits on the stack
loop    convert

inc     sp           ;AX now holds the 1st 2 digits to print,
mov     ah,'.'       ;so to insert a decimal point, the 2nd digit
push    ax           ;is replaced with a '.', the stack pointer
                     ;is adjusted to overwrite 1 byte, and then
                     ;AX is pushed on the stack

mov     dx,sp        ;Load DX with the start of the print string
mov     ah,9         ;Load AH with the 'Print String' constant
int     21h          ;Call the 'Print String' interrupt to display
                     ;the constant

inc     byte[start+1];Self-modifying code - increment the load
                     ;floating point constant op-code to iterate
                     ;through all of them

dec     bx
jnz     start        ;Exit when all 7 constants have been printed
int     20h


ten: dw  10

La matemática de punto flotante en los sistemas x86 fue manejada originalmente por el coprocesador x87 opcional, no fue hasta el 486 que se movió al mismo chip. El x87 también tenía una arquitectura bastante diferente, estaba basado en la pila, con 8 registros de 80 bits disponibles. También tenía una variedad de modos de redondeo, precisión y excepciones enmascarables que se podían configurar.

Este programa imprime los valores de siete constantes cocidas en los procesadores. Puede parecer extraño que el espacio de instrucciones se desperdicie en constantes simples como 0 y 1, pero tenga en cuenta que el conjunto de instrucciones se creó cuando la memoria era pequeña, y estas instrucciones suelen ser 2 bytes más pequeñas que las operaciones equivalentes. El programa también utiliza una instrucción oscura, FBSTP -'Store BCD Integer and Pop '. Cuando se desarrolló el x86, las operaciones con números BCD eran más comunes, y el x86 / x87 tiene varias instrucciones específicamente para simplificar las matemáticas BCD, como la instrucción AAM 'ASCII Adjust for Multiple' también utilizada en el programa.

En el modelo de memoria desprotegida utilizado por los primeros programas x86, no hay distinción entre datos y código. Debido a esto, es fácil iterar a través de las instrucciones 'Load Constant' codificadas secuencialmente simplemente incrementando el valor apropiado.

Longitud 64

Al publicar mi entrada para el Reto Mandelbrot , se puede escribir un programa que muestre un fractal Mandelbrot de 320x200 colores en solo 64 bytes.

B0 13 CD 10 C4 07 99 89 F8 B9 40 01 F7 F1 83 E8 64 FE CE 31 DB 31 F6 
89 F5 0F AF F3 01 F6 0F AF DB 70 19 0F AF ED 70 14 01 EB 70 10 29 EB
29 EB C1 FB 06 01 D3 C1 FE 06 01 C6 E2 DB 91 AA EB C6

En asamblea:

mov al,13h ; set up graphics mode 13
int 10h

les ax,[bx]; trick to set video memory

FillLoop:
cwd
mov ax,di  ; di is the current position on screen
mov cx,320 ; convert di int x,y screen coordinates
div cx     ; CX is the iteration counter, exit the loop if it hits
           ; zero before the value escapes.
sub ax,100 ; center the fractal vertically
dec dh     ; center the fractal horizontally

xor bx,bx
xor si,si

MandelLoop: ; Fairly standard Mandelbrot routine,
mov bp,si   ; exits if the values overflow
imul si,bx
add si,si
imul bx,bx
jo MandelBreak
imul bp,bp
jo MandelBreak
add bx,bp
jo MandelBreak
sub bx,bp
sub bx,bp

sar bx,6   ; We use fixed point math with the lowest 6
add bx,dx  ; bits being the fractional portion, so this
sar si,6   ; rescales the values after multiplication
add si,ax

loop MandelLoop

MandelBreak:
xchg ax,cx ; Write the escape itteraction as the color
stosb
jmp FillLoop

El resultado final es esta imagen:

Fractal de Mandelbrot

Este programa usa matemática de punto fijo para generar el fractal, ya que toma menos bytes. Los 6 bits más bajos de los registros de 16 bits se consideran la parte fraccionaria del número, y los valores se reescalan después de multiplicarse.


77
De todos los idiomas para ver en PPCG, no esperaba esto.
Alex A.

23
Guau. Además de otros personajes para hacer de esto un comentario. Pero en serio. Guau.
krs013

2
@Michael Edenfield ¡Para eso es DOSBox!
Sir_Lagsalot

1
20 byte Sierpinski es muy impresionante.
qwr

1
Me considero un buen programador, pero cuando veo esto, debo admitir la derrota.
Stephan Bijzitter

121

Haskell

Es posible que desee leer de abajo hacia arriba. A veces me refiero a fragmentos más bajos, pero nunca a los más altos, por lo que podría ayudar a comprender.

Lectores que no conocen a Haskell: ¿estoy claro? ¿Cuándo no estoy claro? No puedo decirlo

Fragmento de longitud 86

Una instancia plegable para nuestra estructura de datos de árbol (fragmento 23). Plegable es una clase de tipo, como en una clase (/ grupo) de tipos. Estos son paralelos a las interfaces en Java. Básicamente se generalizan sobre tipos, unificando tipos que tienen características comunes; por ejemplo, se pueden agregar juntos ( Monoid), contenedores ( Functor), se pueden imprimir como texto ( Showque ya conocimos, en la showfunción), etc. Éste unifica los tipos de datos que son parecidos a una lista, ya que se pueden iterar o aplanar en una lista.

En este fragmento, definimos la instancia definiendo foldr, que esencialmente itera sobre el tipo de datos de derecha a izquierda. Ahora, podemos usar un montón de código preescrito general. En primer lugar, se define una función auxiliar para conseguir un árbol único, para evitar todo el desorden: s a = N E a E. Ahora:

sum (N (s 3) 7 (N E 5 (s 8))     === 23
product (N (s 3) 7 (N E 5 (s 8)) === 840
toList (N (s 3) 7 (N E 5 (s 8))  === [3,7,5,8]

y así.

Aquí hay una foto de nuestro árbol:

7
| \
3  5
    \
     8

Fragmento de longitud 70

primes=sieve[2..] where
 sieve(p:xs)=p:sieve(filter(\x->x`mod`p/=0)xs)

Este es un tamiz de primera!

(nota: /=es lo que !=hay en otros idiomas)

Esto funciona definiendo una función sieveque filtra la lista y mantiene solo los números que no son divisibles por ningún primo anterior. Se define de forma recursiva: sievese define como dividir la lista en un primer elemento py una cola, filtrar de la cola cualquier número divisible por p, sieveel bit restante, adjuntar pal inicio de eso y volver.

Una vez más, estamos trabajando con listas infinitas aquí, pero el cálculo se detendrá con el tiempo siempre que no requiera una cantidad infinita de primos para calcular.

take 4 primes === [2,3,5,7]

Fragmento de longitud 68

Finalmente, una quine!

main=do putStr s;print s where s="main=do putStr s;print s where s="

En la primera vez que lees esto, podrías pensar que a la salida de este quine le faltarían comillas, y ¿por qué escribirías putStruna vez print? Suena igual

En Haskell, putStres una función que simplemente imprime el contenido de la cadena que llega a stdout; print, sin embargo, imprime cosas en stdout. Entonces, print 4es equivalente a putStr "4\n", pero no putStr 4tiene sentido, ¡ 4no es una cadena! Entonces, cuando printobtiene un valor, primero lo convierte en una cadena y luego imprime esa cadena. En general, la forma de convertir cosas en cadenas es encontrar la forma en que lo escribiría en código. Entonces, la forma en que escribiría la cadena abcen una cadena en el código Haskell es "abc", por lo que en print "abc"realidad se imprime "abc", no abc.

Qué afortunado tengo suficientes votos ahora, no tendré que jugar golf estas cosas

Fragmento de longitud 33:

main=go 0
go n=do print n;go(n+1)

Lo importante a tener en cuenta es que no usamos un bucle. Haskell no se repite. Haskell recurre. Haskell no tiene bucles. Es más profundo que eso: Haskell ni siquiera tiene flujo de Control . ¿Cómo, podrías preguntar? Bueno, no necesita ninguno.

Con los detalles. Este programa imprime una secuencia infinita de números enteros, comenzando desde 0. los goimprime comenzando con su entrada, luego mainlo activa 0.

doEs un poder sintáctico especial de Haskell. En este escenario, solo combina acciones de E / S, al igual que lo >>hace (ver fragmento 22).

Fragmento de longitud 26:

map f=foldr(\x y->f x:y)[]

Esto define la mapfunción, probablemente familiar para todos, usando foldr. Tenga en cuenta que aunque no declaramos mapel tipo, la computadora de alguna manera sabe que su tipo es (a -> b) -> [a] -> [b], es decir, dada una función de aa b, y una lista de as, devuelve una lista de bs.

¿Cómo lo supo? ;-)

Fragmento de longitud 25:

main=putStr"Hello World"

El estándar Hello World. Tenga en cuenta los tipos: maintiene tipo de IO ()y putStrtiene tipo de String -> IO ()(una función desde cadenas hasta acciones de E / S que no devuelven nada).

Fragmento de longitud 23:

data T a=E|N(T a)a(T a)

Esta es una definición estándar de un árbol. Cuánto más fácil que todas esas líneas requeridas para definir un árbol en Java, C o cualquier otra cosa.

(ver fragmento 10)

Vamos a desglosarlo:

data- esta declaración declara un tipo de datos. T a- un árbol que contiene elementos de tipo a. Este es el tipo que estamos definiendo. =- cada valor de T aserá cualquiera de los siguientes, separados por una tubería |. E- uno de los posibles valores de T s- el árbol vacío. N (T a) a (T a)- el otro valor posible de un árbol - un nodo. Cada nodo consta del (T a)elemento secundario izquierdo ( ), el elemento ( a) y el elemento secundario derecho ( (T a)).

Fragmento de longitud 22:

main=putStrLn"y">>main

Una yesfunción de Haskell . >>es un operador que combina y secuencia dos acciones de E / S. Tiene tipo de >> :: IO a -> IO b -> IO b.

mainse define recursivamente por sí mismo, como la acción de E / S que primero imprime "y"y luego hace lo que sea que mainhaga.

Fragmento de longitud 18:

fix f=r where r=f r

Una mejor definición para fix. (Ver fragmento 14.) El problema con la primera definición, fix f = f(fix f)es que cada vez que llamamos fix f fixretiros fix f, que retiros fix f, generan infinitas copias del mismo cálculo. Esta versión lo arregla definiendo r(resultado) como el resultado; como tal f r = r,. Entonces, definamos r = f r. Ahora volvemos r.

Fragmento de longitud 17:

f n=product[1..n]

Esta es la forma funcional de definir factorial.

Fragmento de longitud 16:

f n=(\x->x+x+x)n

(\x -> x + x + x)es una lambda (alguien pensó que se \parece a la letra).

(\x -> x + x + x) nes la lambda aplicada n(esto es exactamente lo mismo que n + n + n).

fes la función multiplicar por tres (también f = (*3))

Fragmento de longitud 15:

sum=foldl (+) 0

Esto define la sumfunción usando un pliegue. Un pliegue es básicamente un ciclo sobre los elementos de una lista con un acumulador.
foldltoma como argumentos alguna función fy algún valor inicial xpara el acumulador y una lista xs. La función fdebe obtener como entrada el valor del acumulador anterior y el valor actual de la lista, y devuelve el siguiente acumulador.
Luego, el pliegue itera en los valores de la lista, aplicando fel acumulador anterior, y luego devuelve el último acumulador.

Otra forma de pensar sobre los pliegues es como los pliegues 'insertos' fentre los valores de la lista y con el acumulador inicial en uno de los lados. Por ejemplo, foldl (*) 1 [4,2,5]evalúa a 1 * 4 * 2 * 5.

Fragmento de longitud 14:

fix f=f(fix f)

El ycombinador. Generalmente se llama fixporque encuentra el punto fijo de la ecuación f x = x. Tenga en cuenta que a x = infinite loopveces también puede ser una solución, por fix (\x -> x^2 + 5*x + 7)lo que no resolverá la ecuación, x^2 + 4*x + 7 = 0sino que devolverá un bucle infinito.

También puede notar que no siempre x = infinite loopes una solución, debido a la pereza de Haskell.

Esta versión es una fuga de tiempo y espacio; Lo redefiniremos en un fragmento más largo.

Fragmento de longitud 13:

f=sum.map(^2)

Esto define la función f que da una lista devuelve la suma de sus cuadrados. Es la función de la composición de la función sum y la funciónmap(^2) , que a su vez es la función map aplicada a la función (^2) (el cuadrado función ), que es a su vez una sección de la función ^ (secciones se introdujeron en fragmento 2, y composición en fragmento 3 )

Como puede ver, las funciones son bastante importantes en un lenguaje funcional como Haskell. De hecho, se ha dicho que Haskell es el lenguaje con las funciones de biblioteca más estándar que obtiene funciones como entradas o funciones de retorno como salidas (esto se conoce comúnmente como una función de orden superior .

Por cierto, técnicamente, cada función de argumento de dos o más es una función que devuelve funciones como salidas (esto se llama curry).

Fragmento de longitud 10:

data B=T|F

Esta es una definición de booleanos Haskell con diferentes nombres. El tipo booleano se llama B.
Esta definición introduce dos constructores: verdadero ( T) y falso ( F).
Este fragmento de código básicamente le dice al compilador que cada booleano ( B) es verdadera ( T) o falso ( F), o en otras palabras, B=T|F.

De hecho, todos los tipos de datos pueden definirse en Haskell, cuando en otros idiomas el número, las referencias y los tipos de datos de matriz necesitan un soporte especial del compilador. En la práctica, hay un soporte especial en Haskell, ya que de lo contrario sería muy inconveniente, pero, por ejemplo, el Booltipo de datos se define completamente en lenguaje.

Fragmento de longitud 9:

main=main

Este programa sin sentido se definirá maincomo principal. Debido a que Haskell es vago, los valores que requerirían un bucle infinito para evaluar pueden usarse libremente si no usamos su valor real. Dichos valores que contienen bucles infinitos, como el nuestro main, se denominan "fondos".

Un hecho divertido es que el compilador GHC Haskell puede detectar este tipo de bucles infinitos y generar una excepción atrapable (!) Cuando se ejecuta.

Fragmento de longitud 8:

f(x:_)=x

Esto define la función fque, dada una lista no vacía, devolverá su encabezado.

Los patrones en Haskell son como el desempaque de secuencias de Python, pero generalizados para todos los tipos. Los patrones pueden rechazar o hacer coincidir un valor y, si coincide, pueden vincular variables a valores.

Los patrones en este fragmento son:

  • _: el patrón que coincide con cualquier cosa y no se une a ninguna variable.
  • x: el patrón que une cualquier cosa y lo une a la variable x.
  • :: este patrón llega a los patrones secundarios, es decir, uno para la cabeza y otro para la cola. Si la lista no está vacía, los empareja con la cabeza y la cola.

La coincidencia de patrones es muy generalizada. De hecho, solo definir nuevos tipos de datos introducirá automáticamente patrones para trabajar con ellos.

Fragmento de longitud 5:

x=2:x

Whoa, hay mucho que explicar sobre esto.

En primer lugar, Haskell es vago. Esto significa que las subexpresiones se evaluarán solo cuando sea estrictamente necesario.

Nota: este fragmento de código no muestra la asignación, sino la definición. Haskell no tiene tarea.

Este fragmento de código definido x, una lista infinita compuesta en su totalidad por 2. Por lo general, en otros idiomas xdebe evaluarse antes de 2:xpoder evaluarse, pero en Haskell podemos hacer esto.

Las listas infinitas de Haskell son una especie de mezcla de iteradores y listas enlazadas regulares: actúan como ambos (una iteración en un rango utilizará memoria constante, por ejemplo).

Fragmento de longitud 4:

2:[]

Este fragmento solo codifica la lista singleton [2]. :es el operador de Contras en Haskell. De hecho, la sintaxis de la lista regular es solo azúcar sintáctica para el operador contras y el literal de la lista vacía. Esto se relaciona estrechamente con la forma en que Haskell trata con la coincidencia de patrones y los tipos de datos (particularmente el concepto de constructor).

Fragmento de longitud 3:

f.g

En Haskell, .significa composición de funciones. Haskell se puede escribir en un estilo "sin puntos", que se caracteriza por no nombrar argumentos de función y en su lugar usar el .operador para manipular el flujo de datos.

Fragmento de longitud 2:

1-

Cuando este código se envuelve entre paréntesis (por razones sintácticas) se llama una "sección". Es entonces una función que dado un número, "llena" el espacio vacío y devuelve uno menos ese número. Esta noción a veces es útil en un lenguaje funcional como Haskell, donde de lo contrario se necesitaría una lambda.

Fragmento de longitud 1:

1

En Haskell, 1puede ser tanto un Int, Float, Double, Wordy así sucesivamente. De hecho, puede escribir código para definir una versión de 1cualquier tipo y usarlo libremente.
Esto también se hace en JavaScript, Python, etc., pero a diferencia de ellos, se hace con total seguridad de tipo.

hecho:

Originalmente, el comité de Haskell tenía la intención de llamar al idioma "Curry" después del nombre de Haskell B. Curry, pero decidió cambiar el nombre a Haskell porque podrían surgir algunos juegos de palabras. ¡Solo después notaron la similitud de Haskell con "Pascal" y "Hassle"!


No sé si debería reemplazar el factoid con el hecho de que Haskell tiene la mayoría de las funciones / operadores en su biblioteca estándar que generan funciones a partir de otras funciones (y que técnicamente cada dos o más funciones de parámetros es tal). ¿debería?
orgulloso Haskeller

Muéstrelo en un fragmento y agréguelo en la explicación.
Martin Ender

f=0:1:zipWith(+)f(tail f) -- 25 chars, una función que devuelve una lista calculada de forma diferida de los números de Fibonacci.
chamini2

ugh agregué un montón de fragmentos y luego mi computadora se apagó
Haskeller orgulloso

@proudhaskeller Ahorro op. Nunca he hecho esto personalmente, pero si tiene que hacer una edición grande a la vez, puede realizar la edición en un documento externo con guardarla y luego pegarla cuando esté completa.
mbomb007

99

C#

C # es una combinación divertida y loca de características de Java, C, Haskell, SQL y muchos otros lenguajes, y ofrece muchas características y API realmente agradables. También es conocido por aquí por ser bastante detallado, ¡pero veremos qué podemos hacer!

Ignoraré el habitual repetitivo:

class Program { public static void Main(string[] args) { ... } }

Longitud 1:

;

¡Los comandos terminan con punto y coma en C #! Una línea vacía es una sintaxis perfectamente válida.

Longitud 5:

x=5f;

Cuando especifique números literales en C #, el compilador asumirá que son ints o dobles (en función de si tienen un punto decimal). Si desea utilizar un flotante literal, debe especificarlo agregando 'f' al número, o se lanzará en tiempo de ejecución, incurriendo en un pequeño costo.

Longitud 7 (bytes):

s=@"
";

Si prefijas un literal de cadena con un signo @, se convierte en un literal de cadena "literal". Los literales de cadena normales analizan secuencias de escape como '\ n' en caracteres especiales, pero los literales literales no lo hacen, lo que le permite usar el carácter de barra diagonal inversa sin escapar de él. También pueden incluir retornos de línea, como se muestra. Eso podría ahorrarle unos pocos bytes en el golf o hacer que sus literales de cadena de varias líneas sean más legibles. Solo ten cuidado con la sangría que se incluye en la cadena.

Longitud 8:

()=>x=y;

Esta expresión es una función anónima. Devuelve un objeto de tipo Actionque se puede pasar y también se llama como una función. Las funciones anónimas heredan el alcance en el que se declararon, y extraen cualquier variable local en ese alcance con ellas a donde sea que vayan.

Longitud 9:

(a)=>a.p;

Aquí hay otra función anónima que usa un parámetro y un valor de retorno. La expresión devuelve un objeto de tipo Func(el Func en sí mismo devuelve el tipo de a.p. Usará Funcmucho para interactuar con Linq.

Longitud 10:

enm.Any();

Esta es nuestra primera introducción a Linq! Linq es un conjunto de métodos de extensión a los que se puede llamar en cualquier objeto enumerable (implementando la interfaz IEnumerable), como Arrayy List. IEnumerable emplea una evaluación perezosa: revisa la colección un elemento a la vez, sin conocer la colección en su conjunto, ¡incluso podría ser infinito!

Ahí es donde Anyentra: regresa truesi el Enumerable contiene al menos 1 elemento. Mucho mejor que calcular toda la longitud.

Longitud 11:

var a=1.5f;

La varpalabra clave indica al compilador que determine automáticamente el tipo de a. aen este caso se escribirá como Single. Muy útil para el golf de código, ya que es mucho más corto que casi cualquier nombre de tipo, aunque a muchos no les gusta usarlo en el código de producción.

Longitud 15:

yield return 0;

Aquí hay una declaración loca con la que puede estar menos familiarizado. Usted sabe que los objetos pueden ser enumerables heredando IEnumerable, pero ¿sabía que las funciones pueden ser enumerables? Declare una función con un tipo de retorno de IEnumerable, y téngala yield returntantas veces como desee. Cuando obtiene un Enumerator para la función, cada llamada a GetNexthará que el programa ejecute todo el código hasta el siguiente yield return, devuelva ese valor y luego haga una pausa hasta que avance de nuevo. Usas yield breakpara finalizar la iteración.

Longitud 16:

[Obsolete]int a;

Este fragmento muestra un atributo. Un atributo es un tipo de etiqueta que puede pegar en cualquier declaración en su código. Algunos le indican al compilador que haga ciertas cosas, como esta que emite una advertencia obsoleta si llama a. Puede crear el suyo extendiéndolo Attribute, y puede consultarlos usando Reflection (quizás más sobre eso más adelante). Puede ir a meta y restringir en qué tipo de declaraciones se puede usar un atributo con el AttributeUsageatributo.

Longitud 17

c.Count(t=>t==3);

Aquí hay un práctico método de golf. Dado Funcque asigna un elemento de lo enumerable ca bool, devuelve el número de elementos cpara los que eso Funcdevuelve true. Mucho mejor que escribir un bucle.

Longitud 18:

foreach(T t in c);

Este es un ciclo para cada uno. Con toda esta charla de cosas enumerables, esta es una estructura muy necesaria. foreaches un azúcar sintáctico que configurará un enumerador para c(que debe ser enumerable) e iterará a través de él un elemento ta la vez. Puede alterar o examinar cada elemento individual, pero alterar la colección en sí invalidará el enumerador.

Longitud 19

c.Select(t=>t.a/2);

Esta es su función de "mapa", para los fanáticos de la programación funcional. Seleccionar es una forma concisa y agradable de realizar una conversión arbitraria (definida por un Funcpaso) en cada elemento de un enumerable. Devuelve un IEnumerable que escupirá los elementos "convertidos" cuando lo itere.

Longitud 21

Console.Write("Hi!");

Esta línea escribe texto en stdout, y es probablemente una de las principales razones por las que C # no se usa mucho para jugar al golf.

Longitud 23

typeof(T).GetMethods();

C # admite una característica muy poderosa llamada Reflection. Reflection le permite examinar la estructura de su código en tiempo de ejecución. Por ejemplo, esta llamada devolverá una matriz de todos los métodos en el tipo especificado. Puede examinar esos métodos, llamarlos o incluso modificar los valores de los campos y propiedades. Los atributos (ver Longitud 16) son una buena manera de etiquetar partes de su código para usar con Reflection.

Longitud 25

from t in c select t.a/2;

¿Eso es SQL? En el código C #? Muy cerca. Esta expresión hace lo mismo que la de Longitud 19.

Longitud 27

for(var l;;l=new object());

C # es un lenguaje recolectado de basura, lo que significa que cualquier memoria que asigne (usando la newpalabra clave) puede liberarse automáticamente siempre que no existan referencias a ella. Este código se ejecutará feliz para siempre aunque nunca libere explícitamente la memoria creada. Sin embargo, la recolección de basura tiene costos: busque en la web para obtener más información.

Longitud 29

var e=Enumerable.Range(0,99);

Enumerable.RangeEs una función de golf potencialmente útil. Devuelve una estructura que se puede enumerar y producirá cada número en el rango especificado, en orden. El segundo parámetro es un recuento, no un índice.

Longitud 31

public int pr{get;private set;}

Aquí, podemos mostrar una 'propiedad' simple, una función OOP y otro sello distintivo de C #. Si alguna vez usó Java, probablemente haya realizado los métodos 'obtener' y 'establecer' para un campo con el fin de separar su accesibilidad o ejecutar el código cuando se cambia. Bueno, C # le permite declarar ese código justo en la parte superior del campo y también establecer modificadores de acceso separados para obtener y configurar. Este fragmento particular crea automáticamente un getter y setter predeterminado, pero hace que el setter sea privado.

Longitud 32

public static void m(this T o){}

Este fragmento muestra una característica de C # que es agradable para el diseño de API. Al aplicar el thismodificador al primer parámetro de un método estático, ese método se convierte en un método de "extensión". Una vez que se declara esto, T.mahora se puede invocar en cualquier objeto de tipo T como si en realidad fuera un método de T. Esto se puede usar para agregar nueva funcionalidad a cualquier clase existente, sin modificar o incluso tener acceso a su código fuente.

Longitud 38

int f(int a,ref int b,out int c){c=0;}

Este método muestra diferentes tipos de paso de parámetros que puede tener en C #. Los parámetros no modificados se pasan por valor . Los parámetros prefijados por refse pasan por referencia: puede asignarles un objeto completamente nuevo y lo sacarán del método. Los parámetros con el prefijo outson como valores de retorno adicionales: debe asignarles un valor en el método, y se vuelven a ejecutar como parámetros de referencia.

Longitud 42

Console.Write("It is \{DateTime.Now()}.");

El nuevo estándar C # 6 puede ahorrarle algunos caracteres cuando tiene que generar cadenas ensambladas, utilizando la interpolación de cadenas. Esta característica le permite escribir cualquier expresión entre llaves dentro de un literal de cadena, y la cadena se ensamblará automáticamente con los valores de esas expresiones en tiempo de ejecución.

Longitud 48

IEnumerable f(){for(int a=0;;)yield return a++;}

¡Solo suficientes personajes ahora para hacer algo con un propósito real! Este método utiliza algunas de las ideas que exploramos anteriormente para crear un Enumerable infinito que simplemente devolverá los enteros, uno por uno, comenzando con 0. Recuerde que C # emplea una evaluación perezosa con Enumerables, por lo que una secuencia infinita es perfectamente válida: puede itere la mayor cantidad de secuencia que desee y explote en cualquier momento.

Longitud 56

int p{get{return mP;}set{mP=Math.Max(value,0);}};int mP;

Aquí hay otro ejemplo de una 'propiedad' (ver fragmento 31). Aquí, he definido diferentes fragmentos de código para gety en setlugar de usar los automáticos como antes. Este ejemplo demuestra cómo puede usar una propiedad para validar el valor asignado a una variable; aquí, no se permite que el valor sea menor que 0. Otros usos buenos de las propiedades incluyen la notificación de un evento cuando se cambia un valor o la reconstrucción de valores almacenados en caché eso podría basarse en este.

Longitud 65

int v;public static implicit operator int(Program o){return o.v;}

Esta característica se llama un elenco implícito. Es como un método de extensión en el sentido de que es un código estático que opera en una clase específica (vea el fragmento 32). Sin embargo, el reparto implícito no se usa al llamarlo, se usa simplemente tratando un Programobjeto como un entero (por ejemplo int i=new Program()). Cuando haga esto, el objeto se convertirá silenciosamente en el tipo con el que lo está utilizando, según el código en la conversión implícita. La mejor práctica dice que solo haga esto cuando no se pierda información como resultado de la conversión.


1
Veamos qué podrá hacer con estos personajes ... ;-)
orgulloso Haskeller

99
Yo diría que, de hecho, está más cerca de Java que C
orgulloso haskeller

Célebre. Creo que casi tenemos suficiente para hacer algo de Linq, ¡esta noche!
BMac

operador estático implícito público int (MyClass o) {return o.objVal;} // 65. Con este código, esta línea es válida: MyClass o1 = new MyClass (10); int o2 = o1; // o2 es 10 ahora. msdn.microsoft.com/en-us/library/85w54y0a.aspx
Zukki

Más fragmentos por favor
Cyoce

98

Java


Longitud 44 fragmento

Object a=System.out.append("Hello, World!");

Imprime Hello, World!en STDOUT.

Fragmento de longitud 43

float[][][][][]a=new float[5][3][7][2][10];

acontiene 10 matrices que contienen cada una 2 matrices que contienen cada una 7 matrices que contienen cada una 3 matrices que contienen cada una 5 floats.

Fragmento de longitud 42

interface A{static void main(String[]a){}}

Un programa completo Como todo en un interfacees inherentemente public, podemos omitir la palabra publicdel método principal.

Fragmento de longitud 36

class A{class B extends A{B.B.B b;}}

ATiene una clase interna B. Esto significa que podemos declarar una variable de tipo A.B.

Pero Bes una subclase de A, lo que significa que tiene todos los métodos, campos y clases internas de A. Por lo tanto, también podemos referirnos al tipo B.B.

En este código, llevamos esto un paso más allá y le damos Buna variable de instancia de tipo B.B.B.

La moraleja: seguir preguntas importantes sobre SO puede enseñarle muchas técnicas interesantes, aunque sin sentido.

Fragmento de longitud 35

l.stream().map("a"::equals).count()

Si les una lista de cadenas, esto nos dice cuántos son iguales "a".

Fragmento de longitud 34

public static void main(String[]a)

Firma del método del método principal de un programa. ¡Solo 11 personajes más y podemos hacer un programa completo!

Fragmento de longitud 33

enum D {NORTH, EAST, SOUTH, WEST}

NORTH, EAST, SOUTH, Y WESTson todas las constantes de tipo D.

Fragmento de longitud 32

Files.readAllBytes("hello.txt");

Lee un archivo completo y devuelve uno byte[]de los contenidos.

Fragmento de longitud 31

new String(new char[]{'h','i'})

Equivalente a "hi". Útil si la "llave está rota.

Fragmento de longitud 30

new JFrame().setVisible(true);

Crea un nuevo marco visible, en el que puede colocar otros componentes.

Fragmento de longitud 29

throws ClassNotFoundException

Obliga a todos los métodos que llaman a esto a usar un bloque try- catcho bien a pasar el error a la pila. Las excepciones marcadas son una de las decisiones más controvertidas de los diseñadores de Java.

Fragmento de longitud 28

int f(int x){return f(x-1);}

Esta función no se ejecuta para siempre; de hecho, en una computadora típica se tarda menos de un segundo. Gracias, desbordamiento de pila.

Fragmento de longitud 27

Object a=new String[]{"a"};

Crea una nueva matriz de cadenas.

Longitud 26 fragmento

Object.class.newInstance()

Crea un nuevo Object.

Fragmento de longitud 25

((Supplier)()->-~0).get()

Es mejor evitar constantes de codificación dura. Esta es una forma orientada a objetos de obtener el valor 1sin usar constantes que no sean 0.

Longitud 24 fragmento

(Function<Long,?>)x->x+1

La función sucesora.

Fragmento de longitud 23

l.removeIf(x->x%10==0);

Si les una lista de enteros, esto elimina todos los valores divisibles por 10.

Fragmento de longitud 22

int i=(new int[7])[5];

Crea una nueva matriz de siete enteros y obtiene el quinto elemento.

Fragmento de longitud 21

Arrays.asList(2L,"a")

Crea una ArrayList con estos elementos.

Fragmento de longitud 20

System.out.print(s);

Impresiones s.

Fragmento de longitud 19

import java.util.*;

Permite el uso concisa de clases como List, Map, Scanner, Timer, y Random.

Longitud 18 fragmento

Math.addExact(x,y)

Agrega dos enteros xy y. Si se produce un desbordamiento, el método arroja una excepción en lugar de dar una respuesta incorrecta.

Fragmento de longitud 17

Double.MIN_NORMAL

El valor positivo más pequeño de tipo double, donde el bit inicial del significado es 0.

Fragmento de longitud 16

System.in.read()

Lee un solo personaje de la consola.

Fragmento de longitud 15

Long.reverse(x)

Invierte los bits en la representación binaria de x.

Fragmento de longitud 14

int x=050+120;

xahora es 160, ya que todo lo que comienza 0se trata como octal.

Fragmento de longitud 13

private C(){}

Un constructor privado evita que otras clases lo instancian. Este patrón es utilizado por las clases Systemy Math, entre otros. Un constructor privado también se puede utilizar para aplicar el patrón Singleton.

Longitud 12 fragmento

static class

Permite la creación de clases internas sin una clase externa que encierra - una solución a un problema enfrentado por muchos programadores .

Fragmento de longitud 11

throw null;

A menudo es necesario lanzar un NullPointerException, pero también es bastante prolijo. Esta es una alternativa mucho más simple.

Fragmento de longitud 10

int[]a,b[]

Define dos variables: ay b. aes de tipo int[]y bes de tipo int[][].

Fragmento de longitud 9

switch(x)

Va a un lugar, dependiendo del valor de x.

Fragmento de longitud 8

break a;

Se escapa del bloque etiquetado a.

Fragmento de longitud 7

goto x;

La gotopalabra clave está reservada en C, C ++ y Java. Si xes una etiqueta, entonces este código envía el programa a la etiqueta apropiada, en C y C ++. Pero es Java, desencadena un misterioso RuntimeException. De hecho, no hay forma de usar la gotopalabra clave en Java.

Fragmento de longitud 6

\u003b

Termina una declaración. Java es raro .

Fragmento de longitud 5

a-=-a

Se duplica arestando su negación.

Fragmento de longitud 4

a&=b

Establece el valor de aa bit a bit y de ay b.

Fragmento de longitud 3

...

Cualquier número de argumentos, consolidados en una matriz.

Fragmento de longitud 2

<>

Permite que el compilador descubra a qué tipo genérico se refiere probablemente. Muy poco parecido a Java.

Fragmento de longitud 1

@

Indica una anotación para permitir que se muestre información adicional sobre métodos y clases.

Factoid

En Java, los bucles infinitos a veces causan errores de compilación. Por ejemplo, el ciclo while(true);no se puede finalizar sin salir del método, por lo que cualquier código posterior provocará un error de "declaración inalcanzable". Como señaló @Optimizer, solo se capturarán algunos bucles infinitos de esta manera.


55
En java, los bucles infinitos no causan errores de compilación. Es su IDE el que los detecta y produce un error. Java simplemente tiene un concepto de declaraciones inalcanzables, por lo que si tiene algo como while(true);en su código, cualquier cosa que se ponga después de esa línea arrojará un error de compilación de la declaración inalcanzable. La lógica detrás de la detección de tales declaraciones es muy estricta, por lo que no reconocerá todos los bucles infinitos de ninguna manera
Optimizer

44
Acaba de ser rechazado, ¡supongo que esto significa que tendrá que eliminar un fragmento! ;) (El voto negativo fue para "Java es raro")
Simon Forsberg

1
Parece que el fragmento # 36 es recursivo y puede extenderse indefinidamente: class A{class B extends A{B.B.B.B.B.B.B b;}}aún se compila.
Natix

3
Votado a favor de ayudarlo a hacer un programa completo;)
durron597

1
But it Java, [goto] triggers a mysterious RuntimeExceptionIncorrecto. gotoNi siquiera compila.
dorukayhan

93

Pitón

¡Ahora comienza con lo más nuevo para tu comodidad! Para leer la longitud 30 comenzando con el primero, vaya al historial de revisiones.

Si alguien tiene sugerencias, siéntase libre de comentar.

Longitud 52:

i=0
while s[i-n:]:print(' '*n+s)[i:n+i];i+=1;i**7**7

Tomado de mi entrada en el desafío Fake Marquee Text . sy ndebe establecerse en una cadena y un entero antes de tiempo. En realidad, no funciona bien en el intérprete gratuito de Python 2 que estaba usando, así que agregué paréntesis (' '*n+s)[i:n+i], y puedes ver que se ejecuta en el intérprete de Python 3 aquí .

Longitud 43:

#-*-coding:rot13-*-
cevag h"Una fubg svefg"

En Python puede codificar la fuente con un códec específico. Esto muestra cómo se puede escribir la fuente en Rot13. La sintaxis general es la siguiente: # -*- coding: <codec-name-goes-here> -*-.

Aquí está traducido:

#-*-coding:rot13-*-
print u"Han shot first"

Las uespecifica que la siguiente cadena literal es una cadena Unicode. Esto es necesario si desea que sus cadenas también estén en Rot13, de lo contrario cada cadena en la fuente es fácilmente legible a pesar del cifrado. Alternativamente, puede usar .encode("Rot13")después de cada cadena (no olvide usar Rot13 también en esto). Según este artículo , algunas codificaciones alternativas son "base64", "uuencode", "zlib" o "bz2".

Longitud 33:

import cmath
print cmath.sqrt(-1)

Este es el módulo de Python para números complejos (imaginarios) . Esto se imprime 1j, ya que Python se ajusta a los estándares y usos de ingeniería jcomo la unidad imaginaria, aunque prefiero i, que se usa más comúnmente en matemáticas, y usa jy kademás ide los cuaterniones , pero estoy divagando. Lea el error / orden de cambio aquí (no se cambiará).

Longitud 30:

f=lambda n:n*f(n-1)if n else 1

¡Ahora definimos nuestra propia función factorial usando la recursión y el ternario if-else! Hasta donde yo sé, esto es tan golfístico como se pone en Python. También podría escribirse de esta manera:, f=lambda n:n and f(n-1)*n or 1mostrando un par de operadores booleanos de Python (y también hecho en 30 caracteres). Consulte el fragmento de longitud 15 para obtener información sobre la lambdasintaxis.

Longitud 29:

import math
math.factorial(7)

Encuentra el factorial de 7, regresando 5040.

Longitud 25:

import math
print math.pi

El módulo matemático de Python proporciona muchas funciones y constantes útiles. Aquí está PI. Las devoluciones 3.14159265359. (En el código anterior, conté la nueva línea como un personaje).

Longitud 24:

f=lambda y:lambda x:x**y

Este es un ejemplo de cierre. Llamar cube = f(3)hará una función cúbica que luego se puede llamar con print cube(24), imprimiendo 13824.

Longitud 19:

print"Hello World!"

Finalmente, ¡suficiente espacio para imprimir algunos resultados básicos! Aquí no se requiere espacio, porque las comillas y paréntesis también son delimitadores. Esto solo funcionará en Python 2, ya que Python 3 cambió la printfunción para que se llame como cualquier otra función. En Python 3, use print("Hello World!"). Para obtener más información sobre la función de impresión y la diferencia entre Python 2 y 3, consulte Novedades de Python 3.0 .

Longitud 16:

[x*3 for x in l]

Una vez más, suponga que les una lista o cualquier otro objeto iterable, como una cadena o un generador. Esta declaración se conoce como una lista de comprensión . Es mucho más corto que usar el estándar para la estructura de bucle. Aquí, devuelve una lista con todos los números multiplicados por 3. ¡TAMBIÉN, las cadenas se pueden multiplicar! Por lo tanto, cualquier cadena de la lista se agregará (concatenada a sí misma) esa cantidad de veces.

Longitud 15:

import this #:)

¡Esto es en realidad un fragmento de longitud 11, pero me di cuenta de que me había olvidado de mostrar el (increíble) huevo de Pascua de Python ! La importación de este módulo imprime The Zen of Python (Ver Factoid). Dato interesante: el módulo this.pyfue codificado en rot13, que espero presentar más adelante.

Longitud 14:

lambda x:x**.5

Esto define una función de raíz cuadrada usando la lambdasintaxis de Python para una función literal. Los literales de función en Python solo pueden contener expresiones, no declaraciones. Esta lambda podría asignarse a una variable, pasar a una función o ejecutarse en línea con (lambda x:x**.5)(9), lo que devuelve 3.0. El uso de exponentes para una raíz cuadrada es una alternativa a la importación de la sqrtfunción en el mathmódulo.

Longitud 13:

1 if x else 0

Este es un ejemplo del operador if ternario de Python. Esto se agregó en Python 2.5 para disuadir a los codificadores de implementarlo manualmente con operaciones booleanas. Aquí, 1se devuelve si se xevalúa True, de lo contrario 0se devuelve.

Longitud 12:

s=input(">")

Esto imprimirá >el texto de solicitud y permitirá al usuario ingresar un valor. Python 2 interpreta cualquier valor que se ingrese, por lo que cualquier cadena necesita comillas. Python 3 cambió esto, por lo que la entrada ingresada no se interpreta automáticamente. Para ingresar una entrada sin interpretarla en Python 2, use raw_input(). En Python 2, input()es equivalente a eval(raw_input()).

Longitud 11:

eval("2e3")

2e3Es una notación científica para el flotador 2 x 10³. La evalfunción interpreta y evalúa cualquier cadena como una expresión. En este caso, tiene el mismo resultado que usar el literal 2e3o float("2e3"). Vuelve 2000.0.

Longitud 10:

range(013)

Esta función devuelve una lista de enteros desde 0el valor octal 013, que es 11(exclusivo), lo que significa que la lista será [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. La función toma hasta tres parámetros similares a la slicefunción que revisamos anteriormente: range(start, stop[, step]). La diferencia es que, con solo un parámetro, el parámetro representa el valor de detención.

Tenga en cuenta que Python 3.x no tiene equivalente. Es rangesimilar, pero en realidad es lo mismo que Python 2 xrange, devolviendo un objeto generador en lugar de una lista.

Longitud 9:

a,b = b,a

Asignación múltiple Esta es una característica simple pero elegante, que le permite asignar múltiples valores al mismo tiempo. En el fragmento proporcionado, se intercambia ay b. ¿Qué pasa con el orden de evaluación, preguntas? Todas las expresiones a la derecha del operador de asignación se evalúan antes de realizar cualquiera de las asignaciones. Esto supera muchos idiomas que requieren una asignación intermedia a una variable temporal.

Longitud 8:

#comment

Sabes lo que es ... Espera, ¿no? Ya sabes, esas cosas que te permiten escribir texto arbitrario para describir una línea de código, lo que hace que sea más fácil de entender. ¿No? Ah, esta bien...

Longitud 7:

l[::-1]

Una vez más, suponiendo que les una lista, esto devolverá la lista en orden inverso. El tercer argumento indica el tamaño del paso. Dado que los tres argumentos pueden ser valores negativos, un tamaño de paso negativo significa iterar en orden inverso. Los argumentos primero y segundo vacíos muestran que estamos iterando sobre toda la lista.

¡Estamos llegando a donde podemos comenzar a usar algunas construcciones más interesantes!

Longitud 6:

l[-6:]

Esto se llama una operación de corte . Si les una lista, devolverá una nueva lista que contiene los últimos seis elementos lcomo una lista. -6representa el índice inicial (6 desde el final), y los dos puntos significan continuar hasta el índice final después (que dejamos en blanco, hasta el final). Si nuestra lista contuviera los números del 1 al 10, esto volvería [5, 6, 7, 8, 9, 10].

Longitud 5:

1<x<5

Una de las increíbles características de Python es permitirle encadenar operadores de comparación. En muchos otros idiomas, esto se escribiría como 1 < x && x < 5. Se pone aún mejor cuando considera múltiples comparaciones: ¡ 1 < x < y < 5es perfectamente válido!

Longitud 4:

0256

Un número entero con un cero inicial es un valor octal literal. Este es un buen truco para la ofuscación de código también. Esto devuelve el valor decimal 174. En Python 3.x, el valor octal se escribiría como 0o256.

Longitud 3:

`3`

Rodear una expresión en backticks es lo mismo que usar repr(), que devuelve la representación de cadena de un objeto. La función intenta devolver la cadena de tal manera que cuando se pasa como argumento a la evalfunción, devolverá el objeto original. No es lo mismo que usar str(), aunque los resultados a veces son los mismos. Para esta entrada, '3'se devuelve en ambos casos. Este es uno de mis favoritos para el golf de código!

¡Funciona solo en Python 2!

Longitud 2:

[]

Una lista vacia.

Longitud 1:

_

El carácter de subrayado es un nombre de variable desechable muy utilizado. Sin embargo, si está utilizando un intérprete de Python (intérprete interactivo), contiene el resultado de la última instrucción ejecutada (y la devolvería nuevamente). Además, de acuerdo con este hilo , también se usa para la búsqueda de traducción en i18n.

Factoid : Python es un lenguaje similar a Java y C. Fue construido con una filosofía de diseño específica (tomado de " PEP 20 - The Zen of Python ":

  • Hermoso es mejor que feo
  • Explícito es mejor que implícito
  • Simple es mejor que complejo
  • Complejo es mejor que complicado
  • La legibilidad cuenta

Debido a esto, aunque los puntos y coma se permiten como delimitador de enunciados, generalmente se omiten a favor del uso de líneas múltiples para facilitar la lectura. Además, la sangría de línea es muy importante.


¡En cualquier momento! No voy a agregar más fragmentos (¡no pude resistir la longitud 9!), Ya que ya estás haciendo un gran trabajo con él. ¡Buena suerte!
nasser-sh

1
longitud 6: volvería [5, 6, 7, 8, 9, 10](los últimos 6 números en la lista)
Vincent

Longitud 16: lno tiene que ser una lista, puede ser cualquier objeto iterable; tuplas, listas y generadores, por ejemplo, todo funciona
nasser-sh

@ Sp3000: Lo he usado con desafíos [de fuente restringida].
Robbie Wxyz

44
¿Sin amor por los buenos viejos import antigravity?
Cipher

87

JavaScript

Esto va más nuevo al más antiguo. Enlace para mí: [ editar ]

Fragmento de longitud 51:

console.log(require('fs').readFileSync(__filename))

Un Node.JS quine esta vez, aunque fallaría cualquier requisito de "quine estricto", debido a la lectura de su propio código fuente.

Fragmento de longitud 50:

a=new XMLHttpRequest;a.open('GET','file');a.send()

¡Finalmente! Una solicitud AJAX (usando Vanilla.JS ). Inicializamos, abrimos y enviamos la solicitud, pero me quedé sin espacio para agregar controladores y realmente hacer cualquier cosa con el resultado.

Fragmento de longitud 49:

msg=new SpeechSynthesisUtterance('Hello World!');

Prepare un vocal "¡Hola mundo!". Será un poco más de trabajo hablarlo realmente. También podemos ajustar el volumen, el tono, la frecuencia y el acento. Ver API de síntesis de voz en HTML5Rocks . Todavía no es compatible con Firefox, ciertamente no con IE .

Fragmento de longitud 48:

function repeat(){setTimeout(repeat,48)}repeat()

Simule setIntervalrecursivamente setTimeouting.

Fragmento de longitud 47:

module.exports=function MyModule(a) {this.a=a};

NodeJS nuevamente, pero el principio es el mismo en todas partes en JS. Esta es una función constructora muy básica, que crea un objeto con una propiedad ( a). La configuración module.exportsexporta la función para usarla require().

Fragmento de longitud 46:

canvas.getContext('2d').fillRect(46,46,46,46);

Esto requiere un <canvas id="canvas"></canvas>elemento. Aprovecha el hecho de que los elementos con ID se rellenan como variables globales, por lo que se puede acceder al elemento canvasdesde JS. Luego lo llenamos con un cuadrado de 46x46 en x = 46, y = 46.

Fragmento de longitud 45:

JSON.parse(require('fs').readFileSync('jsn'))

De vuelta al nodo. Aquí, analizamos un archivo JSON nombrado jsndesde el directorio actual.

Fragmento de longitud 44:

(a=document.createElement('a')).href="/url";

Sobre la base del n. ° 39. Ahora creamos un elemento y asignamos un atributo. Sin embargo, todavía no está en el DOM.

Fragmento de longitud 43:

sq=[1,2,3,4,5].map(function(n){return n*n})

Crea una matriz de los primeros 5 cuadrados, usando map().

Fragmento de longitud 42:

six="1+5",nine="8+1";eval(six+' * '+nine);

Esto funciona en el mismo principio que este , pero carece de JS #definey así termina más feo. Devuelve, por supuesto, la respuesta a la vida, el universo y todo .

Fragmento de longitud 41:

c=function(){var i;return function(){}}()

El comienzo de un cierre. cahora es una función (la interna) con acceso a la variable interna i, pero no hace nada.

Fragmento de longitud 40:

$('p').click(function(){$(this).hide()})

Estamos eliminando totalmente esos párrafos y usando jQuery.

Fragmento de longitud 39:

script=document.createElement('script')

Este es el comienzo de agregar un nuevo script externo. Cree un <script>elemento vacío y mantenga una referencia a él.

Fragmento de longitud 38:

document.getElementsByClassName('abc')

Encuentra todos los .abcelementos en el documento. Por supuesto, con jQuery, es solo $('.abc')...

Fragmento de longitud 37:

b=JSON.parse(JSON.stringify(a={3:7}))

Crea dos objetos idénticos, pero desacoplados a, y b. Si tu hicieras

a={a:1};
b=a;
b.a=3;

terminarías con a=={a:3}, porque ay bseñalarías el mismo objeto. Usamos JSON para desacoplarlos.

Fragmento de longitud 36:

(function f(){return "("+f+")()"})()

Una quine . Imprime su propio código fuente.

Fragmento de longitud 35:

document.body.style.display="none";

Ver # 32. Este solo oculta el documento, sin sobrescribir el contenido.

Fragmento de longitud 34:

Object.prototype.toString.call(34)

Llamar Object.prototype.toStringes una buena forma de saber el tipo de un objeto. Mientras 34..toString()es "34", el fragmento es [object Number].

Fragmento de longitud 33: (el crédito para este es para un usuario anónimo )

+0%-0.&(v\u0061r=~void[{}<<!(0)])

¿Crees que esto no es JavaScript válido? Mejor inténtalo ... (usa Chrome);)

Fragmento de longitud 32:

document.body.innerHTML="hacked"

Halp! ¡Hazxxors! ¡Once! ¡11!

Fragmento de longitud 31:

a=[];for(i=0;i<31;i++)a.push(i)

No es broma, ¡he estado esperando tanto tiempo para poder usar un forbucle! Este crea una matriz de 0-30.

Fragmento de longitud 30:

new Date().getDay()==1?"S":"E"

Primera vez que usa el operador ternario. No podría incluir más de esto en 30 caracteres, por lo que solo sabemos si hoy es domingo o algo más. :PAGS

Fragmento de longitud 29:

Object.keys(window).push('i')

Object.keys(window)obtendrá una matriz de las variables globales (propiedades de window). .push()agregará un elemento a esa matriz. ¿Crees que esto es el equivalente de window.i=undefined? ¡No!

Fragmento de longitud 28:

setTimeout("a=confirm()",28)

Esperar 28 milisegundos no es tan útil, excepto para crear un nuevo hilo.

Fragmento de longitud 27:

document.querySelector('a')

Es una pena que los nombres DOM sean tan largos. Solo pude obtener un enlace aquí.

Fragmento de longitud 26:

JSON.stringify({twenty:6})

Ver # 16. Ahora obtenemos JSON real: una cadena.

Fragmento de longitud 25:

new Badge("Good Answer");

Suponiendo Badge()que una función de constructor toma un argumento ... ¡ se acaba de crear una insignia de Buena respuesta !

Fragmento de longitud 24:

do {alert(24)} while(!1)

En realidad no uso do..whilemucho, pero algunos sí. Si este fuera un whileciclo ordinario , no alertaría nada, porque siempre es falso. do..whilesiempre se ejecutará al menos una vez, así que podemos ver 24.

Fragmento de longitud 23:

window.parent==self.top

Todos estos se refieren al mismo objeto, generalmente conocido como window. Si llamas a una función normalmente, también hay this. ¡Son 5 formas de acceder al objeto global!

Fragmento de longitud 22:

for(i in self)alert(i)

Alerta a todas las variables globales. Resulta ser eso self==window. (Ver el siguiente fragmento).

Fragmento de longitud 21:

"2"+1==21 && 2+1=="3"

Oh mira, son las reglas de lanzamiento de JS nuevamente. Esta afirmación es cierta, por cierto.

Fragmento de longitud 20:

Math.random()<.5?0:1

Elija un número aleatorio del 0 al 1 y redondee con el operador ternario. Aunque sería más fácil de usar Math.round...

Fragmento de longitud 19:

[1,2,3].map(i=>i*i)

Este es nuevo. Como, realmente nuevo. Utiliza las funciones de flecha ES6 para calcular los cuadrados de 1, 2 y 3. Actualmente, parece que solo es compatible con Firefox.

Fragmento de longitud 18:

location.href="/";

Como # 15, pero esta vez, va a la página de inicio de PPCG, no SE.

Fragmento de longitud 17:

(function(){})()

Es el fragmento de 14, ¡pero mejor! Ahora es un IIFE.

Fragmento de longitud 16:

obj={not:'json'}

Esto explica una de mis manías. Este es un objeto , no JSON ! JSON es un formato de intercambio de datos basado en objetos JavaScript, pero que adopta un formato más estricto.

Fragmento de longitud 15:

open('//s.tk/')

Imagina eso. Abra la página de inicio de SE, utilizando el http://s.tk/ redirect.

Fragmento de longitud 14:

function f(){}

W00t! Funciones! Lástima que no hay espacio para hacer nada.

Fragmento de longitud 13:

Math.random()

Genere un número aleatorio del 0 al 1. ¿Desea definir sus propios límites? Mala suerte (En realidad no, es fácil).

Fragmento de longitud 12:

new Date<=12

Esta afirmación nunca ha sido cierta en JS. JS no se creó hasta el '95 (ver factoid), mucho después del 1/1/1970 00: 00: 00.012.

Fragmento de longitud 11:

Math.PI*121

El área de un círculo con radio 11.

Fragmento de longitud 10:

if('j')9+1

En caso de que no lo hayas notado, me gusta hacer algo con el número de fragmento en el código. Este devuelve 10, y usa j, la décima letra del alfabeto.

Fragmento de longitud 9:

[9].pop()

Haz una matriz con un artículo. popva la comadreja 9.

Fragmento de longitud 8:

document

La base para todo el trabajo DOM. Pero no podemos hacer nada, porque es demasiado largo. :( Ir jQuery!

Fragmento de longitud 7:

alert()

¡Oh chico! Una llamada a la función! ¡Finalmente poder hacer cosas!

Fragmento de longitud 6:

var x=6

Basado en el # 3. Sin embargo, mucho mejor, porque ahora lo global es explícito . :PAGS

Fragmento de longitud 5:

[][5]

Incluso más corto que void 0llegarundefined . Por cierto: ''.aes aún más corto; Solo 4 caracteres.

Fragmento de longitud 4:

+"4"

Esto creará el número 4 fuera de la cadena "4". ¡Puedes reutilizar exactamente estos mismos 4 caracteres en un orden diferente para hacer lo contrario!

Fragmento de longitud 3:

x=3

Oh dang, acabamos de hacer una variable global implícita ...

Fragmento de longitud 2:

{}

Que hace esto? Si dijiste que crea un objeto literal, te equivocas. En realidad es un bloque vacío. ¡Abre una consola y pruébalo! Vuelveundefined , no {}.

En 2018 {} en la consola de Chrome en realidad devuelve un objeto vacío.

Fragmento de longitud 1:

1

Eso es. Cualquier número es una expresión JS válida.

Factoid: JavaScript originalmente se llamaba LiveScript. Fue cambiado a JavaScript para capitalizar la popularidad de Java, en ese momento (1995). Personalmente, deberían haber mantenido el antiguo nombre; JavaScript ha sido una fuente de confusión desde entonces. El hecho es que Java y JavaScript son casi tan similares como "auto" y "alfombra" .


1
Snippet 33 no funciona en Firefox. ¿Es realmente válido JS?
Oriol

Encuentro encadenar y analizar un objeto para copiarlo tan sucio. Se introduce ECMAScript 6 Object.assign, por lo que se convierte el fragmento 37 b = Object.assign({ }, a = {3 : 7}).
Oriol

@Oriol Sí, bueno, solo Firefox lo admite en este momento, por lo que tenemos que mantenernos en el camino sucio por ahora. Al menos es mejor que eval(uneval(a)), ¿verdad? ;)
Scimonster

Sobre el # 38, siempre hay document.querySelectorAll("element#id.classname[attribute]:not(somethingwedontwant)"). (Admite cualquier selector CSS válido).
Mateon1

El fragmento # 40 en sí mismo no es tan interesante, pero el comentario no tiene precio.
Scimonster

85

R

Factoid: El lenguaje de programación R comenzó como una implementación GNU del lenguaje de programación S. Se utiliza principalmente para estadísticas y aplicaciones relacionadas.

Nota: aunque no es un requisito de la competencia, cada fragmento aquí se puede ejecutar solo en R.


Longitud 32:

`[.data.frame`(swiss,3,2,drop=F)

Esto parece un poco misterioso ... ¡y de hecho debería hacerlo! Hay una forma mucho mejor de escribir esto:

swiss[3, 2, drop = FALSE]

Eso debería parecer un poco más familiar. Esto es lo que sucede cuando ejecutamos cualquiera de estos fragmentos de código:

> `[.data.frame`(swiss,3,2,drop=F)
             Agriculture
Franches-Mnt        39.7

los swiss marco de datos se envía con R como muchos otros que hemos visto hasta ahora. Contiene indicadores de fertilidad y socioeconómicos para 47 provincias francófonas de Suiza de alrededor del año 1888. La tercera fila es para la provincia Franches-Mnt, y la segunda columna es el porcentaje de hombres involucrados en la agricultura como profesión en cada provincia. Entonces, en 1888, el 39.7% de los hombres en la provincia suiza de Franches-Mnt trabajaban en la agricultura.

Cuando extrae filas o columnas de un marco de datos usando la notación más simple, R en realidad está usando [.data.frame en segundo plano. Como vimos en el fragmento 24, casi cualquier cosa puede definirse como un nombre de función siempre que esté rodeado por marcas posteriores, por lo que nuestro fragmento aquí es legítimo a pesar de que el nombre de la función técnicamente contiene corchetes incomparables.

El drop=argumento le dice a R si quiere que suelte el resultado en una dimensión inferior si es posible. De hecho, si decimos drop=TRUE, obtenemos esto:

> `[.data.frame`(swiss,3,2,drop=T)
[1] 39.7

Donde anteriormente el resultado era un marco de datos, R ahora nos da un doble.


Longitud 31:

print(fortune("hadleywickham"))

La fortune()función es del fortunespaquete que todo lo sabe , que proporciona una variedad de citas sabias de una variedad de personas sabias. Este fragmento le proporcionará la siguiente gema de Hadley Wickham (23) imprimiéndola en la consola:

That's a casual model, not a causal model - you can tell the difference by looking
for the word "excel".
    -- Hadley Wickham (commenting on an Excel chart showing student's SAT score
       increases with family income, without considering future covariates)
       http://twitter.com/#!/hadleywickham (February 2012)

Longitud 30:

pie(rep(1,12),col=rainbow(12))

¿A quién no le gusta un buen gráfico circular? La pie()función le servirá un gráfico circular recién horneado basado en un vector de números. rep()crea un vector repitiendo el primer elemento r veces donde r es el segundo argumento. El col=parámetro indica pie()cómo colorear las rodajas. La función mágica rainbow()genera un vector de una longitud especificada que contiene los códigos hexadecimales para los colores "igualmente espaciados" del arco iris.

Lo que tienes aquí es tu tabla básica de "Cantidad de cada color en esta tabla":

ingrese la descripción de la imagen aquí


Longitud 29:

summary(lm(mag~depth,quakes))

Aquí están sucediendo algunas cosas, así que vamos a dar un paso a la vez.

quakeses un conjunto de datos que se envía con R. Contiene información sobre 1000 eventos sísmicos de magnitud mayor que 4.0 en la escala de Richter cerca de Fiji desde 1964. Dos de las columnas en el conjunto de datos son mag, que es la magnitud del terremoto y depth, que es La profundidad del epicentro en kilómetros.

La lm()función, como se menciona en el fragmento 28, se ajusta a los modelos lineales. Devuelve un lmobjeto, o más precisamente, un objeto de clase lm. Hay dos formas de especificar el predictor (o variable independiente ) y la respuesta (o variable dependiente ), y he elegido el método de fórmula. Esto toma la forma response ~ predictor. Los predictores múltiples se especifican como y ~ x1 + x2. Los objetos en la fórmula se evalúan en el contexto proporcionado en el siguiente argumento.

Entonces, lo que lm(mag ~ depth, quakes)está haciendo es ajustar un modelo lineal usando la regresión de mínimos cuadrados ordinarios donde la magnitud es la respuesta y la profundidad es el predictor. Sabe qué magy depthson porque le dijimos que provienen quakes.

summary()es una función genérica utilizada principalmente para resumir los resultados de modelos ajustados. Invoca un método particular para la clase de su argumento. Como pasamos un lmobjeto, en realidad invoca una función llamada summary.lm().

Poniendo todo junto, obtenemos el resumen del modelo lineal que intenta explicar el terremoto desde la profundidad del terremoto. Específicamente, esto es lo que R escupe:

> summary(lm(mag~depth,quakes))

Call:
lm(formula = mag ~ depth, data = quakes)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.72012 -0.29642 -0.03694  0.19818  1.70014 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  4.755e+00  2.179e-02 218.168  < 2e-16 ***
depth       -4.310e-04  5.756e-05  -7.488 1.54e-13 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3921 on 998 degrees of freedom
Multiple R-squared:  0.05319,   Adjusted R-squared:  0.05225 
F-statistic: 56.07 on 1 and 998 DF,  p-value: 1.535e-13

¿Te das cuenta de que lo primero que te dice es la llamada a la función? ¡Esto se debe a que la lm()función usa match.call(), tal como lo hicimos en el fragmento 28!


Longitud 28:

f<-function(x,y)match.call()

A las funciones R a menudo les gusta hacer un seguimiento de lo que les dices. De hecho, a veces el comando que ha enviado se le devuelve como un atributo del objeto devuelto. (Un ejemplo es lm(), que crea modelos lineales). La recuperación de las instrucciones precisas se logra utilizando match.call()la función. Esto captura o coincide con la llamada a la función interpretada.

Aquí hemos definido una función f()que toma dos argumentos y luego te dice lo que vio.

> f(1,2)
f(x = 1, y = 2)

Esto es principalmente útil cuando se desarrollan funciones para uso general (en lugar de solo para usted), como en el desarrollo de paquetes. Si desea ver un ejemplo de match.call()la naturaleza, mire el código fuente lm()enviando stats:::lm. Una de las primeras cosas que hace es capturar la llamada de función usando match.call().


Longitud 27:

install.packages("ggplot2")

Esto puede parecer trivial, pero muestra una de las razones por las que R es tan popular: es muy fácilmente extensible a través de paquetes. ¡Y cualquiera puede desarrollar y compartir libremente sus paquetes!

install.packages()hace precisamente lo que su nombre sugiere. Va en busca de paquetes usando su espejo CRAN (Red de Archivo R Integral) predeterminado y luego los instala en su sistema donde R puede encontrarlos. También puede hacer que instale paquetes del código fuente local.

¿Recuerdas el fragmento 23 donde usamos el ggplot2paquete? Ese paquete no se envía con R, pero en solo 27 caracteres puedes hacer realidad todos tus ggplot2sueños al instalarlo.


Longitud 26:

filled.contour(t(volcano))

El volcanoconjunto de datos se envía con R. Es una matriz que contiene información topográfica sobre el volcán Maungawhau (o Monte Edén) en Auckland, Nueva Zelanda. Las filas de la matriz corresponden a líneas de cuadrícula que van de este a oeste y las columnas son líneas de cuadrícula que van de sur a norte.

En aras de la desorientación, intercambiemos las direcciones, por lo que las columnas ahora son de este a oeste y las filas son de sur a norte. Podemos hacer esto usando una transposición matricial, realizada a través de t(). ¿Y por qué no hacer un mapa de contorno mientras estamos en él? filled.contour()hace exactamente eso

ingrese la descripción de la imagen aquí


Longitud 25:

pmatch("s",c("n","size"))

La pmatch()función proporciona la magia detrás de todas las coincidencias parciales que hemos visto hasta ahora. El primer argumento es una cadena que se compara con cada elemento del segundo argumento, un vector. Si hay una coincidencia única, se devuelve el índice del elemento coincidente; de ​​lo contrario, se obtiene NA.

El fragmento aquí es un ejemplo del "mundo real" del uso de esta función. Piense en el fragmento 13 donde usamos la sample()función. Se acepta argumentos n, size, replace, y prob, pero sólo requiere de los dos primeros. En el fragmento 13 usamos s=como taquigrafía para size=. Lo que realmente sucede en segundo plano es algo como este fragmento, donde lo que hemos proporcionado se compara con lo que se espera. Dado que "s" coincide con "tamaño" de manera única, es totalmente legítimo usarlo s=como abreviatura.


Longitud 24:

`(`=function(x)9;2*(3-1)

¡Un ejemplo perfecto de algo que no debes hacer! ¡Siempre!

Puede asignar caracteres como funciones siempre que los encierre en tics al definir la función. Aquí le dijimos a R que (es una función que siempre devuelve 9 independientemente de la entrada. Como en muchos otros idiomas, ;puede usarse para incluir dos comandos en una línea. Entonces, lo que le hemos dicho a R es definir la función (, luego imprimir 2*(3-1).

Ahora, casi cualquier persona te diría que 2 * (3-1) debería ser 4 porque haces 3-1 = 2, luego 2 * 2 = 4. Pero le hemos dicho a R que cualquier cosa entre paréntesis es 9. Entonces, mientras que 3-1 = 2, ahora tenemos (3-1) = 9. Entonces obtenemos 2 * (3-1) = 2 * 9 = 18.

Dado que son posibles cosas horribles como esta, cada vez que envía un código que contiene paréntesis en una expresión (es decir, no una llamada a una función), el intérprete R realmente busca cualquier función llamada (independientemente de si ha definido (como una función. En general, cuanto más escribe, más trabajo realiza el intérprete de R.


Longitud 23:

qplot(Na,y=RI,data=fgl)

Finalmente suficientes votos para un (muy) simple ggplot2ejemplo. El ggplot2paquete es una implementación R de Grammar of Graphics, creada por la legendaria R deity Hadley Wickham . En general, la sintaxis es muy diferente de los gráficos de base R y lleva un tiempo acostumbrarse. Sin embargo, qplot()es una interfaz más simple para algunas de las características principales del paquete y tiene una sintaxis similar a la plot()de la base R. Pero, a diferencia de muchos de los ejemplos que le he mostrado, qplot()no admite la coincidencia parcial de los nombres de parámetros de funciones.

El fglconjunto de datos proviene del MASSpaquete. Contiene medidas de propiedades de fragmentos de vidrio forense. Aquí estamos usando las variables Na, que es el porcentaje de sodio (Na) en peso, y RI, que es el índice de refracción del vidrio.

ingrese la descripción de la imagen aquí


Longitud 22:

unique(presidential$n)

La unique()función devuelve un vector que contiene los valores únicos de su vector de entrada en el orden en que aparecen en la entrada. El presidentialconjunto de datos se envía con el ggplot2paquete (27). (¡Gracias a Jemus42 por corregir eso!) Su descripción:

Los nombres de cada presidente, la fecha de inicio y finalización de su mandato, y su partido de 10 presidentes estadounidenses desde Eisenhower hasta Bush W.

presidentiales un marco de datos, y los marcos de datos contienen columnas al igual que las listas contienen elementos. Las columnas se referencian por nombre usando $. Este conjunto de datos en particular tiene una columna llamada name, que contiene el nombre del presidente. Pero espera, solo especificamos n! En realidad, este es otro ejemplo de coincidencia parcial (13, 16), por lo que nes totalmente legítimo.

Enviar esto tiene un resultado interesante:

[1] "Eisenhower"  "Kennedy"  "Johson"   "Nixon"  "Ford"  "Carter"
[7] "Reagan"      "Bush"     "Clinton"

Observe cómo se deletrea el nombre de Lyndon B. Johnson ... ¡Vaya!

(Nota: Más de un año después de publicar esto, me ha llamado la atención que se ha solucionado el error tipográfico de Johnson. RIP humor).


Longitud 21:

integrate(dexp,0,Inf)

R tiene una función incorporada para la cuadratura adaptativa de funciones de variable única en un intervalo finito o infinito. En R, el infinito se especifica como Infpara + infinito y -Infpara -infinito. La dexp()función es la función de distribución de probabilidad para la distribución exponencial. Dado que el soporte de la distribución exponencial es [0, + infinito) y las distribuciones de probabilidad se integran a 1, esperaríamos que el resultado sea 1. ¡Mira, un resultado esperado!

1 with absolute error < 5.7e-05

Longitud 20:

deriv(~cos(x^3),"x")

¡R puede hacer derivados simbólicos! Esto devuelve:

expression({
    .expr1 <- x^3
    .value <- cos(.expr1)
    .grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
    .grad[, "x"] <- -(sin(.expr1) * (3 * x^2))
    attr(.value, "gradient") <- .grad
    .value
})

Mirando a través de eso, puede ver cómo analiza la función y utiliza la regla de la cadena. ¡Todo lo que una función que tomó cálculo de primer año debería poder hacer! El primer argumento para la deriv()función es una expresión R (que es un tipo R real) en términos de alguna variable, en este caso x. El segundo argumento es el nombre de la variable con respecto a la cual se toma la derivada, aquí "x".

¿Quieres ver algo realmente bueno? Asigne lo anterior a una variable, digamos dx. Defina una variable xcomo un vector numérico. Luego enviar eval(dx). R evalúa la derivada en x!


Longitud 19:

c(matrix(1,3,3),"a")

En R, c()abreviatura de "combinar" o "concatenar", crea un vector a partir de sus argumentos. Los elementos de los vectores deben ser del mismo tipo y todos deben tener una longitud 1. Pero en lugar de enojarse con usted por eso, R aplanará un elemento con estructura, en este caso una matriz, y lo convertirá todo en el mismo tipo.

Si los argumentos c()contienen solo un tipo, no se produce conversión de tipos, por ejemplo, si todos los argumentos son lógicos ( TRUEy FALSE), el vector será todo lógico. Si contiene números lógicos y, será todos los números. Si contiene carácter y algo, será todo carácter. Entonces nuestro fragmento nos da esto:

> c(matrix(1,3,3),"a")
[1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "a"

Tenga en cuenta que la matriz 3 por 3 se aplanó y la adición de "a" convirtió todo en caracteres.


Longitud 18:

(1-1/3-1/3-1/3)==0

Una lección de precisión mecánica. Esto vuelve FALSE.


Longitud 17:

example(readline)

La example()función le dará un ejemplo de cómo usar cualquier función incorporada. Si necesita saber cómo usar readline(), R tiene una respuesta petulante para usted.

> example(readline)

readln> fun <- function() {
readln+   ANSWER <- readline("Are you a satisfied R user? ")
readln+   ## a better version would check the answer less cursorily, and
readln+   ## perhaps re-prompt
readln+   if (substr(ANSWER, 1, 1) == "n")
readln+     cat("This is impossible.  YOU LIED!\n")
readln+   else
readln+     cat("I knew it.\n")
readln+ }

readln> if(interactive()) fun()
Are you a satisfied R user?

Manera de ser modesto, R.


Longitud 16:

acf(lh,t="part")

La acf()función devuelve la función de autocorrelación para una serie de tiempo. lhes un conjunto de datos que se envía con R. Su descripción:

Una serie de tiempo regular que proporciona la hormona luteinizante en muestras de sangre a intervalos de 10 minutos de una hembra humana, 48 muestras.

En este ejemplo, la coincidencia parcial se usa dos veces : una con el parámetro de función y otra con el valor de cadena pasado al parámetro. El nombre completo del parámetro es typey los valores reconocidos son "correlation", "covariance"y "partial". Solo se debe proporcionar suficiente cadena para identificarla de manera única, de modo que podamos usar "part"para "partial", lo que nos da la función de autocorrelación parcial (PACF).

ingrese la descripción de la imagen aquí


Longitud 15:

p3d(bunny,p=99)

Nuevamente vemos al infame conejito (11). El onionpaquete nos brinda una forma aún más agradable de ver el conjunto de datos más útil de la historia, utilizando la función de trazado 3D p3d(). Esto llama a la función de gráficos base persp()en segundo plano, que toma un argumento rotacional phi. Usando la coincidencia parcial de los nombres de los parámetros (13), podemos especificar justo p=en lugar de phi=.

ingrese la descripción de la imagen aquí


Longitud 14:

stats:::rgamma

R es de código abierto pero no tiene que ser un asistente para ver el código fuente; simplemente puede escribir el nombre del paquete y la función cuyo código desea ver separados por tres puntos ( :::). Esto le proporciona el código que define la rgamma()función, que genera desviaciones aleatorias de la distribución gamma. Enviar esto da:

function (n, shape, rate = 1, scale = 1/rate)
{
    if (!missing(rate) && !missing(scale)) {
        if (abs(rate * scale - 1) < 1e-15)
            warning("specify 'rate' or 'scale' but not both")
        else stop("specify 'rate' or 'scale' but not both")
    }
    .External(C_rgamma, n, shape, scale)
}
<bytecode: 0x00000000098cd168>
<environment: namespace:stats>

Tenga en cuenta que usa una función .External(). Esto llama funciones escritas en otros lenguajes, típicamente C y Fortran, los lenguajes que comprenden gran parte de la base de R. La localización de ese código fuente requiere un poco de magia. Editar: @Vlo señaló que los simples mortales pueden ver el código C subyacente invocado con .Internal()y .Primitive()usando el pryrpaquete. Gracias, @Vlo!


Longitud 13:

sample(9,s=4)

Esto no parece mucho, pero ejemplifica un concepto poderoso en R: coincidencia parcial de parámetros de función . Los parámetros con nombre en la sample()función son size, replacey prob, pero solo necesita proporcionar suficientes letras del parámetro con nombre para identificarlo de forma exclusiva. Por lo tanto sample(), puede usar en s=lugar de size=ya que ningún otro nombre de parámetro comienza con la letra "s". El código aquí selecciona una muestra aleatoria de tamaño 4 de los enteros 1 a 9.


Longitud 12:

LETTERS[-pi]

Hay un vector incorporado llamado LETTERSque contiene todas las letras en inglés mayúsculas ordenadas alfabéticamente. A diferencia de muchos otros idiomas, puede indexar un vector usando un número de coma flotante. No pasa nada muy emocionante; R solo toma la porción entera. El uso que -precede al índice de un vector elimina el elemento con ese índice del vector. pies una constante incorporada que contiene, lo has adivinado, el número irracional π. Entonces esto elimina el elemento 3 del vector y devuelve "A" a través de "Z" omitiendo "C".


Longitud 11:

plot(bunny)

En el onionpaquete, hay un conjunto de datos llamado bunny. Al trazarlo se obtiene el gráfico más útil de todos los tiempos:

ingrese la descripción de la imagen aquí


Longitud 10:

????sample

Digamos que está REALMENTE confundido acerca de la sample()función y necesita ayuda desesperadamente. En lugar de lo habitual ?samplepara abrir la página del manual de R, saca cuatro signos de interrogación. R escucha tu difícil situación e intenta ayudar ...

Contacting Delphi...the oracle is unavailable.
We apologize for any inconvenience.

Pobre de mí.


Longitud 9:

isTRUE(1)

Al principio, esto busca desafiar la convención en el resto del paquete base R para separar isy la siguiente palabra en el nombre de la función con a .. Sin embargo, eso solo se aplica a una prueba lógica de si el argumento es de cierto tipo, como se muestra a continuación (8). En este caso, estamos probando si es así TRUE, que no es un tipo. Esto utiliza una definición estricta de TRUE, es decir, 1 no es "verdadero" en el sentido habitual. isTRUE(1)vuelve FALSE.


Longitud 8:

is.na(8)

A diferencia de la mayoría de los otros lenguajes de programación, .es un carácter válido en los nombres de funciones y variables. No denota ningún tipo de método o jerarquía; Es solo parte del nombre. La is.na()función verifica si su argumento se evalúa como NA(faltante) y devuelve TRUEo FALSE.


Longitud 7:

stop(7)

Esto emite un error con la entrada como mensaje de error. Si se llama dentro de una función, la ejecución de la función se detendrá. Pero llamarlo fuera de una función no detendrá el script. En este caso, la salida es Error: 7.


Longitud 6:

x < -1

Si bien esto puede parecer trivial, muestra una crítica importante al operador de asignación <-: a saber, el significado cambia según la ubicación de los espacios. Como se mencionó, x <- 1asigna 1 a x. Separar <y -con un solo espacio como el anterior lo cambia a una prueba lógica de si xes menor que -1. Por esa razón, muchos prefieren la =asignación.


Longitud 5:

x<<-1

Similar a <-excepto <<-siempre asigna la variable al alcance global independientemente del alcance actual.


Longitud 4:

x<-1

R utiliza <-para asignar variables en el alcance actual. Este fragmento asigna el valor 1 a x.


Longitud 3:

!0i

El !operador es R para "no" y 0ies el número complejo 0+0i, AKA 0 en el plano complejo. Enviar esta declaración devuelve TRUEya que 0 es falso.


Longitud 2:

NA

Esto devuelve el valor R especial NA, que significa "no disponible", que denota un valor faltante.


Longitud 1:

T

Esto vuelve TRUE. En R, Ty Fson sinónimos de los valores booleanos TRUEy FALSE, respectivamente.


Yay R "!"(T)!
Vlo

@Vlo: "!"(T)evalúa a FALSE. Sin embargo, la afirmación "Yay R" nunca es falsa. ;)
Alex A.

¿Cómo puedo votar más por más entradas? "La localización de ese código fuente .Internal.Primitivepryr::show_c_source(.Primitive("sum"))
requiere

@Vlo: no había oído hablar del pryrpaquete. ¡Muy genial! Gracias por señalar eso. Me alegra que te gusten las entradas hasta ahora, gracias por el apoyo. :)
Alex A.

2
@ Jemus42 Ah, parece que debes hacer data(bunny)primero.
Alex A.

75

Brainfuck

Factoid: Brainfuck (también conocido como brainf * ck) fue un lenguaje esotérico experimental para crear el intérprete de lenguaje completo más pequeño de todos los tiempos, creado por Urban Müller, y actualmente es el lenguaje más famoso de su tipo. Tiene solo ocho comandos, es fácil de aprender, pero difícil de usar.

Brainf * ck tiene una memoria base de cinta con 30000 celdas y un puntero móvil, y se puede visualizar así:

0 0 0 0 0 0
    ^

Con el ^carácter que representa el puntero y los 0 que representan los valores de cada celda.

Brainfuck tiene ocho instrucciones:

Instruction  C Equivalent              Description
+            mem[ptr]++;               Add one to the value under the cell
-            mem[ptr]--;               Subtract one from the value under the cell
>            ptr++;                    Go on cell to the right
<            ptr--;                    Go on cell to the left
,            mem[ptr] = getchar();     Read a ASCII character from input and put the result in the value under the cell
.            putchar(mem[ptr]);        Write a ASCII character to the output using the value under the cell
[            while (mem[ptr]) {        Start a while loop: Continue to matching ']' when value under the cell is 0
]            }                         End a while loop: Go back to matching '[' when value under the cell is NOT 0

Brainfuck a C:

#include <stdlib.h>

int main(void) {
    unsigned char* mem = calloc(30000, sizeof(unsigned char));
    unsigned int ptr = 0;

    // Put your brainfuck code here, converted to the matching expressions under "C equivalent"

    return 0;
}

Fragmento de longitud 1

Lee un personaje y ponlo en la celda actual.

,

Memoria (con entrada: abc)

0 0 97 0 0 0
    ^

Fragmento de longitud 2

Agregue uno a la celda actual y desplace el puntero hacia la derecha.

+>

Memoria

0 0 1 0 0 0
      ^

Fragmento de longitud 3

Elimine uno de la celda actual hasta que sea cero; Establecer la celda actual a cero

[-]

Posible memoria:

Memoria: (antes)

0 0 100 0 0 0
    ^

Memoria: (después)

0 0 0 0 0 0
    ^

Fragmento de longitud 4

Comentarios: En brainfuck, se ignora todo lo que no sea una instrucción. Por esa razón, el siguiente programa es un programa de intercambio de ideas totalmente válido (pero vacío):

Hey!

Fragmento de longitud 5

Un programa cat simple (escribir entrada a salida)

,[.,]

Gracias a tomsmede por su comentario

Fragmento de longitud 6

Mueva el valor de la celda actual a la celda de la derecha (suponiendo que la celda de la derecha sea 0, de lo contrario, agregaría el valor de la celda actual al valor de la celda de la derecha):

[>+<-]

Sin embargo, en general, las personas usan este código para mover una variable.

Memoria: (antes)

10 0 100 0 0 0
     ^

Memoria: (después)

10 0 0 100 0 0
     ^

Fragmento de longitud 25

Invierta una entrada de seis caracteres e imprímala, seguida de cada carácter ASCII (N-1). 1 (donde N es el valor del primer carácter de entrada).

,>,>,>,>,>,.<.<.<.<.<[.-]

Fragmento de longitud 53

main(){i=0;j=0;if(i>=0){if(j<=i)i+=1;i-=1;}return 0;}

Este programa C minificado también es un programa Brainfuck disfrazado, y viceversa. De hecho, (casi) hacen lo mismo. Aquí está el código Brainfuck sin los "comentarios" (código C).

><+-

Déjame explicarte el código Brainfuck (y el código C). Como puede ver, usa dos celdas ( iy j). Incrementa la primera celda (incrementa ien 1). Luego disminuye la misma celda (decremento ipor 1).

Este es solo un ejemplo tonto de algún código fuente que se puede compilar como dos idiomas diferentes y ejecutar (prácticamente) lo mismo.


2
,[.,]- 5 personajes, programa para gatos
tomsmeding

13
Este puede ser el mejor "Brainfuck 101" que he visto.
hoosierEE

longitud 6: eso pondría la suma en la celda derecha y cero la izquierda. No te muevas, ¿verdad?
Filip Haglund

Se agregó una variable ficticia a la longitud 6 para explicar mejor el concepto. El programa de hecho agregará la celda # 3 a la celda # 4 y hará que la celda # 3 sea 0.
YoYoYonnY

58 votos - ¿podría actualizar? :)
Conor O'Brien

65

C ++

Con su preprocesador, plantillas, lambdas, rasgos de tipo e innumerables características complejas que nadie puede esperar entender en su totalidad, C ++ es redescubierto por cada nueva generación de su estándar. Al explotar sus numerosas formas de hacer cosas en tiempo de compilación, uno puede escribir cero abstracciones generales como una biblioteca que permite que las unidades físicas se unan a tipos de datos numéricos para verificar su solidez en tiempo de compilación (por ejemplo, no puede asignar el resultado de kg* ma N)

Longitud 1

#

Por lo general, la introducción de una declaración de preprocesador #puede estar en una línea por sí sola. Básicamente no significa nada y parece ser tan desconocido que la mayoría de los resaltadores de sintaxis que veo no lo saben.

Longitud 2

%:

Por supuesto, no todos tienen una #clave, por lo que C ++ es (bueno, realmente lo heredó de la antigua C) generoso para permitirle escribirlo con este token alternativo (también conocido como dígrafo )

Longitud 3

??=

Este es un curso histórico en C ++. Estos días ya no son necesariamente válidos, aunque las implementaciones pueden soportarlos, son trigráficos. Esta secuencia se traduce en #aquellos sistemas que la admiten, pero para no interferir con los literales de cadena sin procesar, no está permitida dentro de ellos. Las implementaciones pueden optar por dejar el soporte por completo.

Longitud 4

auto

Es uno de los inventos más nuevos (desde C ++ 11) para facilitar el trabajo con código genérico. Es para deducir el tipo de una expresión, y desde C ++ 14 incluso puede usarse para deducir los parámetros lambda y el tipo de retorno de funciones.

Longitud 5

 catch

Es una palabra clave que también se conoce desde muchos otros lenguajes, presente en C ++, pero el buen programador idiomático de C ++ casi nunca la usa. Con sus constructores y destructores idiomáticos, C ++ utiliza un principio ampliamente conocido como RAII (La adquisición de recursos es la inicialización) o cómo me gusta a veces llamarlo más apropiadamente: SBRM (Scope Bound Resource Management). Debido a clases como punteros inteligentes, se puede vincular la vida útil de los recursos asignados dinámicamente (¡eso no es solo memoria!) A otros objetos. Cuando estos quedan fuera del alcance (por ejemplo, por una excepción lanzada), estos objetos limpian automáticamente los recursos. Esto permite un código de excepción seguro y fácil de usar que no necesita usar catch.

Longitud 6

[](){}

[]{}()

Como stefan mencionó en los comentarios, puede usarlo []{}como el objeto lambda más corto, por lo tanto, esta es la forma más corta para llamar a un lambda. El siguiente texto es para la versión anterior:

es probablemente la forma más corta de una lambda. Las lambdas en C ++ son objetos (de tipo definido de implementación) que pueden capturar parte del alcance en el que se crean (la sintaxis [] controla esto) y son invocables (la sintaxis () controla esto). Su código (la parte {}) tiene acceso a estas variables como si estuvieran dentro de su alcance. Con su deducción de tipo de retorno opcional y la deducción automática de parámetros introducidos en C ++ 14, son la herramienta que se debe utilizar para todos los algoritmos de biblioteca estándar que esperan un invocable (por ejemplo, el tercer parámetro std :: sort).

Longitud 7

virtual

Es la palabra clave para comenzar a utilizar el polimorfismo de tiempo de ejecución en C ++, uno de los bloques básicos de la programación orientada a objetos. Esto sigue el principio de "no pague por lo que no usa", mientras que en otros idiomas todas las funciones son virtuales por defecto. Al ser un lenguaje de paradigmas múltiples, puede ser una sorpresa para las personas que piensan "C ++ está orientado a objetos" ver programas o bibliotecas que casi no usan esta palabra clave, por ejemplo, porque siguen el principio de programación genérico.

Longitud 8

override

Trabajar junto con la palabra clave virtual overridees una de las adiciones posteriores a C ++ para que el compilador trabaje más por usted. Al usarlo, expresa la intención de anular una función virtual en la clase base, y el compilador generará un error si cometió un error y esa clase no tiene la función especificada. En general, se considera un buen estilo si su código expresa la intención, en lugar de jugar con bits.

Longitud 9

constexpr

Al ser también una adición posterior a C ++, constexprpermite al programador expresar para funciones o variables, que se conocen en tiempo de compilación y deben ser computables en tiempo de compilación. Esto permite que estas funciones se utilicen en contextos que necesitan expresiones de tiempo de compilación (por ejemplo, como parámetros de plantilla o tamaños de matriz). Muchas funciones de biblioteca estándar (si es posible) ya son constexpr, por lo que se pueden usar aquí.

Longitud 10

for(i:c){}

Es un bucle completo sobre un contenedor, o una construcción similar a un contenedor que admite std::beginy std::endpara obtener iteradores (que incluye matrices de estilo C). Básicamente es equivalente a for(auto __i = std::begin(c); __i != std::end(c); ++__i){ auto& i = *__i; }. Esto permite un bucle sencillo en código genérico.

Longitud 11

void f()&&;

Es una nueva forma de declarar funciones miembro y las propiedades en el objeto al que se puede invocar. En versiones anteriores de C ++ solo teníamos la capacidad de elegir void f() const;decirle al compilador que pudiera llamar a la función en objetos const (por lo tanto, sin el const no puede llamarlos en objetos no const). De la misma manera, ahora tenemos la &&sintaxis para las referencias de valor r que se utilizan para poder invocar esas funciones en valores.

Longitud 12

int main(){}

Este es probablemente el programa completo más corto que puede compilar y ejecutar. No hará nada y devolverá 0. Este retorno es uno de los muchos casos especiales que puede encontrar en C ++. Normalmente, no devolver nada es un comportamiento indefinido, pero para la función main del punto de entrada, devolver nada significa devolver 0.

Longitud 13

auto f()->int

es una forma bastante nueva de declarar el tipo de retorno de una función. Normalmente no haría esto si ya conoce el tipo, pero hay muchas situaciones en la programación genérica en las que el tipo depende de los parámetros de la plantilla y las variables que utiliza. Hacerlo de esta manera permite un acceso algo más fácil a estos parámetros como en template<class T> auto f( const T& t ) -> decltype(t.foo())lugar detemplate<class T> decltype(std::declval<T>().foo()) g( const T& t ) { return t.foo(); }


2
Sugeriría usarlo ;como un fragmento alternativo de 1 carácter, porque no es una macro de preprocesador y el hecho de que pueda tener una declaración de 1 carácter en C ++ parece desconcertante.
Joe Z.

1
[](){}no es la forma más corta de una lambda: como la lista de parámetros está vacía, puede omitirse. Por []{}lo tanto, es la lambda más corta. Trivialmente, []{}()es la ejecución más corta de una lambda ;-) ideone.com/k8fAvs
stefan

@stefan: de hecho, siempre lo olvido ya que no parece funcionar como entonces;) Lo agregué a la respuesta.
PlasmaHH

@PlasmaHH Lo odio absolutamente porque de hecho no parece una función ... ;-)
stefan

59

Regex

Fragmento de longitud 2

[]

JavaScript : una clase de caracteres vacía que no coincide con nada.

PCRE , Java , Pythonre , Ruby (probado en la versión 2.0): error de sintaxis.

Fragmento de longitud 1

.

., llamado dot-all, está disponible en todos los sabores que tuve la oportunidad de ver.

¿Con qué coincide?

I̧n͟ g̨͜e҉̡͞n̵͢e͜͝r̷͝a͘l̢҉, ̡͟ ̕̕ ̴.̸̴̢̛́ ̸̡̢m͞ąt̴̨c͞h̛e͢͡s̶͘ ͘a҉n̛͜͠ỳ̸ ͢c̵̡hár͘͝a̕͢ćt͘͠e͏̀͠r̷̀ ̴̕͢ex͝͞͞c҉ep̀t̛ ̕f̴҉o͟͜r̴͢ ͞n͏ę͟w̢̕͜ ͡l͝i̸̧n͢͡e̶.͏͟͟

JavaPattern : en el modo predeterminado, dot-all coincide con cualquier punto de código, excepto estos 5 puntos de código \r\n\u0085\u2028\u2029. Con el UNIX_LINESmodo activado (pero sin DOTALL), dot-all coincide con cualquier punto de código, excepto \n. Con el DOTALLmodo activado, dot-all coincide con cualquier punto de código. Desde Java 5, Patternopera en el punto de código, por lo que los caracteres astrales coinciden con dot-all.

Pythonre (probado en 2.7.8 y 3.2.5, puede ser diferente en 3.3+): en el modo predeterminado, dot-all coincide con cualquier unidad de código UTF-16 (0000 a FFFF inclusive), excepto \n. re.DOTALLlevanta la excepción y hace .coincidir cualquier unidad de código UTF-16. En estas versiones, refunciona con unidades de código UTF-16, por lo que .solo logra hacer coincidir una unidad de código de caracteres en el plano astral.

.NET : igual que Python. Se llama al modo punto-todo en .NET Singleline.

JavaScript (C ++ 11 <regex>) : en el modo predeterminado, dot-all coincide con cualquier unidad de código UTF-16, excepto estos 4 puntos de código \n\r\u2028\u2029. Con la sbandera activada, dot-all coincide con cualquier unidad de código UTF-16. JavaScript también funciona en unidades de código UTF-16.

PCRE : Dependiendo de la opción de compilación, dot-all puede excluir \r, \no \r\n, o las 3 secuencias CR LF, o cualquier secuencia de nueva línea Unicode en modo predeterminado. En el modo predeterminado, el motor funciona con una unidad de código (puede ser una unidad de código de 8, 16 o 32 bits), por lo que dot-all coincide con cualquier unidad de código, excepto las secuencias de nueva línea. En modo UTF, el motor funciona en el punto de código, por lo que dot-all coincide con cualquier punto de código, excepto las secuencias de nueva línea. Se llama al modo punto-todo PCRE_DOTALL.

PHP (probado en ideone): PCRE, compilado como biblioteca UTF-8 y \nes la única secuencia de nueva línea por defecto. Se puede acceder al modo Dot-all a través de la sbandera.

Postgres : en el modo predeterminado, dot-all coincide con cualquier punto de código sin excepción.

Ruby (probado en la versión 2.0.0): en el modo predeterminado, .coincide con cualquier punto de código excepto \n. Se puede acceder al modo Dot-all a través del mindicador (!).

s El indicador se usa para indicar la codificación de Windows-31J en Ruby.


Factoid

Ŗ͞e̡͟҉ǵ͟͢e̴̢͘͡x̡́͞ ̛̀҉҉̢c҉̷̨a̸̛͞n҉̛͠ ̷̸̀p̴͠͡҉̵ą̧͜͢r̸̸̷̢͝s̢̀͡e̷̷̷͘͞ ̨̧̀H̨̧͜͜T̷͞M̷̛͜L͢.̴̡́ Repita después de mí. R̶̶̢̧̰̞̻̮̳̦̥ͭͯ̓̈ͯͤ̇͊͊͟ĕ̹̩̪͈͈͍̗͎̝͚̽̈ͨ̐̽ͪͮ̍͐ͮͧ̔̏̓ͣĝ̵̢̢̖̤̜̭͔͊͒ͦ͛ͤ͗ͬͧͪ̾͘͟eͦ̄ͭ̑̾҉̨̨̝̬̹̘̭͔͟͢x̣̻͓̠͈͕̥̜͚̝̫͚̳̾̍ͦ̑̈̋̌̉͊ͮ͗̄̆̒̚̚ ̸̦͈̥̬̺͇ͧͧ͐ͮ̌ͤ̈̒̆ͣ̈̏̔͊̐ç̨̬̪̳̦͎̖͕̦͔ͨ̿̓̈ȁ̸̳̺̠̭ͮ̓̐͘̕͜͡ņ̨̫͔͍̬̤̘͎͚̣̟̦͍̜ͭͭ̈ͦ̈̽͗ͥ̑͝͡ PARSE ͉̭̫̰͔̝͓̼̮͚̻͎͎͉̐͗͗͊̇ͣ͒͗͑̆͐̐ͬ͛ͮ͝H̢̥͕̼͓̫͙̺̼̮ͣͦ̍ͨ͒̔̌T̪̦̻̦͖̞̤͒̑ͭ̐̑ͭͣ͐̒̉͊͜͜M̞̪͇͕̩͉͗ͧ̌ͯ͋̉̍ͭ̓̇̐̌͜͠Ĺ̷̨̳̘̯͚͓͛͌ͭ̉̍.ͯ͆̊ ͯ̇̓̏͐ͪ̋̈͑̕҉̷̠̰̼̤


35
Me siento mal por cualquiera que no reciba la referencia del factoid.
Robobenklein

66
@robobenklein Conozco una medicina secreta para tu dolor: ¡Solo ilumínanos!
flawr

24
@flawr Para aquellos que no conocen la famosa pregunta: la primera respuesta en stackoverflow.com/questions/1732348/… es lo que está buscando.
Robobenklein

1
Puede leer el texto Zalgo'ed, pero no los tome demasiado en serio en ambas direcciones. Es completamente incorrecto seguir el camino de Zalgo a ciegas, pero el texto de Zalgo no está equivocado todo el tiempo.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

12
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, ¿no vas a utilizar todos esos votos para mostrarnos cómo analizar HTML?
mbomb007

57

J

PD: los fragmentos ahora están vinculados a tryJ.tk, lo que te permite jugar con ellos ejecutándose en JavaScript en tu navegador, sin instalar J.

PPS: intercambié orden; Esto tiene más sentido para las personas que se unen y para futuras referencias.

PPS: creo que, debido a limitaciones de tiempo, agregaré un fragmento al día

hecho:

J es un descendiente de APL (ver aquí la historia familiar) menos el divertido juego de caracteres.

Fragmento de longitud 1

_

J usa _tanto como infinito como indicador negativo , cuando se adjunta a literales de números (opuestos al verbo -).

Fragmento de longitud 2

a.

a.se llama Alfabeto y contiene todos los caracteres de 1 byte. Como tal, J no contiene funciones como atoi, ya que son simples búsquedas en el alfabeto:a. i. 'z' =122

Fragmento de longitud 3

i.9

i.es para números enteros, cuando se usa monádicamente (es decir, solo un argumento, el correcto, generalmente llamado y). Cuando se usa de forma diádica , sirve como índice de , como en el ejemplo anterior.

Fragmento de longitud 4

!!6x

J admite números enteros de precisión arbitraria y números racionales . Esto calcula el factorial del factorial de 6 (un número de 1747 dígitos).

Fragmento de longitud 5

^.^:_ 

Una densa ... Primero, los verbos (como J llama funciones) están organizados por tema. Todos los verbos están vinculados a la exponenciación. ^para exponenciación (y expcuando se usa de manera monádica, ^.para logaritmos . ^:es especial, la conjunción de Poder (una función de orden superior), que aplica una función varias veces. Cuando el argumento es derecho infinito ( _) ejecuta su argumento izquierdo (en el ejemplo ^.) en su propia salida hasta que converge. en efecto, ^.^:_es un verbo resolver x = ln(x)cuando se aplica a cualquier argumento, pero 1, produciendo 0.318132j1.33724.

Fragmento de longitud 6

^0j1p1

o equivalente

^o.0j1

La identidad de Euler en J. Como se citó anteriormente, ^es exp(). Además de los enteros de precisión arbitraria y los racionales, también admite poderes de pi y números complejos, y combinaciones de los mismos como literales. 0j1p1significa (0 + j) * pi ^ 1.

Fragmento de longitud 7

+/&.:*:

Un verbo que toma la norma 2 de cualquier vector. Esto demuestra 2 cosas:

  • el adverbio Insertar convierte el verbo Agregar +en Suma insertándolo entre cada elemento de su argumento. Por lo tanto (0+1+2+3) = +/ i.4.

  • La conjunción Under cuando se usa como v &.: u yes equivalente a vi u v y, donde vies el anverso (generalmente el inverso).

Sí, J sabe sobre inversos funcionales. La combinación de estos hace que el verbo en el fragmento sea equivalente a %: @: (+/) @: *:, o sqrt(sum(y.^2))en Matlab, por ejemplo.

Fragmento de longitud 8

$#:I.@:,

Una bifurcación se compone de 3 verbos sin ninguna referencia a argumentos. Esto permite lo que en J se llama programación tácita (sin puntos). Una bifurcación f g h, en el caso monádico (como en este ejemplo) es equivalente a (f y) g (h y). Como bifurcaciones, las matrices multidimensionales son una parte intrínseca de J. "Indices" devuelve los índices de unos en un vector, pero no se extiende a dimensiones más altas como tales. Este ejemplo usa Shape , Antibase y I.@:,como los 3 dientes del tenedor que implementan I. para matrices de dimensiones superiores, por ejemplo:

 ($#:I.@:,) 5 = i. 5 5 NB. indices of 5 in i. 5 5

Fragmento de longitud 9

<"1 i.4 6 

Las matrices en caja son un tipo de datos en J, lo que permite combinar contenido heterogéneo (tipo y tamaño) en un valor. < Cajas monádicas es argumento. Rank es un concepto central en J, y permite extender automáticamente los verbos hacia conjuntos de dimensiones superiores. Tanto los sustantivos como los verbos tienen un rango.

El rango de sustantivo es el número de dimensiones de cualquier sustantivo, que el verbo $@$puede decirte. Por ejemplo, i. 2 3 4es una matriz de rango 3.

El rango de verbos es el rango en el que se aplicará un verbo. Cada verbo tiene un rango intrínseco que puede consultarse con la conjunción básica . v b. 0devuelve 3 números para el rango monádico, diádico izquierdo y diádico derecho del verbo v.

Un verbo funciona en celdas nominales de rango igual al rango verbal y reemplaza los resultados en un rank-verb rankmarco sustantivo . El rango de un verbo se puede limitar usando la conjunción de Rango , como se hace aquí, encuadrando las celdas (filas) de rango 1 en lugar de trabajar en el rango _, es decir. boxeando toda la matriz. Más información sobre el rango se puede encontrar aquí .

Fragmento de longitud 10

<./ .+~^:_

Este fragmento es un verbo que calcula el camino más corto sobre el dígrafo ponderado. Introduce el mínimo ( <./) y la conjunción de puntos . La conjunción de puntos es una generalización del producto matricial, que se puede escribir como +/ . *. En general, u . ves equivalente a u@(v"(1+lv,_))donde lv es el rango izquierdo del verbo v. O en palabras "u se aplica al resultado de v en las listas de" celdas de argumento izquierdo "y el argumento derecho en toto". (Ver arriba para rangos)

Como tal, el verbo interno <./ .+~reemplaza el ítem y(i,j)con el mínimo de y(i,k)+y(k,j)for k

^:_ itera este paso hasta la convergencia.

Ejemplo, visualización de distancias de ruta más cortas y originales:

(]; <./ .+~^:_ ) wtm=: _6]\0 2 5 _ _ _ _ 0 4 1 3 _ _ _ 0 _ _2 _ _ _ 4 0 _ 5 _ _ _ _1 0 6 _ _ _ _ _ 0

Fragmento de longitud 11

<.@o.10x^99

Este fragmento presenta un código especial : algunos códigos J son compatibles con códigos escritos específicamente para un determinado caso de uso, reconocidos en el momento del análisis y optimizados; ya sea para una mayor precisión (como es el caso aquí) o un mayor rendimiento (ver Combinaciones especiales )

Esta frase da 99 dígitos de pi (aunque desplazado 99 decimales). El código especial depende de la redacción exacta, lo que normalmente sería equivalente no es tan preciso como el código de fragmento: <.o.10x^99 pierde la precisión extendida.

Longitud 12 fragmento

($-.1:)($,)]

De vez en cuando, termina en situaciones en las que, debido a las selecciones realizadas en los datos, hay dimensiones singleton que se ejecutan en el camino. Esta práctica utilidad, llamada compresión en Matlab, exprime todas las dimensiones singleton. El diente izquierdo de la horquilla ($-.1:)produce todas las dimensiones sin las mismas, mientras que el del medio ($,) cambia la forma del conjunto desordenado a las dimensiones retenidas. El diente correcto ]sirve solo para hacer esto un tenedor, y hace referencia al argumento correcto.

Fragmento de longitud 13

1 :'-u%u d.1'

El método de Newton encuentra una aproximación de una raíz de una función diferenciable. Este adverbio explícito debe aplicarse a la función de la cual se busca la raíz, y representa un paso del procedimiento iterativo. ues el argumento que hace referencia a la función y se reemplaza en el momento en que se aplica el adverbio. d. es una conjunción que deriva funciones simbólicamente, y aquí podría ser reemplazada por la D.que hace lo mismo numéricamente (pero difiere cuando se aplica a funciones de rango superior). El resultado es un gancho que resta el tenedor ( udividido por su derivada) del argumento.

Por ejemplo:

(_2 + *:) (1 :'-u%u d. 1')^:_ ] 1 NB. root of x^2-1; ] is there to avoid combining _ and 1 into an array.

Fragmento de longitud 14

(%-.-*:)t.i.10

Primeros 10 números de la serie Fibonacci por Taylor expansión de x / (1 - x - x^2). Analizando el gancho %-.-*:da (y % (-.-*:) y) = (y % ( (1 - y) - *: y).

Fragmento de longitud 15

(#{.+//.)!/~i.9

Otra versión de la serie Fibonacci. Esta vez desde otro ángulo; a partir del triángulo de Pascale '! /~i.9'.

/cuando se usa de forma diádica significa Tabla , aplicando el verbo al que está vinculado entre cada celda de sus argumentos, produciendo una tabla de la operación entre los argumentos x e y. En este caso se !utiliza de forma diádica, como Combinación (o Fuera de) . ~hace que el verbo reflexivo , es decir. use su argumento correcto como el izquierdo también.

El adverbio /.es extraño, aplica su verbo a lo largo de los anti-diagonales de una matriz (es decir, intente </.!/~i.5aquí )

Entonces, este fragmento toma las sumas de los 9 primeros antiagoniales en el triángulo de Pascal, que es otra serie de Fibonacci.

Fragmento de longitud 16

;/@~.,. <"0@#/.~:

Ok, agregué un espacio solo para llegar a 16 :). Este fragmento muestra una bifurcación usando Key : enumera todos los elementos en el argumento y sus frecuencias.

x u/. yaplica u a y en fragmentos donde x es único, o en J:, (=x) u@# ydonde =es Self-Classify , que genera una matriz booleana que contiene 1 en las posiciones donde aparecen en el nub ~. Aquí se aplica reflexivamente, por lo tanto, ejecuta Tally en cada elemento único en y, contando el número de apariciones.

Como la mayoría de los verbos en J mantienen el orden de nudos (orden de aparición de nuevos elementos únicos, opuesto a, por ejemplo, uniqueen Matlab, que ordena su argumento), esto puede usarse para unir los elementos a sus frecuencias como se hace aquí. ;/@~.se usa para hacer una lista en caja de todos los elementos.

Tenga en cuenta que debido al concepto generalizado de Rango , este código funciona para cualquier dimensionalidad .

Fragmento de longitud 17

*./ @:(#&>)@C.@A.

J admite algunas primitivas específicamente sobre permutaciones:

  • Anagrama A. Monádicamente encuentra el índice Anagrama, diádicamente, aplica la permutación especificada por el índice anagrama en el argumento izquierdo al argumento derecho.
  • Ciclo - Permute C. convierte entre representación directa y ciclo de permutaciones.

Este fragmento es un verbo que lleva un índice de anagrama a la izquierda (entre 0 y !#y) y el argumento derecho y una matriz para permutar. Luego, calcula el MCM *./ de las longitudes de ciclo #&>, es decir. el período después del cual recupera la matriz original:

]n=: (p=:?!9) *./ @:(#&>)@C.@A. i.9 NB. period of a random permutation
p&A.^:n i.9 NB. applies permutation n times.

Longitud 21

<:@(#/.~)@(i.@#@[,I.)

Este pequeño verbo proviene del complemento "stats / base" y se llama histograma . Hace exactamente eso, dada una lista de inicios de bin, suma todas las ocurrencias de datos en el intervalo ]bn-1,bn]donde bn es el comienzo del número de bin n.

Explota el índice de intervaloI. para encontrar el intervalo de:

Si y tiene la forma de un elemento de x, entonces x I. y es la j no menos negativa tal que j {x sigue y en el orden, o #x si y sigue {: x en el orden o si x tiene No hay artículos.

Hacer los totales de cada intervalo se hace usando la tecla como se resalta en el fragmento 16.

El fragmento vinculado a tryj.tk demuestra el teorema del límite central utilizando este histograma:

(bins=:(%~>:@i.)10) ( [ (graph=:(,&":"0 1 '#'#"0 1~])) (histogram=:<:@(#/.~)@(i.@#@[,I.)) ) (+/%#) ?5 200 $ 0

Longitud 22

=,&(+/)(~:#[)e.&~.~:#]

Diversión en J. Esto implementa un motor de mente maestra, tomando una matriz secreta como argumento izquierdo y una suposición como la derecha. Los valores devueltos son el número de clavijas blancas y negras. Desmontado:

NB.   ExactMatch: checks where digits correspond:
ExactMatch =: =

NB.   GoodDigitWrongPlace: Copies non-matched numbers from both arguments (left and right
NB.   pairs of parentheses, and checks them for same elements(e.), after eliminating
NB.   doubles in both (&~.)
GoodDigitWrongPlace =: (~: # [) (e.&~.) (~: # ])

NB.   Piecing the conditions together, after summing the booleans:
mm =: ExactMatch ,&(+/) GoodDigitWrongPlace

Para ser utilizado como

secret (=,&(+/)(~:#[)e.&~.~:#]) guess

Donde secrety guessson cualquier conjunto. Funciona con cualquier tipo de datos en realidad.


17
Bueno, o obtienes un montón ilegible de símbolos extraños, o obtienes un montón ilegible de símbolos ASCII. Elige tu veneno.
John Dvorak el

16
@ JanDvorak Todos los idiomas son ilegibles hasta que los aprenda. ;-)
Gareth

55
Solía ​​pensar que los nombres largos y descriptivos ayudan a comprender el código. Entonces estaba iluminado .
hoosierEE

@Gareth Pero no todos son ilegibles incluso después de haberlos aprendido. No voy a nombrar ningún nombre.
flawr

45

RPL (lenguaje de programación Redstone) [y Minecraft]

Esto es una gran exageración sobre si podemos considerar esto como un lenguaje de programación real o no, pero lo intentaremos de todos modos. Y, dado que estos dos "idiomas" son prácticamente iguales, los combinaré, a veces publicaré fragmentos en el lenguaje "Minecraft" (redstone, etc.) y, a veces, en RPL. Además, dado que muchos fragmentos estarán en Minecraft, publicaré enlaces a las imágenes en lugar de las imágenes en sí para ahorrar espacio. Además, todos los fragmentos serán de conceptos de programación en Minecraft, no redstone en general (es decir, no aparecerán puertas de redstone). Los caracteres se contarán en bytes (en RPL) o según esto (en Minecraft).

Hecho:

RPL es un lenguaje de programación de Tossha the Inventor que convierte el código en piedra roja de Minecraft y bloques de comandos. Puede realizar entradas y salidas, bucles, manipulación de enteros, funciones trigonométricas, raíces y más.

Longitud 1:

Un botón (1 byte) es la forma más simple de entrada en Minecraft. También puede iniciar o detener un "programa". Del mismo modo, una palanca (también 1 byte) es otra forma de entrada, y también se puede utilizar para iniciar y detener el programa, ya que tiene un estado "encendido" y "apagado". Algo para recordar es que Minecraft es literalmente un lenguaje de programación 3D, por lo que el lugar donde se ubica el botón / palanca en el programa puede hacer una gran diferencia.

Longitud 2:

Un botón conectado a una lámpara de piedra roja es prácticamente tu programa básico de gatos. Toma la entrada (con un botón o palanca, ya sea 0o 1( offo on)) y la emite en forma de luz de la lámpara como 0o 1( offo on).

ingrese la descripción de la imagen aquí

Longitud 3:

Como se ve a continuación, este es uno de los programas de modificación de código fuente más cortos (¡ya que puedes modificar la fuente en tiempo de ejecución con Minecraft!). Ahora, este específico realmente no tiene uso, pero el concepto se puede combinar con otros para crear algunos programas increíbles (como para venir con más votos a favor). Cuando se ejecuta, este programa elimina su fuente de entrada y no puede ejecutarse nuevamente. ingrese la descripción de la imagen aquí

Longitud 4

Este "fragmento" en realidad muestra dos conceptos: retraso y la puerta NO. El retraso se realiza utilizando ciertos elementos de redstone que tienen un retardo de marca de redstone . Una marca roja es igual a una décima de segundo. Los diferentes componentes de redstone tienen diferentes retrasos: una antorcha tiene un retraso de 1rt (1 marca roja), un comparador tiene un retraso de 1rt, un repetidor puede tener un retraso de 1, 2, 3 o 4rt, dependiendo de cómo esté configurado. En este ejemplo, el repetidor de redstone está configurado con un retraso de 4rt.

El siguiente es la puerta NO. La puerta NOT toma una entrada y la invierte. Entonces, en esta configuración, la salida estará encendida si la entrada está apagada, y la salida estará apagada si la entrada está encendida.

Longitud 5

La puerta OR es muy fácil de lograr en Minecraft. Dos entradas están conectadas a la misma salida. Eso es. Sin trucos divertidos ni nada, es bastante simple.

ingrese la descripción de la imagen aquí

Longitud 6

Aquí hay un consejo para compactar su "código". Si sabe que la intensidad de la señal de dos entradas es lo suficientemente pequeña como para no interferir con las salidas correspondientes, puede conectar la redstone a la derecha entre sí. En el siguiente ejemplo, hay un temporizador de tolva simple, que transfiere elementos de ida y vuelta en aproximadamente 0.5s en cada tolva, conectado a comparadores que emiten una potencia de señal de 1. Esto significa que las dos salidas no interferirán entre sí. En el ejemplo, las lámparas están ahí solo con fines de demostración y no cuentan para el recuento total de bloques.

ingrese la descripción de la imagen aquí


77
¿Tienes 13 votos a favor, puedo hacer 10 programas de moar?
Rɪᴋᴇʀ

44
Ninguno de sus programas está escrito en RPL, así que no lo haga pasar como tal. Esto es puramente "código" de Minecraft.
mbomb007

2
Tiene un déficit de 14 programas m8. Me gustaría ver lo que tienes en mente;)
Conor O'Brien

44
¿Tienes 21 votos a favor, puedo hacer 15 programas de moar?
wizzwizz4

1
¿Tienes 29 votos a favor, puedo hacer 23 programas de moar?
bb010g

42

TI-BASIC

[El idioma varía según la calculadora en la que se usa, pero estos usarán la TI-84 a menos que se indique lo contrario.]

Fragmento de longitud 31

Menu("","1",A,"2",B
Lbl A
Lbl B

Esto demuestra el uso de menús. El anterior es bastante inútil, ya que no hace nada, pero se pueden utilizar para navegar por las diferentes partes de un programa. El primer argumento es el título del menú, seguido de pares de opciones (la cadena que se muestra seguida de una etiqueta de 1 o 2 letras). Aquí hay un ejemplo más intuitivo:

Menu("CHOOSE VALUE","AREA",A,"CIRCUMFERENCE",C
Lbl A
Disp πR²
Stop
Lbl C
2πR

Lbltambién se puede usar para ramificar con Goto. Sin embargo, los menús tienen algunas limitaciones que los hacen molestos de usar: solo puede haber siete elementos de menú, y cada título puede tener como máximo catorce caracteres, por lo que todo cabe en una pantalla.

Fragmento de longitud 29

Real
√(-16
a+bi
Ans
re^θi
Ans

Real(activado por defecto) coloca la calculadora en modo de número real, por lo que los cálculos que involucran números complejos arrojan un NONREAL ANSerror. Cuando se pone en a+bimodo, la calculadora muestra las respuestas como números complejos si corresponde, por lo que el segundo ejemplo devuelve4i . re^θiEl modo utiliza coordenadas polares en lugar de rectangulares, por lo que genera salidas 4e^(1.570796327i).

Fragmento de longitud 23

If A≥9
Then
1→X
7→Y
End

Esto es solo un simple condicional, aunque puede haber una Elsedeclaración. Theny Endno son obligatorios si es solo una declaración.

Fragmento de longitud 21

(-B+√(B²-4AC))/(2A)→X

La favorita de todos, la fórmula cuadrática. Almacena la primera solución para una ecuación cuadrática como X, suponiendo que a, byc se almacenan en sus respectivas variables, como en ax 2 + bx + c .

Fragmento de longitud 20

Shade(|X/2|-3,5-X²,0

Esto sombrea la intersección de las dos funciones, con varios parámetros opcionales: valores mínimos y máximos de x y dirección y distancia entre las líneas de sombreado.

Longitud 18 fragmento

LinReg(ax+b) L1,L2

Aquí calculamos la ecuación de regresión lineal, o la ecuación lineal que mejor coincide con un grupo de puntos, con los valores de x almacenados como una lista en L1y los valores de y enL2 . Hay muchas otras opciones de regresión disponibles, que incluyen cuadrática, cúbica y exponencial.

Fragmento de longitud 17

dbd(1.2711,1.2115

Esto calcula el número de días entre dos fechas, en este caso el 27 de enero de 2011, el día en que comenzó este sitio, y el 21 de enero de 2015, el día en que se escribió. (Eso es 1455 días para los perezosos). La forma de codificar fechas es un poco extraña: ya sea DDMM.YY o MM.DDYY, ceros iniciales opcionales.

Fragmento de longitud 16

For(A,0,5
Disp A

Esto muestra dos partes del lado de programación del lenguaje. El primero es su forbucle típico , similar al for(var A=0;a<5;a++)de otros idiomas. (También debe usar elEnd comando para salir del bucle). El segundo se explica por sí mismo: se muestra A, en este caso 5 veces debido al bucle.

Fragmento de longitud 15

Y1=|X³-4|
Y2=3X

Aquí hay dos ejemplos de una característica bien conocida de las calculadoras gráficas: ecuaciones gráficas. Puede tener 10 ecuaciones diferentes graficadas en el mismo plano, y hay muchos comandos útiles para encontrar intersecciones, máximos, valores de x , etc. Esas ecuaciones se ven así cuando se grafican en una ventana estándar:

Grafico

Fragmento de longitud 14

[[1,2][34,5]]T

Los corchetes se usan para hacer matrices, y la Ttranspone la matriz:

[[1 34]
 [2 5]]

Fragmento de longitud 13

dayOfWk(9,1,6

Esto encuentra el día de la semana del 6 de enero, 9 AD. La salida es un número donde 1 es domingo, 2 es lunes, y así sucesivamente. Esta fecha en particular fue un martes, por lo que la salida es3 .

Longitud 12 fragmento

Circle(1,3,5

La primera de las herramientas de dibujo básicas, dibuja un círculo en el gráfico con un centro en (1,3) y un radio de 5.

Fragmento de longitud 11

randInt(0,8

Esto genera un entero (pseudo-) aleatorio entre 0 y 8 inclusive. Hay un tercer argumento opcional que indica cuántos enteros generar. Hay varias otras funciones aleatorias, incluidas las para distribuciones normales y binomiales, una para una matriz aleatoria y otra para una lista ordenada aleatoriamente sin repeticiones. randIntpuede ser cabeza de serie mediante el almacenamiento de un número como rand: 2→rand.

Fragmento de longitud 10

4>5 or 2≠7

Aquí tenemos operadores de lógica y igualdad (in) de TI-BASIC. Las declaraciones de desigualdad evalúan primero a 0 or 1, yor devuelve verdadero si cualquiera de los lados es verdadero, por lo que se muestra 1.

Fragmento de longitud 9

.656▶F◀▶D

Esto puede convertir de decimal a fracción y viceversa, lo cual es muy útil. También hay funciones dedicadas ▶Fracy ▶Decque solo van en un sentido. Huellas dactilares82/125 en este caso.

Fragmento de longitud 8

lcm(14,6

Esto imprime el mínimo común múltiplo de 14 y 6, que es 42.

Fragmento de longitud 7

getDate

Bastante claro, solo imprime la fecha actual del sistema como una lista, en este caso {2015 1 19}.

Fragmento de longitud 6

√({4,9

Las matrices (o listas) están rodeadas por llaves y separadas por comas. Esto es similar a lamap función de muchos idiomas, donde itera a través de cada elemento de la lista y le aplica la operación fuera de las llaves, en este caso raíz cuadrada, por lo que el resultado es {2 3}. Tenga en cuenta que los paréntesis de cierre son opcionales, por lo que se omitirán a partir de ahora.

Fragmento de longitud 5

4iii6

Tenemos un par de cosas geniales pasando aquí. Primero, las partes reales, 4 y 6 se multiplican, y luego las partes imaginarias se multiplican:, i^3o -i. Estos multiplicados dan-24i . Esto muestra la multiplicación de yuxtaposición de aspecto funky y el manejo de números imaginarios por parte de TI-BASIC.

Fragmento de longitud 4

8°5′

Esto es 8 grados, 5 minutos de arco, que se convierte en grados como 8.0333 ...

Fragmento de longitud 3

8→T

Esto muestra cómo los números pueden almacenarse como variables, lo cual es algo inusual porque el número va primero, seguido de la flecha de la tienda y luego el nombre de la variable. Como se menciona en el hecho real,θ (theta) también se puede usar como una variable, y las variables solo pueden ser una letra mayúscula.

Fragmento de longitud 2

4M

De manera similar a Mathematica, puede multiplicar con yuxtaposición, no es *necesario. Todas las variables se inicializan a 0 de manera predeterminada, por lo que esto generará 0 a menos que haya almacenado algo más en esa variable (consulte el fragmento 3).

Fragmento de longitud 1

e

Esta es la constante para el número de Euler , que se muestra como2.718281828 .

Factoid

Las variables solo pueden almacenar ciertos tipos de datos. Por ejemplo, A- Z(y θ) almacenar valores numéricos, str0- str9almacenar cadenas y [A]- [J]almacenar matrices (matrices bidimensionales).


Por cierto, la minúscula n(no n) también se puede usar como una variable.
Ypnypn

Interesante. Nunca he usado esa variable.
NinjaBearMonkey

3
Se puede discutir acerca de str0ser 1 personaje o ser 4. Todas las instrucciones en TI-BASIC son de 1 carácter.
Ismael Miguel

@IsmaelMiguel Pensé en eso, pero son de 1 o 2 bytes , y decidí contar los caracteres normalmente.
NinjaBearMonkey

1
Yo respeto su decisión. Ayuda mucho en este caso. Realmente disfruté programar en mi viejo TI-83. (¡Incluso he diseñado un programa de pintura en él!)
Ismael Miguel

41

GNU Sed

Estoy imponiendo un requisito más restrictivo: todos los fragmentos estarán completos sed programas .

Factoid

sed Es un lenguaje completo. Aquí hay una prueba.

Longitud 0 Fragmento

No creo que sea estrictamente necesario un fragmento de longitud 0, pero dado que realmente hace algo en sed, aquí está:

Sed es el "Editor de secuencias", es decir, lee la secuencia (línea por línea) de STDIN, las edita y luego las envía a STDOUT. El programa sed de longitud cero simplemente copia STDIN a STDOUT. Por lo tanto, la catutilidad puede ser emulada por sed. Los siguientes son equivalentes:

cat a.txt b.txt > c.txt

y

sed '' a.txt b.txt > c.txt

Fragmento de longitud 1

=

Este programa sed imprime el número de línea de cada línea en STDOUT. Esto es aproximadamente equivalente a:

nl

o

cat -n

aunque la versión sed pone el número de línea en su propia línea.

Fragmento de longitud 2

5q

Copia STDIN a STOUT y qpasa después de la línea 5. Esto es equivalente a:

head -n5

Es posible que esté comenzando a ver un poco de un patrón aquí: sedpuede usarse para emular muchas de las herramientas estándar de utilidades principales.

Fragmento de longitud 3

iHi

inserta "Hola \ n" antes de cada línea. Meh

Fragmento de longitud 4

/a/d

Gran parte del poder de sed está en su capacidad de expresión regular. Este programa hace que todas las líneas que coinciden con la expresión regular ase delijan de la secuencia. Todas las demás líneas se enviarán a STDOUT. Esto es equivalente a:

grep -v "a"

Fragmento de longitud 5

:l;bl

Este es un bucle infinito. Todos amamos los bucles infinitos que acaparan la CPU. Define una etiqueta l, luego los branchos (saltos) a ella. Indefinidamente.

Fragmento de longitud 7

s/a/A/g

Por defecto, sed aplica scomandos de modo que coincida solo con la primera aparición en cada línea. Si necesita que coincida (y sustituya) cada aparición en una línea, entonces la gbandera al final dels comando hará esto.

Fragmento de longitud 8

y/01/10/

El ycomando poco utilizado es similar a la trutilidad de shell (aunque no tan flexible). Este programa cambiará todos los 0s con 1sy viceversa.

Fragmento de longitud 9

1!G;$p;h

Este fragmento es en realidad de 8 bytes, pero requiere que el parámetro -n se sed para suprimir la salida predeterminada, por lo que según las reglas estándar de golf de código, cuento esto como 9. Este programa invierte las líneas en la secuencia. Entonces:

sed -n '1!G;$p;h'

es exactamente equivalente a:

tac

Fragmento de longitud 10

s/[ <TAB>]+$//

Esta es una revisión del fragmento (incorrecto) de longitud 6. Esto elimina los espacios en blanco finales (espacios y TAB) de las líneas.


2
Ver también ÚTILES SCRIPTS DE UNA LÍNEA PARA SED , que es básicamente cómo aprendísed
Adam Katz,

Tienes mas votos. ¿Podemos tener un poco más?
luser droog

2
Su factoid 404'ed.
Wauzl

1
Agradable, pero tenga en cuenta que muchos de estos usan extensiones GNU y no son estándar, específicamente la longitud 3 (estándar sería i\<newline>Hi<newline>), la longitud 5 (estándar sería sed -e :l -e blo :l<newline>bl<newline) y la longitud 10 (que necesita que se +convierta en a *para que funcione). Tenga en cuenta que el fragmento de longitud 9 -n '1!G;$p;h' es estándar, mientras tacque no lo es . :)
Comodín el

1
@Wildcard Sí, he restringido esto a GNU sed.
Trauma digital

39

Pitón

( mbomb007 de ya tiene una gran cantidad de fragmentos de Python, pero pensé en incluir algunos hechos más extravagantes)

Factoid

Python es un lenguaje de tipo dinámico con énfasis en la legibilidad.

Fragmento de longitud 1

1

En Python 3, lo anterior es equivalente a Trueen el sentido de que 1 == True(y también 0 == False). Tenga en cuenta que esto no es necesariamente cierto en Python 2, donde puede redefinir el valor deTrue .

Fragmento de longitud 2

<>

<>es un operador de comparación obsoleto equivalente a !=. Todavía funciona en Python 2 (aunque se desaconseja su uso), y se eliminó por completo de Python 3.

Fragmento de longitud 3

...

Python tiene una serie de características que no utiliza ninguna de las funciones integradas, pero solo existe por el bien de las bibliotecas de terceros. Este Ellipsisobjeto es uno de ellos, y generalmente se usa para cortar. Por ejemplo, si tenemos la siguiente matriz numpy 3D :

array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

entonces a[..., 0](equivalente a a[:,:,0]) da todos los primeros elementos:

array([[1, 4], [7, 10]])

En Python 3, el ...literal se puede usar fuera de la sintaxis de corte, lo que de forma divertida le permite usarlo como un marcador de "tarea pendiente" en lugar de passo NotImplemented:

def f(x):
    ... # TODO

Fragmento de longitud 4

(1,)

Una tupla de un elemento en Python.

Python tiene listas (por ejemplo [1, 2, 3, 4]), que son mutables, y tuplas (por ejemplo (1, 2, 3, 4)), que son im mutable. Un uso común para las tuplas es como claves de diccionario, ya que las listas no son hashaable.

Un error común de principiante es omitir la coma anterior, es decir (1), que es solo el número 1 rodeado de paréntesis. La tupla de un elemento es la única vez que necesita una coma antes de los pares de cierre: se eleva SyntaxErrorsi intenta colocar una en la tupla vacía (), y es opcional para tuplas de longitud de al menos 2.

Fragmento de longitud 5

0or x

Hay algunas cosas que suceden en este fragmento, ¡así que echemos un vistazo!

orEs como ||en muchos idiomas. En Python, A or Bcortocircuitos, regresando A(sin evaluar B) si Aes verdadero, de lo contrario, regresa B. Por ejemplo, 1 or xsiempre regresa 1, como 1siempre es verdadero, e incluso funciona si xno está definido. Por otro lado, 0 or xdevuelve xsi xestá definido o arroja un NameErrorsi no lo está.

Al jugar al golf, generalmente podemos soltar el espacio en blanco entre un número y un or, como 1 or xser 1or x. Esto es posible porque 1orcomienza con un dígito, lo que lo convierte en un identificador ilegal de Python.

Sin embargo, hay una excepción 0or, que misteriosamente arroja un SyntaxError. ¿Por qué? ¡Porque los literales octales en Python comienzan con 0o(p 0o20 == 16. Ej. ), Y el analizador se ahoga cuando llega a r!

Nota: En Python 2, los literales octales también pueden comenzar con un cero inicial, por ejemplo 020.

Fragmento de longitud 6

*x,y=L

Este fragmento muestra un tipo especial de asignación en Python, donde Lhay una lista, tupla o cualquier otro tipo de iterable.

En Python, puede "desempaquetar" tuplas y listas así:

a,b = [1,2]

Esto asigna 1 a ay 2 a b. Esta sintaxis también se usa para asignaciones múltiples, como

a,b = b,a+b

lo cual es útil cuando se escribe un programa que computa la serie de Fibonacci.

Si las longitudes en ambos lados no coinciden, entonces ValueErrorse lanza a. Sin embargo, Python 3 introdujo una nueva sintaxis, desempaquetado iterable extendido (o más coloquialmente, "asignación destacada") que le permite hacer cosas como esta:

*x,y = [1, 2, 3, 4, 5]

Esto se asigna yal último elemento, 5, y xal resto de la lista , es decir [1, 2, 3, 4]. Incluso puedes hacer algo como esto:

a,b,*c,d,e = [1, 2, 3, 4, 5, 6, 7]

que asigna 1 a a, 2 a b, [3, 4, 5]a c, 6 a dy 7 a e.

Fragmento de longitud 7

zip(*x)

zip es una función que toma un montón de listas y, bueno, las comprime:

>>> zip([1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]

Nota: en Python 3 zipse devuelve un objeto, por lo que si desea una lista como la anterior, deberá completar la llamadalist()

Es una función bastante conveniente si tiene dos o más listas relacionadas y desea vincular sus respectivas entradas.

Ahora di que quieres descomprimir la lista, ¿cómo lo harías? Podemos intentar usarlo zipnuevamente, pero desafortunadamente esto da:

>>> zip([(1, 4), (2, 5), (3, 6)])
[((1, 4),), ((2, 5),), ((3, 6),)]

El problema es que todo está en la lista única, pero ziptoma las listas individuales como argumentos de funciones separadas. Para solucionar esto, presentamos el *operador splat, que toma una lista / tupla / etc. y los descomprime como argumentos de función:

f(*[1,2]) ==> f(1, 2)

Y el resultado es:

>>> zip(*[(1, 4), (2, 5), (3, 6)])
[(1, 2, 3), (4, 5, 6)]

Fragmento de longitud 8

x='a''b'

La primera vez que vi esto, me sorprendió un poco: ¿qué significa tener dos cuerdas una al lado de la otra? La respuesta fue simple:

>>> x
'ab'

¡Python simplemente concatena las dos cadenas! Esto es extremadamente útil para la legibilidad, ya que le permite dividir cadenas largas como esta (tenga en cuenta los paréntesis que lo rodean):

x = ('This is a very long sentence, which would not look very nice '
     'if you tried to fit it all on a single line.')

Fragmento de longitud 9

0!=2 is 2

Es posible que ya sepa que Python permite el encadenamiento de operadores de comparación, por 5 < x <= 7lo que solo es cierto si 5 < xy x <= 7. Si no lo sabías ... ¡entonces sorpresa!

De todos modos, menos conocido es el hecho de que, dado que is/ is not/ in/ not intambién son operadores de comparación, también pueden encadenarse. En otras palabras, el código anterior es equivalente a (0 != 2) and (2 is 2), que es True.

Nota: Sin 2 is 2embargo, hay algunas sutilezas con la mitad, ya que iscomprueba si dos cosas son el mismo objeto , no si dos cosas tienen el mismo valor . Python almacena en caché enteros pequeños por lo 1+1 is 2es True, pero 999+1 is 1000es False!

Fragmento de longitud 10

x=[];x+=x,

¿Qué sucede cuando agrega una lista a sí mismo? Si intentamos imprimir x, obtenemos:

[[...]]

Afortunadamente, Python printes lo suficientemente inteligente como para no explotar al intentar imprimir listas recursivas. Entonces podemos hacer un montón de cosas divertidas, como:

>>> x[0][0][0][0][0]
[[...]]
>>> x[0] == x
True

Esta característica también funciona con diccionarios y es una forma de crear estructuras de datos con ciclos, por ejemplo, un gráfico.

Fragmento de longitud 11

help(slice)

La helpfunción es muy útil para depurar en Python. Cuando se llama sin argumentos en REPL, help()comienza una sesión de ayuda, en la que puede buscar documentación para funciones / tipos de datos / etc. Cuando se llama con un argumento específico, helpdará información sobre el elemento relacionado.

Por ejemplo, help(slice)proporciona la siguiente información (truncada porque es bastante larga):

Help on class slice in module __builtin__:

class slice(object)
 |  slice(stop)
 |  slice(start, stop[, step])
 |  
 |  Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).
 |  
 |  Methods defined here:
 |  
 |  __cmp__(...)
 |      x.__cmp__(y) <==> cmp(x,y)
 |  
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |
 | ...

En cuanto a slice, como podemos ver, podemos crear sliceobjetos para indexar. Por ejemplo:

>>> L = list(range(10))
>>> L[slice(2, 5)]         # L[2:5]
[2, 3, 4]
>>> L[slice(2, None)]      # L[2:]
[2, 3, 4, 5, 6, 7, 8, 9]

Otra función útil para la depuración es dir(), que devuelve todos los nombres en el ámbito actual cuando se llama sin un argumento, y devuelve todos los atributos de un objeto dado cuando se llama con un argumento.

Longitud 12 fragmento

round(5.0/2)

¿A qué se evalúa esto? ¡La respuesta depende de tu versión de Python!

En Python 2, la división entre dos enteros da como resultado la división de enteros (es decir 5/2 == 2), mientras que en Python 3 obtenemos la división flotante (es decir 5/2 == 2.5). Sin embargo, esta es una división entre un flotante y un entero, que siempre debe dar como resultado un flotante. ¿Por qué obtendríamos resultados diferentes entonces?

Si echamos un vistazo a la documentación roundpara ambas versiones de Python, encontraremos la respuesta:

  • En Python 2 , los rounddesempates se redondean desde 0.
  • En Python 3 , rounddesempate redondeando hacia el entero par más cercano .

En otras palabras, 5.0/2 = 2.5redondea a 3Python 2, pero redondea a 2Python 3. Redondear hacia el entero par más cercano puede sonar extraño, pero en realidad se llama redondeo de banquero e intenta tratar los valores positivos y negativos de manera similar para reducir el sesgo.

Fragmento de longitud 13

class C:__x=1

Al estar orientado a objetos, Python tiene clases. Lo anterior es una clase Cque tiene un solo atributo __xestablecido en 1.

Podemos acceder a los atributos de clase utilizando la notación de puntos. Por ejemplo, si tenemos la clase

class MyClass(): my_attr = 42

entonces la impresión MyClass.my_attrdaría como resultado 42, como se esperaba.

Sin embargo, si hacemos lo mismo e intentamos acceder C.__xcomo se definió anteriormente, obtenemos:

AttributeError: type object 'C' has no attribute '__x'

¿Que esta pasando? Cclaramente tiene un __xatributo!

La razón es que los atributos que comienzan con __emulan variables "privadas", algo que Python no tiene . Python modifica el nombre de cualquier atributo que comience __, agregando el nombre de la clase para evitar conflictos de reutilización de nombres. En el ejemplo anterior, si realmente estuviéramos decididos a acceder a eso 1, tendríamos que hacer

>>> C._C__x
1

Fragmento de longitud 14

NotImplemented

Python no solo tiene clases, sino que también tiene sobrecarga del operador. Por ejemplo, puedes tener una clase

class Tiny():
    def __lt__(self, other):
        return True

donde __lt__está el operador menor que. Ahora si hacemos una instancia de Tiny, podemos hacer esto

>>> t = Tiny()
>>> t < 1
True
>>> t < "abc"
True

ya que hemos definido __lt__regresar siempre True. Tenga en cuenta que también podemos hacer

>>> 42 > t
True

pero los siguientes descansos:

>>> t > 42
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    t > 42
TypeError: unorderable types: Tiny() > int()

Espera, ¿cómo funciona eso? No hemos especificado un comportamiento para mayor que con Tiny, por lo que no es sorprendente que se rompa el último caso. Pero entonces, ¿cómo sabe un int(42) que es mayor que nuestro Tinyobjeto?

Python tiene una constante incorporada NotImplemented, que puede devolverse mediante un método especial de comparación. Probémoslo:

class Unknown():
    def __gt__(self, other):
        # __gt__ for greater-than
        print("Called me first!")
        return NotImplemented

Ahora si hacemos una instancia de nuestra nueva clase:

>>> u = Unknown()

Podemos hacer esto:

>>> t < u
True
>>> u > t
Called me first!
True

Como podemos ver, lo que sucedió u > tes que Python intentó llamar al método mayor que Unknownprimero, descubrió que no estaba implementado y, en cambio, probó el método menor que para la otra clase ( Tiny).

Fragmento de longitud 15

x=[],;x[0]+=[1]

Este es un poco divertido. Primero asignamos xser, [],que es una lista vacía dentro de una tupla, es decir ([],). Luego hacemos lo x[0]+=[1]que intenta extender la lista vacía dentro de la segunda lista [1].

Ahora, recuerde que las listas son mutables y tuplas son im mutable - lo que sucede cuando se intenta cambiar un objeto mutable dentro de un objeto inmutable?

>>> x=[],;x[0]+=[1]
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    x=[],;x[0]+=[1]
TypeError: 'tuple' object does not support item assignment

Ah, entonces da un error, supongo que es de esperar. Pero, ¿y si tratamos de imprimir x?

>>> x
([1],)

¿Eh? La lista ha cambiado!

Si tiene curiosidad sobre lo que está sucediendo aquí, asegúrese de revisar esta publicación de blog .

Fragmento de longitud 16

@lru_cache(None)

¡Solo agrega caché! Este es un ejemplo simple de un decorador disponible en Python 3.

Supongamos que tenemos la siguiente implementación ingenua de Fibonacci:

def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Como la mayoría de los cursos de introducción a la programación pueden decirle, esta es una muy mala forma de implementar Fibonacci, lo que lleva a un tiempo de ejecución exponencial ya que estamos agregando efectivamente muchos 1s en el caso base. f(10)? Corre en una fracción de segundo. f(32)? Tómate un tiempo, pero llega allí. f(100)? No.

Pero si almacenamos en caché los resultados, las cosas deberían ser mucho más rápidas. Siempre podríamos usar un diccionario para el caché, pero intentemos otra cosa:

from functools import lru_cache

@lru_cache(None)
def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Como podemos ver, todo lo que he hecho es importar lru_cachedesde el functoolsmódulo y agregarlo @lru_cache(None)antes de mi función. @denota un decorador que envuelve una función, en este caso para la memorización. lru_cacheEl primer argumento es maxsizeel tamaño máximo de la memoria caché: aquí lo hemos configurado Nonepara indicar que no hay tamaño máximo.

Ahora si tratamos de usarlo:

>>> f(100)
573147844013817084101

¡Y ni siquiera tomó un segundo!

Nota: f(1000)conduce a un error de profundidad de recursión, pero esa es una historia para otro momento


¿Qué rango de enteros pequeños "atrapa" Python para el isoperador?
mbomb007

@ mbomb007 De esta pregunta , parece ser de -5 a 256. Puede probar -5-1 is -6y 255+2 is 257probar.
Sp3000

37

Jota

Factoid: puedo definir Jot con 2 votos a favor, y demostrar que es Turing completo con 8 (sin usar longitudes 4, 6 o 7).

Longitud 1

1

Este es un ejemplo de dos funciones en Jot. El primero es la cadena vacía, que se evalúa como la función de identidad. El segundo es 1, que es el operador de agrupación de Jot. 1se evalúa en λxy.[F](xy)( notación de cálculo lambda ), donde [F]está el programa antes de 1(aquí, la cadena vacía). Entonces, este programa es la función λxy.(λz.z)(xy)que simplifica λxy.xy.

Longitud 2

10

Ahora estamos introduciendo el otro símbolo en Jot: 0. Nuevamente, si [F]representa el valor del programa hasta el momento, 0evalúa a [F]SK, dónde Sy Kson de la lógica combinatoria . He definido todo el lenguaje ahora.

Longitud 5

11100

Ahora demostraré que Jot está completando Turing definiendo un mapeo desde la lógica combinatoria a Jot. Este programa Jot es el combinador K .

Longitud 8

11111000

Este es el combinador S.

Longitud 3

1AB

Aquí, Ay Bno son parte de Jot, sino más bien marcadores de posición para una expresión arbitraria. La expresión ABen lógica combinatoria se asigna a 1ABen Jot, con Ay Btransformada recursivamente por estas tres reglas. QED

Longitud N

1
10
11
100
101
110
[...]

Cada número natural, expresado en binario, es un programa Jot válido. En consecuencia, puedo generar algorítmicamente más fragmentos de longitud arbitraria. Con suficientes votos a favor, puedo resolver el problema de detención .


2
Dos votos a favor dados. Ahora defina el idioma.
John Dvorak el

@JanDvorak trabajando en ello ... que ha pasado tanto tiempo desde que he investigado esto que me había olvidado de ella :)
Phil helada

1
No veo por qué esto debería seguir recibiendo más votos a favor. Simplemente va a generar números binarios aleatorios de longitud creciente: |
Optimizador

1
Usted lo dijo para el número de voto a favor 4. Pero aquí estamos viendo un "número aleatorio que acaba de generar"
Optimizer

1
¿Cómo puedes resolver el problema de detención? ¿Supongo que tiene algo que ver con el uso de un programa infinito (número de infinito)?
Filip Haglund

37

Golpetazo

Hecho:

El extremadamente grave error ShellShock estuvo presente en Bash desde 1989, y permaneció sin descubrir durante un cuarto de siglo. Gran parte de la alegría de escribir Bash se está haciendo cargo de sus muchas idiosincrasias e inconsistencias.

Fragmento de longitud 1:

[

Un alias para el testcódigo incorporado, que permite el código del formato if [ a == b ]; then: en realidad [es un comando independiente, no un elemento sintáctico, y ]es puramente decorativo (aunque es requerido por [, su requisito es arbitrario y puede eliminarlo usando alias [=test).

Fragmento de longitud 2:

||

Como lógico oren la mayoría de los lenguajes, pero para procesos. Ejecutará el comando después del ||único si el comando anterior no devuelve cero.

Fragmento de longitud 3:

x=y

Asignación. Agradable y predecible ... pero a diferencia de la mayoría de los otros idiomas, no se permiten espacios adicionales. Lo cual es un poco divertido porque puedes pegar espacios adicionales prácticamente en cualquier otro lugar entre las cosas en bash, solo que no alrededor del =.

Fragmento de longitud 4:

$IFS

Separador de campo interno : esta variable afecta la forma en que Bash divide los datos para muchas acciones integradas, como iterar para bucles y llenar matrices a partir de cadenas. Usado correctamente puede ser muy poderoso; pero más a menudo es la causa de errores sutiles e impredecibles.

Fragmento de longitud 5:

${x^}

Sustituya la cadena en x, ¡pero con el primer carácter en mayúscula! Una característica de uso tan frecuente que tiene su propia sintaxis de lenguaje dedicada.

Fragmento de longitud 6:

x=($y)

Rellene una matriz, x, de una cadena o lista de elementos y, dividiéndose en lo que sea que el IFS esté configurado actualmente, de forma predeterminada, espacio en blanco. Una característica muy útil para la programación avanzada de bash.

Fragmento de longitud 7:

${x[y]}

Matrices! Pero espera, ¿qué es eso ... y es una cadena, no un índice numérico? Sí, de hecho, ¡Bash admite matrices asociativas! Mucha gente no sabe esto. Solo necesitas declare -A xprimero.

Fragmento de longitud 8:

${x##*,}

Sustituya x, todo hasta el último ,carácter (o lo que especifique). Útil para obtener el último campo de un csv: esto es algo con lo que no se puede hacer tan fácilmente cut, que solo cuenta los campos desde la izquierda. % y %% permite que el mismo corte desde la derecha; Se eligieron% y # por su ubicación en el teclado de EE. UU., por lo que quedaría claro qué significa izquierda y cuál significa derecha, pero eso no tiene mucho valor para todos los que no usan un teclado de EE. UU. :)

Fragmento de longitud 9:

[ a = b ]

En la mayoría de los otros idiomas, un solo igual en una operación de comparación produciría un comportamiento no deseado en forma de asignación. Sin embargo, no en Bash. ¡Simplemente no omita ninguno de los espacios, haga lo que haga!

Fragmento de longitud 10:

if [ a=b ]

Esto es lo que sucede si te olvidas de los espacios obligatorios. No arrojará un error. Siempre devolverá verdadero - incluso si ay bson variables que son definido, o como quiera que se establecen en, no importa - que siempre volverá realidad. Piense en código como if [ "$password"="$correctpass" ]para ver el potencial divertido de esta "característica".

Fragmento de longitud 11:

x=${y//a/b}

Reemplazo de subserie estilo Regex! Establezca x en el valor de y pero con cada instancia de a reemplazada por b.

Fragmento de longitud 12:

[[:upper:]]*

La coincidencia de patrones - no se limita a utilizar el comodín * en la cáscara, se puede utilizar cualquier partido estándar POSIX, como alnum, alpha, digitetc.

Fragmento de longitud 13:

function x(){

¡Un poco de sintaxis C se ha introducido misteriosamente! Uno de los muchos usos completamente diferentes para las llaves, y otro ejemplo de elementos decorativos opcionales para hacer que Bash se parezca más a otros idiomas, ya sea ()o functionse puede omitir aquí (pero no ambos). También es más divertido con espacios inconsistentes: un espacio después del {es obligatorio, pero no antes del cierre }, como enfunction x { y;}

Fragmento de longitud 14:

echo {Z..A..3}

Sin embargo, otro uso totalmente independiente de las llaves. Expande un rango con un paso específico. En este caso, producirá cada 3ª letra de Z a A. Útil para generar secuencias sin usar seq, pero no se puede usar con variables, por lo que tiene una funcionalidad limitada.

Fragmento de longitud 15:

echo {a,b,c,d}x

Otro uso similar pero no idéntico para llaves en la generación de secuencia; imprime ax bx cx dxy es útil para generar una lista de cadenas a partir de una secuencia o lista en un solo comando. Sin embargo, una vez más, su utilidad es limitada, ya que no se puede usar con variables dentro de las llaves.


En realidad, ]no es puramente decorativo. [se negará a funcionar si su último argumento no lo es ].
FUZxxl

Sí, pero no sirve para nada más que cosméticos; y si lo sustituye [con su otra forma test, entonces ]se puede omitir sin cambiar nada más en la llamada; simplemente estoy señalando que no es la sintaxis real de bash, solo el azúcar visual.
Riot

Tienes razón en que no es una sintaxis bash, pero el final ]es una [sintaxis y debes proporcionarla de la misma manera que debes terminar una declaración en C con un punto y coma.
FUZxxl

Es cierto que es obligatorio, pero no de la misma manera que el punto y coma C. El requisito es totalmente arbitrario, como se ve si simplemente alias [=testescribe y luego escribe, if [ 1 = 1; thenetc. Pero aclararé mi redacción para tener en cuenta su punto :)
Riot

1
Con respecto a la function x(){sintaxis: puede soltar los parens, como usted dice, pero también puede soltar la functionpieza. De hecho, así es como el shell POSIX define las funciones, por lo que es más portátil de esa manera. Puede definir una función completa en 13 caracteres. Por ejemplo:x(){ startx;}
kojiro

37

APL

Factoid

APL ( A P rogramming L anguage) comenzó como un intérprete para una notación de fórmula ideada por Ken Iverson . Cuando se diseñó el lenguaje, las personas usaban teletipos para comunicarse con las computadoras. El conjunto de caracteres de estos era limitado, pero debido a su construcción, uno podía poner varios caracteres en la misma posición para componer caracteres complejos. APL utiliza mucho esta característica, lo que contribuye a su infame reputación como lenguaje de solo lectura.

Puede probar la mayoría de los ejemplos en http://www.tryapl.org .

Longitud 1

El personaje , llamado pantalla de lámpara, tanto por su forma como por la iluminación que obtienes de su presencia, introduce un comentario. Históricamente, se creó sobrepasando un (jot) y un (zapato arriba).

Longitud 2

⍳3

La función monádica (un argumento) (iota) genera un vector de los primeros pocos números naturales. Por ejemplo, lo anterior ⍳3produciría 1 2 3el vector de los primeros tres números naturales. En algunas implementaciones de APL, en su 0 1 2lugar, produciría , esto depende del valor de ⎕IO, el i ota o rigin.

Longitud 3

5\3

A diferencia de lo monádico , la función diádica \(expandir) copia el argumento de la derecha con tanta frecuencia como el argumento de la izquierda; por lo tanto, 5\3rinde 3 3 3 3 3. Es posible que desee jugar con argumentos vectoriales (como 1 2 3\4 5 6) para ver qué hace entonces.

Longitud 4

A←⍳3

Esto se asigna al Avalor de ⍳3. (flecha izquierda) es el operador de asignación. Una asignación no tiene que ser lo más a la izquierda de una declaración; las asignaciones se analizan como llamadas a funciones y producen el valor asignado para su uso posterior.

Longitud 5

∘.×⍨A

Una tabla de multiplicar de tres por tres, es decir,

1 2 3
2 4 6
3 6 9

Esto es un poco complicado, así que déjame explicarte. ⍺∘.f⍵(léase: alpha jot dot f omega) es el producto externo de y sobre f. El producto externo es una tabla del resultado de la aplicación fa cada posible par de elementos desde y . En este ejemplo, fes ×(multiplicar), produciendo una tabla de multiplicar. El operador (tilde diæresis) conmuta sus argumentos, es decir, ⍺f⍨⍵es igual ⍺f⍵y f⍨⍵sin un operando izquierdo es igual a ⍵f⍵. Sin el operador de viaje este fragmento sería a∘.×a. El operador externo del producto es muy versátil; echa un vistazo a lo que sucede si se sustituye =por ×!

Longitud 6

{×/⍳⍵}

Una función factorial. Un par de llaves encierra una dfn (función dinámica), es decir, una función anónima (cf. expresiones lambda). Los argumentos de un dfn están vinculados a las variables y / o solo si el dfn se llama como una función monádica (argumento único, en oposición a la diádica, dos argumentos). Aplicamos el argumento correcto, produciendo enteros de 1a . El /operador (barra inclinada) reduce, es decir, se f/⍵inserta fentre los elementos de . Por ejemplo, +/⍳5es justo 1+2+3+4+5. En este caso, reducimos con ×, produciendo el producto de los elementos de ⍳⍵, que es solo el factorial de .

Longitud 7

2×3*4+5

Los rendimientos 39366. ⍺*⍵(Alpha Star Omega) se eleva al poder de . APL tiene una regla de precedencia muy simple: todo se evalúa de derecha a izquierda, todas las funciones son asociativas a la derecha. Los operadores se unen más fuerte que las funciones y se evalúan de izquierda a derecha. Por lo tanto, la expresión anterior con paréntesis explícitos se escribiría 2×(3*(4+5))como opuesta a la habitual (2×(3*4))+5.

Longitud 8

¯1+3 3⍴A

Este fragmento rinde

0 1 2
3 4 5
6 7 8

y demuestra dos conceptos importantes: el primer concepto es la función (rho), que reestructura su argumento derecho a la forma especificada en su argumento izquierdo. La forma de una matriz es un vector de las longitudes de cada eje en la matriz. La forma de un escalar es el vector vacío. Por lo tanto, 3 3⍴Acambia la forma Aen un tres por tres matriz. El segundo concepto es cómo se usa la suma aquí: agregamos ¯1(sobrebarra uno), que significa uno negativo ( ¯es un prefijo para especificar números negativos, mientras que -es un operador) a una matriz. Los dos operandos tienen formas diferentes, por lo que el operando con la forma menor se distribuye en el otro operando, restando uno de cada elemento en la matriz generada.

Longitud 9

+.×⍨3 3⍴A

A, reformado a una matriz 3 por 3, multiplicado consigo mismo. El .operador (punto) toma dos funciones y construye un producto interno , donde la primera función representa la suma y la segunda función de multiplicación. Una simple, antigua, multiplicación matricial es +.×, una variante común es ≠.∧(donde no es igual y (up caret) es lógico y) para matrices booleanas; Se pueden modelar muchas cosas interesantes como un producto interno con ciertos operadores en lugar de +y ×.

Longitud 10

(.5×⊢+÷)⍣≡

(léase: paréntesis izquierdo punto cinco multiplicar tachuela derecha más dividir paréntesis derecho estrella-diéresis igual) Calcule la raíz cuadrada de un real usando el método babilónico . El argumento izquierdo es el número del que desea calcular la raíz cuadrada, el argumento derecho es la suposición inicial para la raíz cuadrada. Originalmente quería proporcionar una conjetura inicial significativa, pero se me acabaron los caracteres (anexar para usar el número en sí como la conjetura inicial).

Entonces, ¿cómo funciona esto? Comencemos con la parte izquierda (.5×⊢+÷), primero. Esta expresión usa notación tácita originada en J que luego fue portada nuevamente a Dyalog APL. La notación tácita es un poco difícil para los principiantes, así que lea esta sección detenidamente. Una secuencia aislada, como +/÷≢, que las reglas de análisis "normales" no resuelven en una sola parte del discurso, se denomina tren. Un tren de dos o tres funciones produce una función y (por resolución repetida), un tren de funciones de cualquier longitud también produce una función. Un tren de tres funciones se fghcomporta como {(⍺f⍵)g⍺h⍵}, es decir, fy hse aplica a los argumentos de la función resultante y se aplica el resultado de estos g. Un tren de una matriz y dos funciones comoAfgse comporta como {Af⍺g⍵}, esto es, gse aplica a los argumentos de la función resultante y Ase aplica ese resultado f. Un tren de dos funciones también tiene una semántica, que se explica en la documentación pero no se usa en este ejemplo.

En este tren en particular, se usa una nueva función, (tachuela derecha). Se comporta como {⍵}, dando su argumento correcto. Por lo tanto, la expresión completa es igual a {.5×⍵+⍺÷⍵}, que es solo el paso de iteración de la fórmula babilónica. Es fácil ver cómo la notación tácita beneficia al golfista; le permite afeitarse de unos pocos personajes preciosos cuando corresponda.

La última pieza del rompecabezas es la (diéresis estelar), operador de potencia . Si el argumento correcto es una matriz, se f⍣A⍵aplica fa un total de Aveces. Por ejemplo, f⍣3⍵es igual a fff⍵. El recuento puede ser negativo, en cuyo caso APL intenta inferir una función inversa de fy lo aplica. Si el argumento correcto para es una función, también se f⍣g⍵aplica fa hasta (fY)gYdónde Yes el resultado de la aplicación repetida de fa . Notablemente, si ges =(igual) o (igual), f⍣≡calcula un punto fijo def. ¡Esto es exactamente lo que necesitamos para el método babilónico! Queremos iterar hasta que el resultado converja. Por último, si se aplica a un par de cosas se invoca como una función diádica, el argumento izquierdo está vinculado a fla izquierda, ⍺f⍣g⍵es decir, es igual a (⍺∘f)⍣g⍵donde se A∘fcomporta {Af⍵}.


¡Tienes más votos! ¿Podemos tener un poco más?
luser droog

@luserdroog Claro, déjame pensar en algo más.
FUZxxl

¿Puedo editar y extender esto?
Adám

@ Adám Sí, por favor.
FUZxxl

∘.×⍨a me da un error de valor . ¿Lo estoy usando correctamente?
Cyoce

37

Matlab

Fragmento 26: iterar sobre matrices

Esto es algo que acabo de descubrir recientemente. Por lo general, itera sobre un vector dado en bucles for. Pero en lugar de vectores, también puede usar matrices ( rand(10)produce una matriz de 10x10 con números distribuidos uniformemente entre 0 y 1).

for k=rand(10);disp(k);end

Esto luego muestra un vector de columna de la matriz aleatoria por iteración.

Fragmento 25: trazado sencillo

Sabemos que trazar es fácil en matlab, pero hay una función súper fácil ezplot(¿ E-Zentiendes? Me tomó bastante tiempo hasta que finalmente lo obtuve, ya que Zsiempre escribí como en sedlugar de c, lo que sea ...) A todos les gustan las curvas elípticas:

ezplot('y^2-x^3+9*x-10.3')

curva elíptica

Fragmento 24 - integración

La palabra antigua (pero aún en uso en el cálculo numérico) para integración es 'cuadratura', ¿puedes adivinar cuál es el resultado de la siguiente?

quad(@(x)4./(1+x.^2),0,1)

Fragmento 23 - imágenes

Por supuesto, Matlab también es muy popular entre los científicos que tienen que trabajar con imágenes (por ejemplo, análisis de imágenes médicas), por lo que esta es una función muy útil. El primer argumento es la imagen, el segundo el ángulo y el tercer argumento opcional aquí le dice a la función que lo recorte al tamaño original.

imrotate(rand(99),9,'c')

aquí

Snippet 22 - música

load handel;sound(y,Fs)

Sonará así (enlace de youtube)

Fragmento 21: diferenciar e integrar

polyint(polyder(p),c)

Puede diferenciar e integrar fácilmente polinomios utilizando esas dos funciones. Al integrar, puede pasar un segundo argumento que será la constante.

Fragmento 20: volver a los polinomios

p=poly(r);cp=poly(A)

¿Quieres el polinomio con las raíces adentro r? Fácil: p=poly(r). ¿Quieres el polinomio característico de una matriz A? Fácil: cp=poly(A). Entonces roots(p)es exactamente r(o una permutación de r).

Snippet 19 - otro truco de magia

fminsearch(fun,x0);

Hay personas que aman absolutamente esta función. Básicamente, esto solo busca un mínimo de funcon un valor inicial x0(puede ser un vector) sin condiciones fun. Esto es ideal para ajustar modelos pequeños donde no puede (o es demasiado vago) diferenciar la función de error / penalización / objetivo. Utiliza el algoritmo Nelder-Mead simplex, que es bastante rápido para funciones en las que no puede hacer suposiciones.

Fragmento 18: introducción a los polinomios

p=polyfit(x,y,deg)

Matlab tiene una buena solución para hacer frente a polinomios. Con polyfitusted obtienes un polinomio de mínimos cuadrados de grado degque se aproxima a los puntos x,y. Obtiene un vector pque almacena los coeficientes de los polinomios, porque eso es lo único que necesita para representar un polinomio. Si vuelve al fragmento 15, puede hacer lo mismo escribiendo c = polyfit(x,y,2). Entonces, por ejemplo, [1,-2,3]representa el polinomio x^2 - 2*x+3. Por supuesto, también hay funciones para ajustar otras funciones elementales o arbitrarias.

Fragmento 17 - ángulos y discontinuidades

unwrap(angle(c))

Si desea obtener el argumento de un vector 'continuo' de números complejos, a menudo obtiene valores que parecen tener una discontinuidad. Por ejemplo, angle([-1-0.2i,-1-0.1i,-1,-1+0.1i,-1+0.2i])te obtendrá [-2.94,-3.04,3.14,3.04,2.94]ya que anglesolo devuelve ángulos entre -piy pi. ¡La función unwrapse encargará de esto! Si obtiene una discontinuidad como esta, simplemente agregará un múltiplo de 2*pipara eliminar esos: '[-2.94, -3.04, -3.14, -3.24, -3.34]' ¡Esto incluso funciona para matrices 2d! Si solo traza el argumento de números complejos con una parte real negativa, obtiene los primeros gráficos, obtendrá la primera imagen, con desenvolver obtendrá la segunda:

sin desenvolver con desenvolver

[x,y] = meshgrid(-1:0.01:0,-0.5:0.01:0.5);
z = x+i*y;
imagesc(angle(z))
imagesc(unwrap(angle(z)))

Snippet 16 - producto escalar

[1;2;3]'*[4;5;6]

Por supuesto, hay métodos incorporados (como dot), pero con el operador de transformación de matriz 'es tan simple como eso. Si no sabe si tiene vectores de fila o columna, puede usar a(:)'*b(:)where a(:)siempre devuelve un vector de columna.

Fragmento 15: mínimos cuadrados lineales, el método feo con la varita mágica

[x.^2,x,x.^0]\y

xes el vector (columna) con los valores en el eje x, ylos ruidosos valores y. Escribe c=[x.^2,x,x.^0]\yy obtienes los coeficientes del polinomio de segundo grado. Por supuesto, puede usar una de las mil millones de funciones de ajuste integradas de matlab (qué aburrido) ¿por qué no usar la varita mágica? =)

x = (-1:0.1:2)';
y = 3*x.^2-2*x+1+randn(size(x)); %add some gaussian (normal) noise
A = [x.^2,x,x.^0];
c = A\y              %output: c = ]3.0049; -2.3484; 1.1852]
plot(x,y,'x',x,A*c,'-')

linreg

Fragmento 14 - gráficos

gplot(graph,x)

Así es como trazar un gráfico. graphdebe contener una matriz de adyacencia cuadrada y xdebe ser una matriz nx2 que contenga las coordenadas de cada nodo. Hagamos un gráfico aleatorio: graph = triu( rand(8)>.7)(haga una Matriz que contenga 0s y 1s, obtenga solo el triángulo superior para un gráfico interesante). x = rand(8,2)luego trama con algunos estilos elegantesgplot(graph,x,'k-.d')

grafico (Declaro esto como arte moderno).

Fragmento 13 - malla de malla

meshgrid(a,b)

Esta es una de las funciones más increíbles, simple pero útil. Si desea trazar una función con valor real dependiendo de dos variables, puede definir un vector de valores para el eje xy uno para el eje y (ayb). Luego, con meshgrid, puede crear dos matrices del tamaño len (a) x len (b) donde una tiene solo el vector acomo columna, y la otra tiene solo la columna tiene solo los vectores bcomo filas. Ejemplo de uso: a = -3:0.2:3;[x,y]=meshgrid(a)(si ambos vectores son iguales, es suficiente simplemente pasar uno). Luego puede escribir z=x.^2+-y.^2y, por ejemplo,mesh(x,y,z). ¡Esto funciona para un número arbitrario de dimensiones! Por lo tanto, esto no solo es excelente para trazar, sino también para obtener todas las combinaciones posibles de diferentes vectores, etc. (Por lo tanto, si desea crear un nuevo lenguaje de golf de código, esto debería estar allí, solo asegúrese de usar un formato más corto nombre de la función...)

malla

Fragmento 12 - trazado

plot(x,x.^2)

Toma un vector x=-3:0.5:3y deja que plothaga el resto. Hay muchas más funciones para trazar, esta es solo una muy básica que puedes usar todo el tiempo. Ya sería suficiente escribir plot(v)y los datos vse trazarán contra los índices de la matriz. ¿Qué tan simple es eso? Si desea diseñar su trazado, simplemente agregue una cadena como tercer argumento: por ejemplo 'r:o', hará una línea roja punteada con círculos alrededor de los puntos de datos. Si desea varias parcelas, simplemente agregue más argumentos o use matrices en lugar de vectores. Infalible.trama

Fragmento 11 - manijas de función

f=@(x,y)x+y

Este es un ejemplo de un identificador de función que se almacena en f. Ahora puedes llamar f(1,2)y obtener 3. Los controladores de funciones en matlab son muy útiles para las funciones matemáticas (por ejemplo, el trazado) y puede definirlas en una línea. Pero un inconveniente es que no puede tener condicionales o por partes (y, por lo tanto, no hay recurrencia). Si desea esto, debe usar la functiondeclaración y declarar una nueva función, y cada una de ellas debe almacenarse en un archivo separado ... (¿POR QUÉ AAAA?)

PD: Obtendrás otro huevo de Pascua divertido si escribes whyen la consola: hicieron una gran función que produce mensajes aleatorios como:

The tall system manager obeyed some engineer.
The programmer suggested it.
It's your karma.
A tall and good and not excessively rich and bald and very smart and good tall and tall and terrified and rich and not very terrified and smart and tall and young hamster insisted on it.

... lo cual es muy reconfortante si estás lo suficientemente desesperado como para preguntarle a la consola why...

Fragmento 10: ¿Cómo se ve mi matriz?

spy(eye(9))

Como ya sabes, eye(9)crea una matriz de identidad de 9x9. spysimplemente crea un que muestra las entradas cero / no cero de la matriz. Pero también puede usarlo para mostrar datos binarios en 2D. Si llamas spysin argumentos, obtendrás un bonito huevo de pascua =)

espiar la identidad espía easteregg

Fragmento 9

kron(a,b)

La kronfunción evalúa el producto Kronecker de dos matrices. Esto es muy útil para operadores lineales multidimensionales discretos. También lo usé de vez en cuando para golf de código. ¿Desea todos los productos posibles de las entradas de ay b? kron(a,b), aqui tienes.

Fragmento 8

5*a\b.*b

Ok, aquí mezclé 3 operadores diferentes. Puede multiplicar cualquier matriz por un escalar simplemente usando *. (Entonces cada entrada de la matriz se multiplica por ese escalar). Pero *también realiza multiplicaciones matriciales. Si antepone un punto, obtiene el .*operador, este multiplica dos matrices del mismo tamaño pero de entrada . (Esto también se puede hacer con operadores de división como /y \.)

A continuación, el operador de barra invertida se puede usar como división izquierda (en contraste con el /que realiza la división derecha como está acostumbrado), pero también es el operador más poderoso y característico de matlab: realiza una 'división matricial'. Digamos que tiene el sistema de ecuaciones lineales A*x=by desea resolverlo x, entonces simplemente puede escribir x=A\b. ¡Y \(también puede usar, /pero eso es menos común para las matrices) primero analiza rápidamente la matriz y usa los resultados para encontrar el algoritmo más rápido para realizar esta multiplicación por inversión! (Ver, por ejemplo, aquí )

Pero también puede usarlo para sistemas infradefinidos o sobredefinidos (donde no existe inversa o donde la matriz ni siquiera es cuadrada, por ejemplo, para el método de mínimos cuadrados). Esta es realmente la varita mágica de matlab.

Fragmento 7

[a,b;c]

Ok, eso no parece mucho, pero es una herramienta muy conveniente: la concatenación de matrices. Una coma entre dos expresiones significa que se concatenan horizontalmente (eso significa que deben tener la misma altura) y un punto y coma significa que la 'línea' anterior estará por encima de la siguiente 'línea' (por línea quiero decir todo entre dos puntos y comas). Solo un ejemplo simple: a = [1,2;3,4]; b = [5;6]; c =[7,8,9]; d=[a,b;c];resultará en lo mismo dque d=[1,2,5; 3,5,6; 7,8,9]. (¿Entendido?)

Recortado 6

eye(7)

Esta función produce una matriz de identidad 7x7 completa. Es así de fácil. Hay otras funciones comonan,inf,ones,zeros,rand,randi,randn esa que funcionan de la misma manera. (Si pasa dos argumentos, puede establecer el alto / ancho de la matriz resultante.) Como mostraré más adelante, puede crear fácilmente y (y de una manera muy visual) concatenar matrices (matrices 2d), lo cual es muy útil y fácil si tiene que resolver numéricamente ecuaciones diferenciales parciales. (Cuando resuelva PDE, el enfoque general es la discretización de los operadores derivados, básicamente obtendrá un gran sistema de ecuaciones lineales que debe resolverse. Estas matrices normalmente son escasas (solo muy pocos elementos distintos de cero) y tienen algún tipo de simetría. Es por eso que puede 'componer' fácilmente la matriz que necesita.

Fragmento 5

a(a>0.5)

Espero que no te estés cansando por todas las formas de acceder a las matrices. Esto muestra una manera fácil de obtener todos los elementos de una matriz que cumplan algunas condiciones. En este caso, obtienes un vector de todos los elementos aque son mayores que 0.5. La expresión a>0.5solo devuelve una matriz del mismo tamaño que acon unos para cada elemento que satisface la condición y a 0para cada elemento que no lo hace.

Fragmento 4

a(:)

De nuevo, esto solo devuelve el contenido acomo un vector de columna (matriz nx1). Esto es bueno si no sabe si almacenó sus datos como vector de columna o fila, o si sus datos son bidimensionales (por ejemplo, para métodos de diferencias finitas en 2D).

Fragmento 3

1:9

Puede crear fácilmente vectores (en este caso matrices 1xn) con el operador de punto y coma. En este caso obtienes el vector [1,2,3,4,5,6,7,8,9]. Esto también es particularmente bueno para acceder a sectores de otros vectores como, por ejemplo, acceder a(2:4)al segundo, tercer y cuarto elemento del vector a. También puede usarlo con un tamaño de paso, como0:0.5:10 o menos.

Fragmento 2

i;

Un punto y coma suprime la salida a la consola. Puedes verlo como algo bueno o malo, pero me gusta para depurar cosas. Cualquier línea de cálculo, etc., imprimirá automáticamente su resultado en la consola, siempre que no suprima la salida con un punto y coma.

Fragmento 1

i

Los números complejos son un tipo de número básico. (Lástima que mucha gente usei como una variable de conteo para bucles, en cuyo caso se anula).

Introducción

Para aquellos que no lo saben, MatLab es un lenguaje de programación (con un buen IDE que también se llama MatLab?) Primero que todo destinado a cálculos numéricos * y manipulación de datos. (Hay una contraparte de código abierto llamada "Octave") Como solo se interpreta **, no es muy rápido, pero su fortaleza es que puedes manipular fácilmente las matrices y muchos algoritmos se implementan de manera optimizada para que funcionen bastante rápido cuando se aplica en matrices. También es un lenguaje muy fácil de aprender, pero no lo recomiendo como lenguaje de inicio, ya que asumirás hábitos de 'programación' bastante malos.

* Como es un lenguaje interpretado, puede ser muy lento para proyectos costosos, pero tiene métodos de paralelización incorporados y también puede usar varias computadoras juntas para ejecutar un programa. Pero si realmente quieres ir rápido, creo que todavía dependes de C o Fortran o cosas locas como esa. Sin embargo, muchos algoritmos implementados (multiplicación de matrices, sistemas de resolución de ecuaciones lineales, etc.) están muy optimizados y funcionan bastante bien. Pero si programa los mismos algoritmos en Matlab, tendrá que esperar =) (Algo realmente poco intuitivo cuando viene de otros idiomas es que si vectoriza sus operaciones en lugar de usar bucles, puede ahorrar mucho tiempo en Matlab .)

** Puede compilar sus programas, pero eso convierte principalmente el código fuente en un archivo ilegible (para humanos), que no es mucho más rápido cuando se ejecuta.


1
Tengo este problema muy a menudo ... estableciendo ialgo y luego experimentando un comportamiento inesperado cuando no es la unidad compleja.
fiesta

3
Buen huevo de pascua! Si escribe 'editar espía' encontrará un ejemplo de ofuscación de código :-)
Abulafia

1
Fui a votar esto y luego me di cuenta de que ya lo había hecho. Por desgracia, si pudiera volver a votarlo. ¡Sigan viniendo, @flawr!
Alex A.

2
Si se está quedando sin inspiración para mostrar cosas, puedo recomendar el blog de Mathworks: Sobre el arte de MATLAB por Loren Vershure A menudo describen las mejores prácticas que se pueden mostrar dentro del límite de caracteres. Para curiosidades considere Abandon Matlab , y para funciones y características indocumentadas puede ir a Ulabormentado Matlab por Yair Altman
Dennis Jaheruddin

1
@flawr - Para el hecho, también puede ser genial mencionar el hecho de que históricamente, MATLAB fue creado originalmente para los estudiantes de Ciencias de la Computación de la Universidad de Nuevo México (Cleve Moler era presidente en ese momento) como una interfaz fácil para el LINPACK y EISPACK (... ahora reemplazado por LAPACK ) sin tener que aprender FORTRAN ... y debido a su facilidad de uso, se extendió a otras instituciones académicas muy rápidamente :)
rayryeng

35

CJam

Pruebe los fragmentos a continuación aquí

Fragmento de longitud 20:

q~{]__~z\z<=\~*0>*}*

Una calculadora min-mod . Un extracto de la pregunta:

La función minmod es una variante del min familiar , que aparece en esquemas de alta resolución con limitación de pendiente para ecuaciones diferenciales parciales. Dadas una serie de pendientes, selecciona la pendiente más plana, mientras se ocupa de los signos relativos entre las pendientes.

La función toma un número arbitrario de parámetros. Entonces minmod (x 1 , x 2 , ..., x n ) se define como:

  • min (x 1 , x 2 , ..., x n ) , si todo x i es estrictamente positivo
  • max (x 1 , x 2 , ..., x n ) , si todo x i es estrictamente negativo
  • 0 , de lo contrario.

Fragmento de longitud 18:

l'[,65>Dm>_el+_$er

Un codificador ROT13. Cambia solo los a-zA-Zcaracteres de la cadena de entrada a través de STDIN

Fragmento de longitud 15:

T1{_2$+}ri2-*]p

Un programa completo para imprimir los primeros Nnúmeros de una serie de Fibonacci donde Nse proporciona como entrada a través de STDIN.

Fragmento de longitud 12:

{{_@\%}h;}:G

Una simple función GCD. Esto se puede usar 2706 410 Gpara obtener el GCD en la pila.

Fragmento de longitud 11:

123456 789#

#es el operador de poder. Este fragmento muestra una característica interesante de CJam que admite BigInts para casi todas las operaciones matemáticas. Entonces la salida del código anterior es

1596346205622537943703716803040694151242100030904924074732295184521676912291137885341977590649991707684635184329980991487148618486236239062505001539322685142817506810040361209550544146292158784625519911512640361780862459268161619223326802388689703997604303632605734938879647069477372395799326590488746599202521617640394227957532720581758771344616555153473551874187964029973716015080326283503474062024803237072761129557356772954771383125420283743787215768524095651476398918270831514362626616089349128838080859262141293069421199363839940462244772673481244848208112002212957221705577938865719802035511067875502253218277834350725436729497351901219311577128600087062378434520948898301738545267825952998284599001356281260973911216650526574435975050678439968995805415462116669892745933523276658479456263859786003695570642598885206779863730608803831608206418317758451327165760242416052588688579435998154295782751455020445483571514197850814391880423853968520336337963918534259580183058727377932419280412466915889059399591196961188841001024998633317094826403760131868252088477018937989608302521450181593409274231460335072324865982559395114735391976545471553525054490202974741119144469523879456646833238659929705233941114530149037245274032070536718197592615630616792756562341411027203615235147973615347081993563361626845258162606172599728677944001956482301240050182368840648532697569098833480384074404562991348377266778603059081932412368912313845464302833428950934701568958836851009236647605585910687215977468114323293396641238344799575626940766355697576957869656153567798618227770961980620119004224798449940378878601283741944503399682599666873704888519152796472231721010884561046439019823540214190109829183178504573391524533915085342799888899681052113605127068137552531204917650779012455136663716975904242872042805633443567570913936237754642040107392687168596924804730637819953463737212774674563401663682370631910559669378413063684132477269578881395521544729393136204246705936061735379354437327940116154383441927197123218522827575163913310005036963663583344508839784971260123709283218409462028161021477446586507813599051643059982983426688872855309396405653159417356549291603532443699350168178837164682957610433456205211423600319694496115159970718912091395232327389520091646132878609779171226748990343349416763319432268713023302555895744813731889452605219001900815755497209921418814092923394321459962373890912709775151652200071533644718727513889263907829300496554849544461628702471995210369421320165755673222520834013956492183306187393652197405863508709529644837118590847002900783148394313160749018413291215958936871830666201928218294362550829287373305552379418641499562597137520153409556227576809855521876196531587454478159211299517511047868125975115347272184123454929507976958328038242400918390689757262398695703472270927183494613959476164389143107240083171566284628032072645081703351075328092783401422849512230275075331561337345714881104575020436358133210849231625973013523497330004645467493618279226202227586584610761439335895760888873155403816627190368675397978355381544497413492223577022267403347927237298551052219150516984577176643706356698282552857754120841266435149587248192704898338826251727748499150285409036076919533685800933215325289882260771526293167171975367192287689881199864600661035143522211647660445960687046757311913589429739868592726372013684511683081229044622752191694278221303073075505531920922815724661725685493922212700535444400760813940151761980008355835574184921854364539924999643954874549857103642483664109073938527328920827803218865362851320233433429604394590974694396314165313743853607609394553133883545319222169958204731303672940856293527174545435349105954532301106962634516087237739490953930886293289854731305112253177512851251930821765454042415085420000484369355605183062368648992392499663861508991984554431113080399485470268940148600970493633737364443822752829774334511729579419931500217970224646496435527826186627011323464848141074486509849545954714213290443775688291020289759390171236344528896

Fragmento de longitud 10:

"`%W_"_W%`

Ya hemos hecho quine, ¡vamos a revertirlo! Esta es una de las quinas inversas más cortas en CJam. La quine inversa es una quine que imprime su código fuente en orden inverso.

Fragmento de longitud 9:

5,K,+_&S*

Este fragmento muestra muchas características de CJam,

5, "create an array of numbers 0 to 4"
K, "create an array of numbers 0 to 19"
+  "List concatination"
_  "Duplicate top stack element"
&  "Set distinct operator in this case"
S* "Join array elements with space character"

Fragmento de longitud 8:

"`_~"`_~

Una de las quines más pequeñas posibles en CJam. Esta es una verdadera quine en el sentido de que en realidad no lee el código fuente de ninguna manera. (La lectura del código fuente ni siquiera es posible en CJam)

Fragmento de longitud 7:

"AB"_m*

m*crea todos los productos cartesianos de los dos elementos principales de la pila. Por ejemplo, el código anterior se colocará ["AA" "AB" "BA" "BB"]en la pila, que es el producto cartesiano de "AB"y "AB".

Fragmento de longitud 6:

"_~"_~

Un bonito código repetido. NO ejecutes esto :). Esta representación de código es la base para la quine más simple en CJam. Pones una cadena "_~"en la pila, haces una copia ( _) y la evalúas. Lo que a su vez hace lo mismo de nuevo (y de nuevo ...) hasta que alcanza la excepción de recursión máxima.

Fragmento de longitud 5:

{A}:F

Así es como funciona una función básica en CJam. La expresión anterior asigna el bloque de código {A}a la variable F. Ahora en su código, puede poner en Fcualquier lugar para ejecutar el bloque de código (y obtener 10en este caso)

Fragmento de longitud 4:

"A"~

Puede evaluar cualquier bloque de código o cadena o incluso un solo carácter usando ~. La expresión anterior da como resultado10

Fragmento de longitud 3:

Kmr

Un generador de números aleatorios típico de rango 0 a K20.

Fragmento de longitud 2:

es

Esto proporciona la marca de tiempo actual (milisegundos de la época). CJam también tiene etpara la hora local en un formato más utilizable que devuelve una matriz que comprende las diversas partes de la hora actual (día, hora, etc.).

Fragmento de longitud 1:

A

CJam tiene casi todos los alfabetos capitales como variables predefinidas. Aes 10, Bes 11 y hasta Kes 20. Pes pi (3.141592653589793), Nes una nueva línea y muchas otras . Estos pueden ser muy útiles cuando necesita valores iniciales en variables, o incluso cuando necesita un número de dos dígitos en 1 byte.

Factoid

CJam está inspirado en GolfScript pero crea muchas funciones además de soporte para una llamada GET de red: D

PD: Intentaré actualizar la respuesta cada 5 votos a favor o cada 2 horas (lo que ocurra antes)


Hay algunos problemas con tu ejemplo ROT13: p Pero estoy impresionado con la quine, creo que voy a pedir prestado :)
aditsu

@aditsu, ¿cuál es el problema?
Optimizador

Cambia el caso de las letras nz. Además, tiene una @ sin ninguna razón, puede colocar la D allí.
Aditsu 01 de

@aditsu Estoy bastante seguro de que es un ROT 13 en el rango a-zA-Z y esa es la razón del cambio de mayúsculas y minúsculas. ¿No puedes leerlo? es solo tu propio idioma: P @ está ahí por 18 caracteres, supongo: D
Optimizer

Eso no es lo que normalmente hace ROT13. No entiendo por qué me preguntas si puedo leer mi propio idioma, el problema no se trata de entender lo que hace el programa, sino del hecho de que no hace lo que se espera.
aditsu 01 de

34

Lisp común

Lisp (de LISt Processing) es uno de los idiomas más antiguos que todavía se usan en la actualidad (solo FORTRAN es más antiguo). Es notable por ser el primer idioma donde el código es datos y los datos son código; llamado homoiconicidad. También fue el primer idioma en tener recolección de basura. Originalmente diseñado por John McCarthy en un artículo de 1958 como un lenguaje completamente teórico, se convirtió en un lenguaje real cuando Steve Russel se dio cuenta de que la función eval podía implementarse en una computadora. Es más frecuente en Inteligencia Artificial, y se reconoce instantáneamente por su preponderancia de paréntesis. Common Lisp fue diseñado para unificar muchos de los dialectos Lisp más antiguos en una forma más estandarizada.

Intentaré que cada fragmento sea ejecutable por sí mismo, aunque no necesariamente haga algo de valor. Además, debido a que estoy usando Common Lisp, los conceptos fundamentales y gran parte de la sintaxis se aplican en otros dialectos, pero ciertas funciones no funcionarán, por ejemplo, en Scheme.

Longitud 1

*

Debido al énfasis en el uso de Expresiones-S y listas para la codificación, hay muy pocas expresiones válidas en Lisp que no contengan paréntesis, llamadas átomos. Todo lo que se escriba directamente en el REPL (bucle read-eval-print) se trata como una variable y se evalúa como tal. *contiene el valor anterior que fue impreso por REPL.

Longitud 2

()

Esta es la lista vacía, uno de los símbolos más importantes en Lisp. Cada lista apropiada en Lisp termina con una lista vacía, similar a cómo cada cadena apropiada en C termina con\0 .

Longitud 3

(*)

Esta es una llamada de función básica, que consiste en un símbolo entre paréntesis. Lisp no contiene operadores, solo son funciones también. Escogí la multiplicación específicamente porque en realidad no es una función binaria; El operador de multiplicación en Lisp toma un número indefinido de argumentos. Si no recibe argumentos, devuelve 1el operador de identidad para la multiplicación.

Longitud 4

`(1)

Esta es una celda de contras, que es solo otra forma de decir que es un par de elementos. En Lisp, cada lista consta de celdas cons conectadas a celdas cons, donde el primer elemento (the car) es el valor y el segundo elemento (the cdr) apunta a la siguiente celda cons. Esto forma la base de que Lisp se base en listas vinculadas. Esta celda particular de contras tiene 1como el auto y la lista vacía como su cdr.

Longitud 7

(not t)

Quiero tocar los valores de verdad en Lisp. Esto volvería nil. En Common Lisp, tes el símbolo de true while nily ()representa false y son iguales entre sí, pero tenga en cuenta que esta definición no es estándar para todos los dialectos de Lisp; El esquema, por ejemplo, distingue entre #ffalso y'() para la lista vacía.

Longitud 9

(cdr ())

Como dije antes, el cdr es el elemento final de una lista, que puedes obtener con la función cdr. Del mismo modo, puede obtener el elemento de la cabeza, el automóvil, con la función car. Bastante simple, ¿verdad? El auto y el cdr de la lista vacía son ambosnil .

Longitud 10

(cons 1 2)

Finalmente, longitud suficiente para comenzar a trabajar con listas. conscrea una celda de contras con el primer parámetro como el automóvil y el segundo como el cdr. Pero en lugar de imprimir (1 2), da (1 . 2). Volviendo al fragmento de longitud 2, se supone que una lista adecuada termina con la lista vacía, por lo que el cdr de la última celda de contras debería apuntar a la lista vacía. En este caso, la última celda contra señala 2, por lo que Lisp nos informa que tenemos una lista incorrecta, pero aún así nos permite hacerlo, como cómo puede hacer una cadena en C sin un \0.

Longitud 11

(cons 1 ())

Ahora hemos creado nuestra primera lista formada correctamente. Es una sola celda de contras con un auto 1y un cdr de (). Notarás que para cualquier otra lista, lo encabezo con una comilla / marca de retorno; cualquier otra lista adecuada intentaría evaluar su primer argumento como una función con los elementos restantes como parámetros. Estrictamente hablando, ()sin embargo , no es una lista; es un símbolo compuesto por ay (a )que representa la lista vacía. Lisp le permite utilizar casi cualquier carácter imprimible en un nombre de símbolo y le permitirá redefinir cualquier símbolo como desee.

Longitud 12

(cdr `(1 2))

Esto daría salida (2), no 2como algunas personas supondrían. Recuerde, se supone que cada cdr debe apuntar a otra celda de contras oa la lista vacía; obviamente 2no es la lista vacía, por lo que debe ser otra celda contra el auto 2y un cdr de() .

Longitud 13

'#1=(1 . #1#)

Esto produciría una lista circular con solo el valor único 1. Si se imprime, imprimirá "(1 1 1 1 ..." para siempre, de modo que en la práctica se puede considerar una lista infinita (en la que puede hacer cdrinfinitas veces para obtener siempre el mismo resultado, en sí mismo.) A menos que se asigne Ta la variable global *print-circle*, en cuyo caso se imprimirá como #1=(1 . #1#).


¡Esa última edición! Rápido, alguien haga un esolang de los Beatles: D
fede s.

1
@fedes. John McCarthy, Paul McCartney ... el lenguaje se llamará CarthyCartney.
gato

33

GNU Make

Me arriesgaré en este caso. Creo que esta podría ser la primera vez que makeaparece en PPCG.

Factoid

Make puede considerarse un lenguaje funcional.

Longitud 0 fragmento

No creo que se requieran fragmentos de longitud 0, pero aquí hay uno de todos modos. Creo que este podría ser el más útil de todos los programas de longitud 0. Con un Makefile vacío (o incluso ningún makefile), make todavía tiene un montón de reglas integradas. Por ejemplo, hay reglas predeterminadas incorporadas para compilar un archivo .c en un .o o binario, dado que el archivo .c existe en el directorio actual. Entonces si lo hacemos:

make hello.o

make encontrará la regla .c a .o y compilará hello.c para dar hello.o

Del mismo modo si lo hacemos:

make goodbye

Si hay un archivo goodbye.c en el directorio actual, se compilará en el binario goodbye.

Fragmento de longitud 1

TAB

Sí, el personaje TAB. Si bien esto no hace mucho por sí solo, tiene un gran significado en Make. Específicamente, todas las líneas de recetas que siguen una definición de destino en una regla DEBEN comenzar con una TAB. Esto causa todo tipo de frustraciones al depurar archivos MAKE cuando los TAB y los espacios se mezclan.

Fragmento de longitud 2

$@

Esta es una variable automática para usar en recetas. Se expandirá al nombre de archivo del objetivo de la regla. Hay otras variables automáticas útiles .

Fragmento de longitud 3

a:=

La asignación variable más corta, simplemente expandida. La variable a se establece en "" inmediatamente cuando se analiza por primera vez el Makefile. Si, en cambio, lo hacemos a=, entonces la asignación se expande recursivamente, es decir, la expansión se difiere hasta el momento en que se hace referencia a la variable.

Fragmento de longitud 4

W:;w

La especificación de regla completa más breve y marginalmente útil. Esto define un objetivo Wcon una regla que simplemente ejecuta el wcomando de shell. Así

make W

es equivalente a:

w

Esta es una sintaxis de regla alternativa en la que la receta sigue al objetivo en la misma línea separada por una nueva línea. Más comúnmente, las líneas de recetas siguen inmediatamente a una línea objetivo separada, con TABcaracteres que comienzan cada línea de recetas.

Fragmento de longitud 5

$(@D)

Otra variable automática. Similar a $@, pero esto se expande a la parte del directorio de la ruta, con el nombre del archivo y el final / eliminado.


Tal vez algunas funciones de cadena como $(basename )o $(patsubst )? ( p. ej. )
luser droog

32

Maravilloso

Fragmento de longitud 14

}0}1
Mulx
HxHx

Este fragmento muestra algunas bibliotecas más de Marbelous e introduce un nuevo concepto, a saber, tableros de varias celdas. La Mulxplaca toma dos canicas como entrada y produce 2 canicas. Las canicas que ingresan a la celda más a la izquierda del Mulxcorresponderán a los }0dispositivos en esa placa y a la celda más a la derecha }1. Análogamente, las salidas también saldrán de diferentes celdas. El ancho de un tablero se puede calcular ya MAX(1, highest output device + 1, highest input device + 1)que las celdas que no corresponden a un dispositivo de entrada tirarán a la basura cualquier canica que caiga sobre ellas.

Fragmento de longitud 13

7E
??
>Y!!
{0

Este es un tablero que escupirá un carácter ascii imprimible al azar en cada marca. Marbelous tiene dos formas de generar valores aleatorios. Hay una ??que devuelve un valor aleatorio entre 0 y la canica de entrada que recibe, inclusive, y ?n: ?0hasta ?Zrespectivamente. Que actúan muy similar a ??. También tenemos !!qué termina la placa, incluso si no todas las salidas están llenas. ¿Puedes imaginar cómo ?nse podrían implementar los dispositivos como placas en Marbelous ???

Longitud 12 fragmento

}0}1
Fb//
Dp

Aquí vemos algunas funciones de biblioteca de Marbelous en acción. Fbgenera el enésimo número de Fibonacci donde n es la canica de entrada. Dpimprime la canica de entrada en STDOUT como un número decimal. Ambos se implementan en Marbelous y se puede invocar cuando marca incluir bibliotecas en el intérprete en línea , para el intérprete de Python, debe incluir explícitamente cada archivo. La implementación de estos tableros se puede encontrar en github . Tenga en cuenta que este programa en particular toma 2 entradas y llamará a la placa Fibonacci dos veces. Los tableros que se llaman se devuelven dentro de un tic del tablero que los llamó.

Fragmento de longitud 11

}0}0
{<{0{>

Este necesita alguna explicación. Los }0dispositivos son entradas, ya que tienen el mismo número (0), contendrán el mismo valor cuando se llame a esta placa. Los tres dispositivos en la fila inferior son salidas. {<salidas a la izquierda de la placa, {0salidas debajo de la primera celda de la placa y {>salidas a la derecha. La salida solo se empuja cuando se llenan todos los dispositivos de salida distintos. En este caso, sin embargo, nunca se alcanza el dispositivo de salida correcto. El tablero saldrá por falta de actividad y generará los dos valores que tiene de todos modos. ¿Te imaginas cómo se podría implementar/\ como una placa Marbelous?

Fragmento de longitud 10

..40
FF
\\

Hay algunas cosas que juegan un papel importante en Marbelous aquí. En primer lugar, hay una adición. Si trazas el camino de las dos canicas en el tablero, notarás que terminarán en la misma celda al mismo tiempo. Cuando esto suceda, se sumarán. (Dato curioso: en algún momento se consideró que, en lugar de sumarse, las canicas deberían formar una pila). Sin embargo, Marbelous es un lenguaje de 8 bits, por lo que agregar una canica aFF equivale a restar 1 de ella.

Fragmento de longitud 9

00
\\/\]]

Esta es la forma más corta de implementar una versión rudimentaria de cat en Marbelous. 00 \ / \ Es un bucle que pone un 00valor mármol en el]] dispositivo cada segundo tic. Este es un dispositivo STDIN. Cuando una canica cae en este dispositivo, intenta leer el primer carácter de STDIN, si hay uno, se empuja hacia abajo (y en este caso se imprime nuevamente). Si no hay uno, el amrble original se empuja hacia la derecha. (y en este caso basura)

Fragmento de longitud 8

}0
~~
{0

Este fragmento muestra algunas características. Primero toma entrada a través de} 0. En este caso, esta es la placa principal y será reemplazada por la entrada de la línea de comando. También puede llamar a esta función, en ese caso, se tomará el argumento en lugar de la entrada de línea de comando. Luego está ~~, que es un operador bit a bit. Después de eso, llegamos a }0, si todos los }ndispositivos están llenos, estos valores se devuelven como las funciones devuelven valores. (Marbelous admite más de un valor de retorno por función)

Fragmento de longitud 7

00
\\/\

Este es el bucle infinito más compacto que puedes crear en Marbelous. El \\dispositivo empuja cualquier canica hacia la derecha, /\copia una canica y empuja una copia hacia la izquierda y otra hacia la derecha. Dado que el tablero tiene solo dos celdas de ancho, el mármol a la derecha se destruye.

Fragmento de longitud 6

46MB75

Aquí hay un ejemplo de recursión MB(la placa principal nombrada implícitamente recibe una llamada en cada marca, pero no antes de imprimir Fuen STDOUT en cada llamada FuFuFuFuFuFu....

Fragmento de longitud 5

2A
++

Algunos cálculos aritméticos. La canica con valor 2Acae en el primer tic y se encuentra en la ++celda. Este es un operador. Este operador en particular incrementa cualquier canica que caiga sobre él y lo deja caer. El mármol ahora tiene valor 2By se cae del tablero. Esto se imprime +en STDOUT.

Fragmento de longitud 4

:
24

Los dos intérpretes no están de acuerdo aquí, le he dado un nombre a la primera tabla del archivo en este ejemplo (el nombre es una cadena vacía). El intérprete de Python supone que esta es la placa principal y llama a esta placa al ejecutar el programa (que imprime $). El intérprete de JavaScript no encuentra la placa principal y, por lo tanto, no hay punto de entrada. Esto puede ser útil al escribir un archivo de biblioteca para Marbelous.

Fragmento de longitud 3

:Bo

Este es un tablero con nombre, sin cuerpo, podemos llamar a este tablero escribiendo Boen una celda de cualquier tablero (incluido él Bomismo)

Fragmento de longitud 2

3A

Este código es el cuerpo de una placa de celda 1x1 (cada celda tiene dos caracteres de ancho), denominada implícitamente MB(para placa principal). Imprime el valor ascii del valor hexadecimal de 3Acuando la canica se cae del tablero. La salida de este programa resulta ser el código fuente de:

Fragmento de longitud 1

:

Además #, este es uno de los dos únicos programas válidos de 1 personaje en marbelous. #es un indicador de un comentario y, por lo tanto, no es muy interesante. :le dice a Marbelous que estás a punto de declarar una junta. A ninguno de los dos compiladores les importa que usted no nombre o defina la placa. El programa no hace nada.

hecho:

Marbelous fue desarrollado por personas en este sitio, algunos nombres que estaban en la carrera por este idioma eran Rube y simplemente Mármoles .


2
vencerme bonitos fragmentos!
Sparr

su fragmento de longitud 12 parece tomar dos entradas e imprimir dos números de Fibonacci diferentes. fue intencional?
Sparr

@Sparr, sí, fue para mostrar un poco cómo funcionan las funciones en Marbelous.
overactor

tal vez agregar eso a la explicación? por lo que escribió, esperaría que el fragmento tome una entrada y produzca un número de fib.
Sparr

Realmente espero que llegues a 40 puntos para que mi función de Fibonacci encaje ...
Sparr

31

Adelante

Forth tiene solo dos tipos, ints y flotantes (¡y los flotantes son opcionales!) Pero aún así logra tener caracteres, cadenas, entradas largas y largas, punteros, punteros de función, estructuras y más; ¡todo está en cómo lo usas!

Longitud 1

.

El .comando (o "palabra" como lo llamamos) imprime el valor entero en la parte superior de la pila de datos; Si la pila está vacía, aparece un error de tiempo de ejecución. También elimina el valor de la pila: ¡vota a favor para ver cómo podemos conservarlo!

Longitud 2

.s

La .spalabra muestra los valores actualmente en la pila, sin eliminar ninguno de ellos. También muestra el número total de valores. En Gforth, .sestá limitado por defecto a mostrar solo los 9 valores principales; ¿quizás descubriremos cómo mostrar más?

Longitud 3

see

Escriba seeseguido de cualquier palabra Forth para ver el código fuente de esa palabra. La mayoría de las palabras de Forth se definen en el propio Forth, y solo unas pocas primitivas se definen en conjunto.

Longitud 4

1 0=

¿Mencioné que Forth es un lenguaje basado en pila con operadores de postfix? Al escribir 1 0=empuja 1a la pila y luego ejecuta la 0=palabra, que saca el valor superior de la pila y empuja truesi es igual a 0, falsesi no lo hace. 0=es una palabra de conveniencia para 0 =; hay varias palabras abreviadas similares para combinaciones de valor + palabras comunes, como 1+y 0<>. Además, mientras que falseen Forth es 0 y cualquier valor distinto de cero es verdadero, las palabras de prueba incorporadas devuelven trueresultados verdaderos y truevan hasta el final: ¡es el valor con todos los bits establecidos, es decir -1!

Longitud 5

-1 u.

Empuje -1sobre la pila, luego sáquela e imprímala como un entero sin signo. Esto se puede usar para ver rápidamente el valor máximo para un int sin signo en su versión de Forth (¡pero no el valor integral máximo que admite de forma nativa!). Quizás se pregunte: "¿Cómo sabemos cuándo se debe imprimir un int con .y cuándo con u.?" Respuesta: .cuando está firmado, u.cuando no está firmado. "Eso no es lo que quise decir", dices. "¿Cómo sabemos cuándo el valor en la parte superior de la pila está firmado y cuándo no está firmado?" Respuesta: Eres el programador, ¡ese es tu trabajo! Debe saber si cada número entero en la pila representa un int, un int sin signo, un int*, unchar*, un puntero de función u otro, o de lo contrario obtienes los demonios en tu nariz. Forth no te hará un seguimiento de eso; ¿Qué es esto, C?

Longitud 6

." Hi"

Impresiones Hi. ."es una palabra Forth (que, como todas las palabras Forth, debe ir seguida de espacios en blanco o EOF) que lee la secuencia de entrada hacia arriba a través de la siguiente "e imprime los bytes intermedios. Si coloca más de un espacio después del .", ."se imprimirán todos menos el espacio inmediatamente después del . Las secuencias de escape no son compatibles (por lo que no puede imprimir una cadena con una "en ella con ."), pero gforth añade .\"a la lengua, que es compatible con ellos.

Longitud 7

: + - ;

Usted define sus propias palabras en Forth escribiendo dos puntos, el nombre de la palabra, las palabras que desea que se ejecuten y un punto y coma. Una palabra puede ser cualquier secuencia de caracteres que no sean espacios en blanco (el espacio en blanco es cómo Forth dice dónde termina una palabra y comienza otra, después de todo), incluso los signos de puntuación e incluso los operadores (que son solo palabras, después de todo). El fragmento anterior se redefine +para significar -, por lo que ahora cada vez que intentas sumar, restas en su lugar. Las palabras preexistentes que usan +no se ven afectadas, ya que almacenan una referencia a la definición original de +.

Nota: Algunas palabras hacen cosas diferentes dentro de las definiciones de otras palabras que fuera, pero aparte de las estructuras de control, todas son bastante esotéricas. La mayoría de las palabras hacen lo mismo dentro de una definición que fuera, pero a veces esa cosa no es obvia: ¡ : show-see see see ;no hará lo que piensas!

Longitud 8

: 42 - ;

Cuando dije que una palabra podía ser cualquier secuencia de espacios en blanco, me refería a cualquier secuencia. No, Forth no tiene una palabra para cada número individual; los números son solo un poco especiales. Cuando Forth encuentra una secuencia que no es un espacio en blanco, primero ve si es una palabra conocida; si no es así, intenta analizarlo como un número; si eso falla, solo entonces obtienes un error. Definir una palabra que se deletrea igual que un número significa que ya no podrá ingresar esa ortografía del número directamente sin obtener la palabra, pero Gforth y varios otros Forth le brindan múltiples formas de deletrear números de todos modos .

Longitud 9

IF 1 THEN

Finalmente , algo familiar! Obviamente, este código prueba si su argumento 1es verdadero y, si es así, ejecuta lo que está después del THEN, ¿verdad? Incorrecto. Cuando la ejecución alcanza el IF, el valor en la parte superior de la pila se elimina, y si ese valor es verdadero (es decir, distinto de cero), la ejecución continúa con lo que esté dentro IF ... THENy luego lo que esté después de THEN; Si el valor es cero, saltamos directamente a después THEN. Tenga en cuenta que, debido a cómo estas palabras se implementan internamente (¡lo cual es en términos de otras palabras Forth!), IFY THENsolo se pueden usar dentro de una definición de palabra, no en "interpretar estado".

Longitud 12

( x y -- y )

Este es un comentario Va del (al siguiente )inmediatamente después. (En el intérprete, una nueva línea también puede terminarlo). Esto no está "incorporado" a la sintaxis de Forth (¿Hay algo?); (es solo otra palabra, una que descarta todo en la secuencia de entrada hasta la siguiente ). (Así es, Forth puede manipular cómo se lee su código fuente. ¡Perl no es el único lenguaje que no se puede analizar sin ejecutarlo!) Dado que es una palabra, debe seguirlo con un espacio, o Forth se quejará de que (xes indefinido. También podemos redefinir (como parte de nuestra campaña en curso de dispararnos en el pie.

Sin embargo, el contenido del comentario es más interesante. Este comentario especifica el efecto de pila para alguna palabra; la parte a la izquierda de las --listas que debería estar en la parte superior de la pila antes de ejecutar la palabra (la parte superior está a la derecha), y el lado derecho --describe cómo se verá la parte superior de la pila después (nuevamente , la parte superior está a la derecha). La convención común es agregar dicho comentario a la fuente de cualquier palabra que defina, justo después del : namebit, y también hay una convención muy fuerte sobre nombrar elementos de pila para indicar su tipo que incluso es seguido por el estándar .

Por cierto, el efecto de pila que se muestra es para la nippalabra. Debería poder decir lo que hace solo desde el comentario.

Longitud 13

1 2 3 4 d+ d.

Como se indicó anteriormente, el tipo de un valor de Forth depende de cómo lo use: si trata un valor como un puntero, es un puntero, y si ese valor no es un buen puntero, es su culpa tratarlo como uno. Sin embargo, independientemente de qué tipo está tratando un valor, siempre ocupará una celda en la pila de datos; Las excepciones son los enteros de doble celda o doble precisión . Estos son números enteros que están representados por dos valores en la pila, lo que le permite realizar operaciones aritméticas con el doble de bits de lo habitual. La celda más significativa o de bits más altos se coloca encima de la celda menos significativa o de bits más bajos, por lo que 1 0es la representación de doble celda de 1, y0 1es 2 ^ 32 o 2 ^ 64, dependiendo de qué tan grandes sean las celdas regulares de su Forth. Naturalmente, para tratar un valor de doble celda como tal, necesitamos usar palabras que operen explícitamente en valores de doble celda; generalmente son solo d(o udsin signo) seguidos del nombre de la palabra de celda única correspondiente: d+para sumar, d<comparar, d.imprimir, etc.


+1 para Forth. Estaba empezando a buscar idiomas que aún no se habían hecho. Feliz de verlo aquí ya.
mbomb007

2
Además, si alguna vez llegas a +1675, tengo una buena imagen ASCII para imprimir. : D
mbomb007

31

Pyth

Para más fragmentos, publicaré soluciones a los desafíos del golf y un enlace al problema.

Longitud 17:

<ussC,cG\_GUQ*zQQ

Encuentra los primeros ncaracteres de la secuencia infinita formada repitiendo la cadena de entrada para siempre, luego completa los guiones bajos con la secuencia misma y luego repite eso para siempre.

Rellenar los espacios en blanco

Longitud 14:

#QX=Qhf>FT.:Q2

Dada una lista de elementos únicos, ordene la lista intercambiando pares de elementos vecinos, imprimiendo todos los resultados intermedios.

Reorganizar un conjunto de números en orden

Longitud 13:

?hu]+HG_UQYQY

Crear la siguiente estructura: [0, [1, [2, [3]]]].

Inicio en el rango de listas

Longitud 12:

uxyG*HQjvz2Z

Multiplicación XOR.

Multiplicación XOR

Longitud 11:

lfqSzST.:wz

Cuente cuántas subcadenas de la primera palabra son anagramas de la segunda palabra.

Detectar anagramas dentro de una cadena principal

Longitud 9:

fqJjQT_J2

Encuentre la base más baja en la que la entrada es un palíndromo.

Palindrome de base más baja

Longitud 5:

!%lQ1

Compruebe si la entrada es una potencia de 2. Tome la base de registro 2, tome el resultado mod 1 y tome el no lógico.

Compruebe si un número entero es una potencia de 2 sin usar operaciones +, -

Longitud 4:

sjQ2

Calcula el peso de hamming de la entrada sumando la representación de base 2 de la entrada.

Cuente el número de unidades en un entero de 16 bits sin signo

Longitud 3:

^G2

^ en secuencia, int, da el producto cartesiano del primer argumento consigo mismo n veces, donde n es el segundo argumento.

En este caso, dado que Ges el alfabeto ( abcdefghijklmnopqrstuvwxyz), ^G2da las 2 cadenas de letras, a aatravés de zz.

Longitud 2:

lT

l, aunque normalmente sirve como len(), también se puede usar como base de registro 2. Como Tse inicializa la variable 10, esto imprime 3.3219280948873626, base de registro 2 de 10.

Longitud 1:

H

Hes el diccionario vacío (tabla hash) en Pyth, y es la única forma de obtener un diccionario en Pyth, sin usar v(eval) o $(literal de Python).

Hecho:

Pyth no tiene construcciones de varios caracteres que no sean literales. Además, Pyth compila esencialmente uno a uno en Python.


¿Se agregó su factoid antes de tener comandos que comienzan con .?
Leaky Nun

@LeakyNun Sí ..
isaacg
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.