Escribir una función [cerrada]

15

Sinceramente, no puedo creer que este desafío aún no exista.

El reto

Escribe una función.

Los detalles

  • Su programa debe definir algún tipo de función invocable. Esto incluye cualquier cosa comúnmente conocida como función, función lambda o subrutina. Todos estos tipos de llamadas se denominarán "función" en esta publicación.

    1. La entrada a la función es opcional y no es obligatoria.

    2. Un valor de retorno de la función también es opcional y no es obligatorio, pero el control debe volver al programa de llamada.

  • La función debe asignarse a algún tipo de variable para que se pueda acceder más adelante. Esto incluye la asignación indirecta (en la mayoría de los idiomas comunes donde declarar una función nombrada agrega automáticamente el nombre al alcance actual) y la asignación directa (asignar una función anónima a una variable directamente).

  • La función no necesita ser nombrada.

  • La función debe ser creada por usted ; no puede simplemente asignar una función predeterminada del idioma a una variable.

  • Ninguna de las lagunas estándar , por favor.

Este es el , por lo que gana la puntuación más baja en bytes.

conecta tu cargador
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
DJMcMayhem
3
No entiendo por qué esto se volvió a abrir cuando ninguna de las razones por las que se cerró en primer lugar se ha abordado, simplemente oculta por mods en un chat
Jo King
2
Además, ¿desde cuándo puedes votar para reabrir tu propia publicación?
Jo King
77
Debes ser un abogado en lugar de un programador para competir en este desafío.
anatolyg
2
Esto definitivamente no debería haber sido reabierto en su estado actual.
Mego

Respuestas:

30

Código de máquina x86 / x64, 1 byte

c3

Montaje:

ret

Pruébalo en línea! (nasm)

¯ \ _ (ツ) _ / ¯

siete negativo
fuente
2
Pero esto no le da un nombre a la función ni almacena una referencia a la función en una variable.
Tanner Swett
44
@TannerSwett Se puede llamar por dirección.
negativo siete
77
Puede agregar una etiqueta en el ensamblaje. No aumenta el tamaño del código compilado y le da un nombre a la función.
Daniil Tutubalin
21

Jalea , 0 bytes

Pruébalo en línea!

Un enlace monádico que devuelve su argumento. Como es la primera función que aparece en el script, se puede llamar usando 1Ŀ.

Gracias a @lirtosiast por señalar que un enlace / función de 0 bytes funcionaría en Jelly.

Es decir


3,4,5 1Ŀ

Pruébalo en línea!

Nick Kennedy
fuente
La respuesta de 0 bytes debería funcionar.
lirtosiast el
@KevinCruijssen sí! Buen lugar
Nick Kennedy
@NickKennedy Puede usar <pre><code>...</code></pre>para preservar espacios iniciales / finales / nuevas líneas en bloques de código. He editado tu respuesta en consecuencia. :)
Kevin Cruijssen
@KevinCruijssen gracias!
Nick Kennedy el
Mi conocimiento sobre gelatina es bastante escaso, pero ¿no necesitas una nueva línea para finalizar el enlace? Parece ser usado en el ejemplo.
Post Rock Garf Hunter
13

Javascript, 6 bytes

f=_=>0

Incluye asignación variable. No hay mucho que ver aqui.

recursivo
fuente
28
Para que parezca más emoji:o=_=>o
Daniil Tutubalin, el
3
Otro emojid=_=>b
tsh
3
@tsh, por desgracia, bno está definido en este caso.
Daniil Tutubalin
2
@DanielO: Uno ciertamente podría argumentar eso. Pero en mi opinión, uno podría argumentar aún más efectivamente que no se puede llamar, por lo que no es una función. En javascript, una llamada de función se representa inequívocamente entre paréntesis.
recursivo el
2
@DaniilTutubalin Pero esto solo importa si lo invocas. Y no existe tal requisito sobre la función si debe ejecutarse sin lanzar una excepción.
tsh
8

ZX Spectrum BASIC, 6 bytes

DEF FN f()=PI

Hex Dump: CE 66 28 29 3D A7. CEes una palabra clave de 1 byte para DEF FN(incluido el espacio final), mientras que A7es una palabra clave de 1 byte para PI. Llamar usando FN f(). Programa de ejemplo:

  10 PRINT FN f(): DEF FN f()=PI

Salida:

3.1415927
Neil
fuente
8

Haskell , 3 bytes

o=9

Este código define una función polimórfica llamada oque toma un parámetro de tipo y un parámetro de instancia de clase de tipo. Cuando se llama a esta función, toma la instancia de clase de tipo dada, obtiene su fromIntegermiembro, llama a ese miembro con el Integervalor de 9 y devuelve el resultado.

