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


15

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

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

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

Специфика

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

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

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

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

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

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

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

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


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
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

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

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

f(){}

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


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


6

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

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

f

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


1
Эй, это можно вызвать, и возвращаемое значение не является обязательным. Это считается
connectyourcharger

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

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


5

Луа , 8 байт

f=load''

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

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

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

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

function f()end

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


5

POSIX ш, 6 байт

s()(1)

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


5

Java, 10 байт

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

void f(){}

1
Я уверен, что f=a->a;это действительно так. :)
Кевин Круйссен

@Kevin Cruijssen Я не эксперт по Java и никогда не использовал нотацию массива Java. Как я могу сделать ваше решение скомпилированным? Сначала я «проверил» мой метод в этом TIO, а затем добавил туда свой подход. Теперь компилятор ожидает идентификатор. Любое объяснение или неправильное использование мной?
pixma140

2
Это лямбда-функция Java 8+. Так что любой из этих двух будет работать в этом случае. Вот более подробное объяснение лямбды Java 8+ на тот случай, если вы еще не знакомы с ними.
Кевин Круйссен




4

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

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

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

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

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



3

Tcl , 6 5 11 байт

set f {_ ;}

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

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

proc f _ {}

Это именованная функция? Функция должна быть присвоена некоторой переменной, чтобы к ней можно было получить доступ позже.
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>

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








2

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

DEF A
END

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


Альтернативно DEF A*ENDв SB4
12Me21

2

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

#&

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

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


Вам нужно сохранить функцию в переменной в соответствии с правилами, например,f=#&
Лукас Ланг,

@LukasLang автоматически сохраняется в нем, %1поэтому нет необходимости в явном назначении такой переменной, как f.
Роман

Хороший момент, этого должно быть достаточно, чтобы выполнить правила
Лукас Ланг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.