Написать функцию [закрыто]

15

Я, честно говоря, не могу поверить, что этот вызов еще не существует.

Соревнование

Напишите функцию.

Специфика

  • Ваша программа должна определить какую-то вызываемую функцию. Это включает в себя все, что обычно называют функцией, лямбда-функцией или подпрограммой. Все эти типы вызовов будут называться «функцией» в этом посте.

    1. Вход в функцию необязателен и не обязателен.

    2. Возвращаемое значение из функции также необязательно и не требуется, но управление должно возвращаться в вызывающую программу.

  • Функция должна быть присвоена некоторой переменной, чтобы к ней можно было получить доступ позже. Это включает в себя косвенное назначение (в большинстве распространенных языков, где объявление именованной функции автоматически добавляет имя в текущую область) и прямое назначение (назначение анонимной функции переменной напрямую).

  • Функция не должна быть названа.

  • Функция должна быть создана вами - вы не можете просто назначить функцию по умолчанию из языка для переменной.

  • Ни одной из стандартных лазеек , пожалуйста.

Это , поэтому выигрывает самая низкая оценка в байтах.

connectyourcharger
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
DJMcMayhem
3
Я не понимаю, почему это было вновь открыто, когда ни одна из причин, по которой он был закрыт в первую очередь, не была устранена, просто скрыта модами в чате
Джо Кинг
2
Кроме того, с каких это пор вы сможете проголосовать, чтобы открыть свой пост?
Джо Кинг,
7
Вы должны быть юристом, а не программистом, чтобы участвовать в этом соревновании.
Анатолий
2
Это определенно не должно было быть вновь открыто в его нынешнем состоянии.
Мего

Ответы:

30

машинный код x86 / x64, 1 байт

c3

Монтаж:

ret

Попробуйте онлайн! (NASM)

¯ \ _ (ツ) _ / ¯

минус семь
источник
2
Но это не дает функции имя и не сохраняет ссылку на функцию в переменной.
Таннер Светт
4
@TannerSwett Может быть вызван по адресу.
отрицательное семь
7
Вы можете добавить ярлык в сборку. Он не увеличивает размер скомпилированного кода и дает имя функции.
Даниил Тутубалин
21

Желе , 0 байт

Попробуйте онлайн!

Монадическая ссылка, которая возвращает свой аргумент. Так как это первая функция, которая появляется в скрипте, ее можно вызвать с помощью1Ŀ .

Спасибо @lirtosiast за указание на то, что 0-байтовая ссылка / функция будет работать в Jelly.

Т.е.


3,4,5 1Ŀ

Попробуйте онлайн!

Ник Кеннеди
источник
Ответ 0 байт должен работать.
lirtosiast
@KevinCruijssen да! Хорошее место
Ник Кеннеди
@NickKennedy Вы можете использовать, <pre><code>...</code></pre>чтобы сохранить начальные / конечные пробелы / переводы строк в кодовых блоках. Я отредактировал ваш ответ соответственно. :)
Кевин Круйссен
@KevinCruijssen спасибо!
Ник Кеннеди
Мои знания желе довольно тонкие, но вам не нужен перевод строки, чтобы закончить ссылку? Похоже, что используется в примере.
Пост Рок Гарф Хантер
13

Javascript, 6 байт

f=_=>0

Включает назначение переменных. Не так много, чтобы увидеть здесь.

рекурсивный
источник
28
Чтобы это выглядело как смайлики:o=_=>o
Даниил Тутубалин
3
Другой смайликовd=_=>b
TSH
3
@tsh, увы, bв этом случае не определяется.
Даниил Тутубалин
2
@DanielO: Конечно, можно утверждать, что. Но, на мой взгляд, можно даже более эффективно утверждать, что это нельзя назвать, так что это не функция. В javascript вызов функции однозначно представлен в скобках.
рекурсивный
2
@DaniilTutubalin Но это имеет значение, только если вы вызываете его. И нет такого требования к функции, должна ли она работать без исключения.
TSH
8

ZX Spectrum BASIC, 6 байтов

DEF FN f()=PI

Hex дамп: CE 66 28 29 3D A7. CE1-байтовое ключевое слово для DEF FN(включая завершающий пробел), а A71-байтовое ключевое слово для PI. Звоните используя FN f(). Пример программы:

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

Выход:

3.1415927
Нил
источник
8

Haskell , 3 байта

o=9

Этот код определяет полиморфную вызываемую функцию, oкоторая принимает один параметр типа и один параметр экземпляра класса типов. Когда эта функция вызывается, она принимает данный экземпляр класса типов, получает своего fromIntegerчлена, вызывает этого члена сInteger значением 9 и возвращает результат.