De acuerdo, lo que acabo de describir es simplemente el comportamiento de la función Haskell 9, y mi código simplemente define una función llamada oque es equivalente a 9.

Ahora la única pregunta es, ¿es la 9función "creada por usted" o es "una función predeterminada del idioma"?

Creo que es "creado por ti". Mi razón para decir esto es que si lees la especificación de Haskell, (supongo) no encontrarás ninguna 9función en ninguna parte. En cambio, la especificación establece que puede crear un número literal al unir uno o más dígitos. Por lo tanto, al escribir una cadena de dígitos, he escrito una función, incluso si resulta que solo he usado un dígito.

Tanner Swett
fuente
funciones inteligentes de nivel de tipo
Mega Man
8

R , 9 bytes

body(t)=0

Pruébalo en línea!

Creo que esto cumple con las reglas. La función tno toma entradas y salidas 0. Esto funciona porque ya existe una función llamada t(la función de transposición) y redefine el cuerpo de la función; no funcionaría con say body(a)=0(no se llama ningún objeto a) o body(F)=0( Fes una función lógica, no una). Creo que cumple porque todavía lo creo: no estoy reutilizando lo que hace la función predefinida, simplemente su nombre.

No creo que haya visto esto usado por los golfistas R, pero puede haber situaciones en las que nos permita ahorrar unos pocos bytes en desafíos donde necesitamos una función auxiliar.

Una solución más estándar habría sido:

R , 13 bytes

f=function()0

Pruébalo en línea!

Función que no requiere entradas ni salidas 0. Esto es 1 byte más corto que la función que no toma entrada y no emite nada, lo que sería

f=function(){}

Si tratamos de definir una función sin cuerpo ( f=function()), R interpreta esto como un comando incompleto (esto podría no ser cierto en versiones anteriores de R).

Como señaló OganM, reducimos esto a 11 bytes con

R , 11 bytes

function()0

Pruébalo en línea!

que técnicamente cumple con el requisito de desafío de que la función se asigne a algún tipo de variable, ya que está (efímeramente) asignada .Last.value.

Robin Ryder
fuente
1
function()0debería funcionar para su segunda respuesta ya que la función no necesita ser nombrada. Buen truco body<-, he tratado de usar bodyy hacer algunos de los desafíos extraños para meterse con el idioma
Giuseppe
1
@Giuseppe "La función debe asignarse a algún tipo de variable", por lo que no creo que function()0cumpla con las reglas de este desafío. Me encantaría dar una recompensa por una respuesta que utiliza el body()="truco con éxito.
Robin Ryder
44
function()0se asignaría a .Last.value()pesar de que sería empujar
OganM
@OganM ¡Buen punto!
Robin Ryder
pryr::f(x)si permitimos pryr.
qwr
6

Perl 6 , 5 bytes

$!=!*

Pruébalo en línea!

Crea un lambda Cualquiera que devuelve el valor booleano no de su parámetro y lo asigna a la variable $!.

Jo King
fuente
6

C (gcc) , 5 bytes

Define una función fque no toma argumentos y técnicamente devuelve un valor entero indefinido.

f(){}

Pruébalo en línea!

ErikF
fuente
1
"no toma argumentos" - miente mal. Ese es uno de los malentendidos comunes sobre C: la lista de argumentos vacía significa una cantidad indefinida de argumentos de tipo indefinido sin una forma portátil de acceder a ellos. Como nota al margen, esto también es incompatibilidad C / C ++.
Val dice Reinstate Monica
6

[Wolfram Language (Mathematica)], 1 byte

Este es un poco cuestionable:

f

Define f, que se puede "llamar" f[], por ejemplo , por , que "devuelve" la expresiónf[]

