Записати функцію [закрито]


15

Я, чесно кажучи, не можу повірити, що цього виклику вже не існує.

Змагання

Написати функцію.

Специфіка

  • Ваша програма повинна визначити якусь функцію дзвінка. Сюди входить все, що зазвичай називається функцією, лямбда-функцією або підпрограмою. Усі ці типи дзвінків в цій публікації будуть називатися "функцією".

    1. Введення функції не є обов'язковим і не потрібно.

    2. Повернене значення функції також не є обов'язковим і не потрібно, але управління повинно повертатися до програми виклику.

  • Функція повинна бути присвоєна певній змінній, щоб отримати доступ до неї пізніше. Це включає непряме присвоєння (у більшості поширених мов, коли оголошення названої функції автоматично додає ім'я до поточної області) та пряме призначення (присвоєння анонімної функції безпосередньо змінній).

  • Функцію не потрібно називати.

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

  • Жодна зі стандартних лазів , будь ласка.

Це , тому найнижчий бал виграє в байтах.


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Джеймс

3
Я не розумію, чому це було відновлено, коли жодна з причин його закриття в першу чергу не була адресована, просто прихована модами в чаті
Jo King,

2
Крім того, коли ви можете проголосувати за повторне відкриття власної посади ??
Jo King

7
Щоб змагатись у цьому виклику, вам потрібно бути юристом, а не програмістом.
anatolyg

2
Це, безумовно, не повинно було відкриватися в його нинішньому стані.
Мего

Відповіді:


30

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

c3

Збірка:

ret

Спробуйте в Інтернеті! (насм)

¯ \ _ (ツ) _ / ¯


2
Але це не дає імені функції і не зберігає посилання на функцію в змінній.
Tanner Swett

4
@TannerSwett Його можна викликати за адресою.
негативно сім

7
Ви можете додати мітку в зборі. Він не збільшує розмір складеного коду, а дає функції ім'я.
Даніїл Тутубалін

21

Желе , 0 байт

Спробуйте в Інтернеті!

Монадійне посилання, яке повертає свій аргумент. Оскільки це перша функція, що з’являється в сценарії, її можна викликати за допомогою 1Ŀ.

Дякуємо @lirtosiast за те, що він вказав, що посилання / функція 0 байтів буде працювати в Jelly.

Тобто


3,4,5 1Ŀ

Спробуйте в Інтернеті!


Відповідь 0 байт має працювати.
lirtosiast

@KevinCruijssen так! Гарне місце
Нік Кеннеді

@ NickKennedy Ви можете використовувати <pre><code>...</code></pre>для збереження провідних / кінцевих пробілів / нових рядків у кодових блоках. Я відповідно відредагував вашу відповідь. :)
Kevin Cruijssen

@KevinCruijssen дякую!
Нік Кеннеді

Мої знання про желе досить тонкі, але вам не потрібен новий рядок, щоб закінчити посилання? Це, здається, використовується в прикладі.
Опублікувати Rock Garf Hunter

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. CE- це 1-байтове ключове слово для DEF FN(включаючи пробіл), а A7ключове слово - 1 байт PI. Дзвінок за допомогою FN f(). Приклад програми:

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

Вихід:

3.1415927

8

Хаскелл , 3 байти

o=9

Цей код визначає поліморфну ​​функцію, oяка називається, яка приймає параметр одного типу та один екземпляр типу typeclass. Коли ця функція викликається, вона приймає даний екземпляр typeclass, отримує свого fromIntegerчлена, називає цей член зі Integerзначенням 9 та повертає результат.

Зрозуміло, що я щойно описав - це лише поведінка функції Haskell 9, і мій код просто визначає функцію, яку називають oрівносильною 9.

Тепер питання лише в тому, чи 9функція "створена вами", чи це "функція за замовчуванням з мови"?

Я думаю, що це "створено вами". Моя причина сказати це в тому, що якщо ви прочитаєте специфікацію для Haskell, ви (я припускаю) 9ніде не згадаєте про функцію. Натомість у специфікації зазначено, що ви можете створити числовий літерал, з'єднавши одну чи кілька цифр. Тому, написавши рядок цифр, я записав функцію - навіть якщо я просто так вжив лише одну цифру.