Конечно, то, что я только что описал, - это просто поведение функции Haskell 9, а мой код просто определяет вызываемую функцию, oкоторая эквивалентна9 .

Теперь единственный вопрос, это 9 функция «создана вами» или «функция по умолчанию из языка»?

Я думаю, что это «создано вами». Я хочу сказать, что если вы прочитаете спецификацию для Haskell, вы (я полагаю) нигде не найдете упоминания о 9функции. Вместо этого в спецификации говорится, что вы можете создать числовой литерал, соединив одну или несколько цифр. Поэтому, написав строку цифр, я написал функцию - даже если бы я использовал только одну цифру.

Таннер Светт
источник
умный, функции уровня типа
Mega Man
8

R , 9 байт

body(t)=0

Попробуйте онлайн!

Я думаю, что это соответствует правилам. Функция не tтребует ввода и вывода 0. Это работает, потому что уже существует функция, называемая t(функция транспонирования), и она переопределяет тело функции; он не будет работать с скажем body(a)=0(объект не вызывается a) или body(F)=0( Fлогический, а не функция). Я думаю, что это соответствует, потому что это все еще создано мной: я не повторно использую то, что делает предопределенная функция, просто ее имя.

Я не думаю, что я когда-либо видел это, используемое игроками в R, но могут быть ситуации, когда это позволяет нам сэкономить несколько байтов на задачах, когда нам нужна вспомогательная функция.

Более стандартное решение было бы:

R 13 байт

f=function()0

Попробуйте онлайн!

Функция, которая не требует ввода и вывода 0. Это на 1 байт короче, чем функция, которая не принимает никакого ввода и ничего не выводит, что было бы

f=function(){}

Если мы попытаемся определить функцию без body ( f=function()), R интерпретирует это как неполную команду (это может быть не так в более старых версиях R).

Как указывает OganM, мы уменьшаем это до 11 байтов с

R 11 байт

function()0

Попробуйте онлайн!

что технически соответствует требованию вызова, чтобы функция была назначена некоторой переменной, так как она (эфемерно) назначена .Last.value.

Робин Райдер
источник
1
function()0должен работать для вашего второго ответа, так как функция не должна быть названа. Аккуратный трюк body<-, я пытался использовать bodyи тому подобное, чтобы решить некоторые странные проблемы, связанные с языком
Джузеппе
1
@Giuseppe «Функция должна быть назначена некоторой переменной», так что я не думаю, что она function()0соответствует правилам этой задачи. Я был бы рад получить награду за ответ, который body()="успешно использует трюк.
Робин Райдер
4
function()0будет назначен, .Last.value()хотя это будет толкать его
OganM
@OganM Отличный момент!
Робин Райдер
pryr::f(x)если мы позволим pryr.
qwr
6

Perl 6 , 5 байт

$!=!*

Попробуйте онлайн!

Создает любую лямбду, которая возвращает логическое значение не своего параметра, и назначает ее переменной $!.

Джо Кинг
источник
6

C (GCC) , 5 байтов

Определяет функцию, fкоторая не принимает аргументов и технически возвращает неопределенное целочисленное значение.

f(){}

Попробуйте онлайн!

ErikF
источник
1
«не принимает аргументов» - плохо врет. Это одно из распространенных недоразумений в C: пустой список аргументов означает неопределенное количество аргументов неопределенного типа без переносимого способа доступа к ним. Как примечание, это также несовместимость C / C ++.
говорит
6

Пробел , 7 байт


  

	

Создает подпрограмму, которая возвращает управление вызывающей стороне.

Объясняется в контексте:

[N
S S N
_Create_Label][N
T   N
_Return]

Попробуйте онлайн!

каменная паукообразная
источник
6

[Wolfram Language (Mathematica)], 1 байт

Это немного сомнительно:

f

Определяет f, который можно «вызвать», например, с помощью f[]которого «возвращает» выражениеf[]