Lukas Lang
fuente
1
Hola, se puede llamar y el valor de retorno es opcional. Esto cuenta
connectyourcharger
1
Si esta solución es aceptable, entonces la respuesta de cero bytes es igual de buena: su "definición" de fno hace nada (aparte de recordar "He visto f") y puede omitirse. No f[]obstante, puede llamar , aún regresando sin evaluar f[]. Sin embargo, en cualquier caso, en su mayoría estás jugando trucos con el reemplazador de patrones y no estás instruyendo para evaluar una función.
Romano
@Roman He considerado agregar la versión de cero bytes, pero al final sentí que es aún más cuestionable: esto realmente crea el símbolo Global`f, mientras que la versión vacía no hace eso (podría argumentar que Nullestá asignado %1, pero Nulles una "función" incorporada). Pero como he señalado en la respuesta, si la solución de un byte es válida tampoco está del todo clara ...
Lukas Lang
5

Adelante (gforth) , 5 bytes

Esta es una función llamada fque no hace nada.

: f ;

Pruébalo en línea

En el código TIO, agregué un pie de página de see f, que imprime la definición de la función.

mbomb007
fuente
5

Lua , 8 bytes

f=load''

Pruébalo en línea!

Define una función (global) f.

Esto usa la loadfunción Lua para compilar una cadena dada que está vacía en nuestro caso (el código vacío es un código válido) en una función que hace exactamente lo que escribimos en su cuerpo: nada.

Para los que se preguntan, la solución estándar sería

function f()end

pero esto es más largo (15 bytes).

val dice reinstalar a Monica
fuente
5

POSIX sh, 6 bytes

s()(1)

El uso de llaves requiere un personaje más.

kojiro
fuente
5

Java, 10 bytes

esto debería coincidir con las reglas del desafío

void f(){}
pixma140
fuente
1
Estoy bastante seguro de que también f=a->a;es válido. :)
Kevin Cruijssen
@Kevin Cruijssen No soy un experto en Java y nunca usé la notación de matriz de Java. ¿Cómo podría hacer que su solución se compile? Inicialmente "probé" mi método en este TIO y luego agregué su enfoque allí. Ahora, el compilador espera un identificador. ¿Alguna explicación o uso incorrecto por mi parte?
pixma140
2
Es una función lambda de Java 8+. Entonces, cualquiera de estos dos funcionaría en este caso. Aquí una explicación más profunda de Java 8+ lambdas en caso de que aún no esté familiarizado con ellas.
Kevin Cruijssen
4

Kotlin , 8 bytes

val f={}

Una función vacía almacenada en una variable f.
Llámalo usando f()o f.invoke().

Peïo THIBAULT
fuente
4

C (gcc) , 14 13 bytes

(*f)()=L"Ã";

Pruébalo en línea!

Esto define una función que fdevuelve inty acepta un número no especificado (y tipo) de parámetros, cuyo código de máquina está contenido dentro del literal de cadena. El carácter unicode Ã(almacenado en la memoria como 0xc3 0x00 0x00 0x00en una pequeña máquina endian) corresponde a la retinstrucción x86 que regresa de la función. Las arquitecturas que no son x86 pueden requerir diferentes códigos de operación para regresar.

gccpuede requerir la -zexecstackbandera para evitar un defecto de seguridad.

techo
fuente
3

Tcl , 6 5 11 bytes

set f {_ ;}

Pruébalo en línea!

Incluyendo la asignación a la variable f como parte del bytecount para cumplir con las reglas. Con este cambio, la definición más convencional a continuación vincula la anterior para bytecount:

proc f _ {}
SmileAndNod
fuente
¿Es esta una función con nombre? La función debe asignarse a algún tipo de variable para que se pueda acceder más adelante.
mbomb007
@ mbomb007 veo su punto, y lo arreglé en consecuencia
SmileAndNod
3

XSLT, 134 bytes

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template name="a"></xsl:template></xsl:stylesheet>

Una plantilla es lo más parecido que tiene este lenguaje a una función. Definitivamente se puede llamar; toma cero argumentos y "devuelve" la cadena vacía.

Silvio Mayolo
fuente
3

Python 3 , 10 bytes

f=lambda:0

Pruébalo en línea!

U10-Adelante
fuente
¿No puedes hacer def f():0para guardar un byte?
EdgyNerd
@EdgyNerd Dat respondió ante mí con ese código, y no quiero copiarlo
U10-Adelante
Oh ok, no importa entonces
EdgyNerd
3

Pascal 23bytes

procedure A;begin end;
rnso
fuente
2

AppleScript, 10

on a()
end

Explicación, compilación e inclusión de invocación:

on a()    -- declare event handler "a"
end a     -- end declaration

-- invoke it:
a()
un arácnido de
fuente
2

Japt , 2 bytes

_

Llamado como $U ($.

_puede ser reemplazado con @, Ïo È.

Intentalo

Encarnación de la ignorancia
fuente
2

SmileBASIC (> = 3), 9 bytes

DEF A
END

La función es llamada por A.

caracol_
fuente
Alternativamente DEF A*ENDen SB4
12Me21
2

Wolfram Language (Mathematica) , 2 bytes

#&

Pruébalo en línea!

Desafortunadamente, simplemente &no funciona (una función anónima que no hace nada).

Romana
fuente
Debe guardar la función en una variable de acuerdo con las reglas, p. Ej. f=#&
Lukas Lang
@LukasLang se guarda automáticamente, por %1lo que no hay necesidad de una asignación explícita a una variable como f.
Romano
Buen punto, eso debería ser suficiente para cumplir con las reglas
Lukas Lang