розумні, функції рівня рівня
Mega Man

8

R , 9 байт

body(t)=0

Спробуйте в Інтернеті!

Я думаю, що це відповідає правилам. Функція tне приймає входів і виходів 0. Це працює, тому що вже існує функція, яка називається t(функція транспозиції), і вона визначає тіло функції; він би не працював з say 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)якщо ми дозволимо прир.
qwr


6

C (gcc) , 5 байт

Визначає функцію, fяка не бере аргументів і технічно повертає невизначене ціле значення.

f(){}

Спробуйте в Інтернеті!


1
"не бере аргументів" - лежить погано. Це одне з поширених непорозумінь щодо C: порожній список аргументів означає невизначений обсяг аргументів невизначеного типу без портативного способу доступу до них. Це як невідповідність C / C ++.
Вал каже:


6

[Мова Вольфрама (Mathematica)], 1 байт

Це трохи сумнівно:

f

Визначає f, що можна "викликати", наприклад, за допомогою f[], який "повертає" виразf[]


1
Гей, це можна назвати, а повернене значення необов’язково. Це враховується.
connectyourcharger

1
Якщо це рішення прийнятне, то відповідь з нульовим байтом настільки ж хороша: ваше "визначення" fнічого не робить (крім запам'ятовування "я бачив f") і може бути залишене. Ви можете зателефонувати f[], все-таки повертаючись неоціненими f[]. Однак у будь-якому випадку ви здебільшого граєте в трюки із замінювачем шаблону і не вказуєте оцінювати функцію.
Роман

@Roman Я розглядав питання про додавання нульової версії байта, але врешті-решт я відчув, що це ще сумнівніше: це фактично створює символ Global`f, тоді як порожня версія цього не робить (можна стверджувати, що Nullпризначено %1, але Nullце вбудована "функція"). Але, як я зазначив у відповіді, чи єдине байтове рішення є дійсним, також не зовсім зрозуміло ...
Лукас Ленг


5

Луа , 8 байт

f=load''

Спробуйте в Інтернеті!

Визначає (глобальну) функцію f .

Для цього використовується Lua load функція функцію для компіляції заданого рядка, який у нашому випадку виявляється порожнім (порожній код є дійсним кодом) у функцію, яка робить саме те, що ми написали в його тілі: нічого.

Для тих, хто цікавиться, стандартним рішенням було б

function f()end

але це довше (15 байт).


5

POSIX sh, 6 байт

s()(1)

Використання фігурних брекетів потребує ще одного символу.


5

Java, 10 байт

це повинно відповідати правилам виклику

void f(){}

1
Я впевнений, що f=a->a;також діє. :)
Kevin Cruijssen

@Kevin Cruijssen Я не знавець Java, і ніколи не використовував позначення масиву Java. Як я можу зробити ваше рішення складанням? Я спочатку "перевірив" свій метод у цій TIO, а потім додав до вас свій підхід. Тепер компілятор очікує ідентифікатора. Будь-яке пояснення чи неправильне використання мною?
pixma140

2
Це лямбда-функція Java 8+. Тож будь-яке з цих двох працювало б у цьому випадку. Ось більш детальне пояснення лямбд Java 8+, якщо ви ще не знайомі з ними.
Кевін Кройсейсен


4

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

val f={}

Порожня функція, що зберігається у змінній f.
Зателефонуйте за допомогою f()або f.invoke().



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 {_ ;}

Спробуйте в Інтернеті!

Including the assignment to the variable f as part of the bytecount to comply with rules. With this change, the more conventional definition below ties the one above for bytecount:

proc f _ {}

Is this a named function? The function must be assigned to some sort of variable so that it is possible to be accessed at a later time.
mbomb007

@mbomb007 I see your point, and fixed it accordingly
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>

A template is the closest thing this language has to a function. It can definitely be called; it takes zero arguments and "returns" the empty string.






2

AppleScript, 10

on a()
end

Explained, compiled, and including invocation:

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

-- invoke it:
a()



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.