Лукас Ланг
источник
1
Эй, это можно вызвать, и возвращаемое значение не является обязательным. Это считается
connectyourcharger
1
Если это решение приемлемо, то ответ с нулевым байтом так же хорош: ваше «определение» fничего не делает (кроме запоминания «Я видел»).f ») и может быть опущено. Вы можете позвонить, f[]тем не менее, возвращая без оценки f[]. Тем не менее, в любом случае вы в основном играете с трюком с заменителем шаблона и не поручаете оценить функцию.
Роман
@Roman Я подумал о добавлении версии с нулевым байтом, но в конце я почувствовал, что это еще более сомнительно: это фактически создает символ Global`f , а пустая версия не делает этого (вы можете возразить , что Nullприсваивается %1, но Nullэто встроенная «функция»). Но, как я уже отмечал в ответе, действительность однобайтового решения также не совсем ясна ...
Лукас Ланг,
5

Forth (gforth) , 5 байтов

Это функция с именем f, которая ничего не делает.

: f ;

Попробуйте онлайн

В коде TIO я добавил нижний колонтитул see f, который печатает определение функции.

mbomb007
источник
5

Луа , 8 байт

f=load''

Попробуйте онлайн!

Определяет (глобальную) функцию f.

Это использует loadфункцию Lua для компиляции заданной строки, которая в нашем случае оказывается пустой (пустой код является допустимым кодом), в функцию, которая делает именно то, что мы написали в ее теле: ничего.

Для тех, кто интересуется, стандартное решение будет

function f()end

но это длиннее (15 байт).

Валь говорит восстановить Монику
источник
5

POSIX ш, 6 байт

s()(1)

Использование фигурных скобок требует еще одного символа.

Кодзиро
источник
5

Java, 10 байт

это должно соответствовать правилам испытания

void f(){}
pixma140
источник
1
Я уверен, что f=a->a;это действительно так. :)
Кевин Круйссен
@Kevin Cruijssen Я не эксперт по Java и никогда не использовал нотацию массива Java. Как я могу сделать ваше решение скомпилированным? Сначала я «проверил» мой метод в этом TIO, а затем добавил туда свой подход. Теперь компилятор ожидает идентификатор. Любое объяснение или неправильное использование мной?
pixma140
2
Это лямбда-функция Java 8+. Так что любой из этих двух будет работать в этом случае. Вот более подробное объяснение лямбды Java 8+ на тот случай, если вы еще не знакомы с ними.
Кевин Круйссен
4

Котлин , 8 байт

val f={}

Пустая функция хранится в переменной f.
Назовите это используя f()или f.invoke().

Peïo THIBAULT
источник
4

C (gcc) , 14 13 байтов

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

Попробуйте онлайн!

Это определяет функцию, fвозвращающую intи принимающую неопределенное число (и тип) параметров, машинный код которых содержится в строковом литерале. Символ Unicode Ã(хранится в памяти как0xc3 0x00 0x00 0x00 на машине с прямым порядком байтов) соответствует retинструкции x86, которая возвращается из функции. Для архитектуры, отличной от x86, для возврата могут потребоваться другие коды операции.

gccможет потребоваться -zexecstackфлаг, чтобы избежать сегфоута.

ceilingcat
источник
3

Tcl , 6 5 11 байт

set f {_ ;}

Попробуйте онлайн!

Включая присваивание переменной f как части байта для соответствия правилам. С этим изменением более традиционное определение ниже связывает приведенное выше определение bytecount:

proc f _ {}
SmileAndNod
источник
Это именованная функция? Функция должна быть присвоена некоторой переменной, чтобы к ней можно было получить доступ позже.
mbomb007
@ mbomb007 Я понял вашу точку зрения и исправил ее соответствующим образом
SmileAndNod
3

XSLT, 134 байта

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

Шаблон - самая близкая вещь, которую этот язык имеет к функции. Это определенно можно назвать; он принимает нулевые аргументы и «возвращает» пустую строку.

Сильвио Майоло
источник
3

Python 3 , 10 байт

f=lambda:0

Попробуйте онлайн!

U10-Forward
источник
Вы не можете просто сделать, def f():0чтобы сохранить байт?
EdgyNerd
@EdgyNerd Dat ответил передо мной этим кодом, и я не хочу его копировать
U10-Форвард
Ну ладно, неважно тогда
EdgyNerd
2

AppleScript, 10

on a()
end

Объяснили, скомпилировали и включили вызов:

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

-- invoke it:
a()
камень паукообразный
источник
2

SmileBASIC (> = 3), 9 байт

DEF A
END

Функция вызывается A.

snail_
источник
Альтернативно DEF A*ENDв SB4
12Me21
2

Wolfram Language (Mathematica) , 2 байта

#&

Попробуйте онлайн!

К сожалению, просто &не работает (анонимная функция, которая ничего не делает).

Роман
источник
Вам нужно сохранить функцию в переменной в соответствии с правилами, например,f=#&
Лукас Ланг,
@LukasLang автоматически сохраняется в нем, %1поэтому нет необходимости в явном назначении такой переменной, как f.
Роман
Хороший момент, этого должно быть достаточно, чтобы выполнить правила
Лукас Ланг