Bir işlev yazma [kapalı]


15

Dürüst olmak gerekirse, bu zorluğun henüz mevcut olmadığına inanamıyorum.

Meydan okuma

Bir işlev yazın.

Ayrıntılar

  • Programınız bir tür çağrılabilir işlev tanımlamalıdır. Bu, bir işlev, bir lambda işlevi veya bir altyordam olarak bilinen herhangi bir şeyi içerir. Tüm bu tür callables bu yazıda "işlev" olarak anılacaktır.

    1. Fonksiyona giriş isteğe bağlıdır ve gerekli değildir.

    2. İşlevden bir dönüş değeri de isteğe bağlıdır ve gerekli değildir, ancak denetim çağıran programa geri dönmelidir.

  • Daha sonra erişilebilmesi için fonksiyonun bir çeşit değişkene atanması gerekir. Buna dolaylı atama (adlandırılmış bir işlevin bildirilmesinin adı geçerli kapsama otomatik olarak eklediği en yaygın dillerde) ve doğrudan atama (doğrudan bir değişkene anonim bir işlev atama) dahildir.

  • İşlevin adlandırılması gerekmez.

  • İşlev sizin tarafınızdan oluşturulmalıdır - dilden bir değişkene yalnızca varsayılan bir işlev atayamazsınız.

  • Standart boşlukların hiçbiri lütfen.

Bu , yani bayt en düşük puanı kazanır.


Yorumlar uzun tartışmalar için değildir; bu görüşme sohbete taşındı .
James

3
İlk etapta kapatılma nedenlerinden hiçbiri ele alınmadığında neden yeniden açıldığını anlamıyorum, sadece bir sohbetteki modlar tarafından gizlendi
Jo King

2
Ayrıca, ne zamandan beri kendi yazı yeniden açmak için oy?
Jo Kral

7
Bu mücadelede yarışabilmek için bir programcı yerine avukat olmanız gerekiyor.
anatolyg

2
Bu kesinlikle mevcut durumunda yeniden açılmamış olmalıdır.
Mego

Yanıtlar:



21

Jöle , 0 bayt

Çevrimiçi deneyin!

Argümanını döndüren monadik bir bağlantı. Komut dosyasında görünen ilk işlev olduğundan, kullanılarak çağrılabilir 1Ŀ.

@Lirtosiast, Jelly'de 0 baytlık bir bağlantının / işlevin çalışacağına işaret ettiği için teşekkürler.

yani


3,4,5 1Ŀ

Çevrimiçi deneyin!


0 bayt yanıtı çalışmalıdır.
lirtosiast

@KevinCruijssen evet! İyi nokta
Nick Kennedy

@NickKennedy <pre><code>...</code></pre>Kod bloklarındaki önde gelen / sondaki boşlukları / satırsonlarını korumak için kullanabilirsiniz . Cevabınızı buna göre düzenledim. :)
Kevin Cruijssen

@KevinCruijssen teşekkürler!
Nick Kennedy

Jöle bilgim oldukça zayıf ama bağlantıyı sonlandırmak için yeni bir satıra ihtiyacınız yok mu? Örnekte kullanılmış gibi görünüyor.
Rock Garf Hunter Post

13

Javascript, 6 bayt

f=_=>0

Değişken ataması içerir. Burada görmek için fazla bir şey yok.


28
Daha emoji benzeri görünmesini sağlamak için:o=_=>o
Daniil Tutubalin

3
Başka bir emojid=_=>b
tsh

3
@tsh, ne yazık ki, bbu durumda tanımlanmamıştır.
Daniil Tutubalin

2
@DanielO: Bunu kesinlikle iddia edebiliriz. Ama bence, daha fazla etkili bir şekilde onu arayamayacağınızı iddia edebilirsiniz, bu yüzden bu bir işlev değildir. Javascript'te, bir işlev çağrısı parantezle açıkça temsil edilir.
özyinelemeli

2
@DaniilTutubalin Ama bu sadece onu çağırırsanız önemlidir. Ve bir istisna atmadan çalışıp çalışmayacağı konusunda böyle bir gereklilik yoktur.
tsh


8

ZX Spectrum BASIC, 6 bayt

DEF FN f()=PI

Hex dökümü: CE 66 28 29 3D A7. CEiçin 1 baytlık bir anahtar kelimedir DEF FN(sondaki boşluk dahil) ve A71 baytlık bir anahtar kelimedir PI. Kullanarak arayın FN f(). Örnek program:

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

Çıktı:

3.1415927

8

Haskell , 3 bayt

o=9

Bu kod, bir otype parametresi ve bir typeclass örnek parametresi alan bir polimorfik işlevi tanımlar . Bu işlev çağrıldığında, verilen typeclass örneğini alır, fromIntegerüyesini alır, bu üyeyiInteger 9 değeriyle ve sonucu döndürür.

Verdiğim gibi, sadece tarif ettiğim sadece Haskell işlevinin davranışıdır 9ve kodum sadece buna oeşdeğer olan bir işlevi tanımlar9 .

Şimdi tek soru, 9 "sizin tarafınızdan yaratılan" işlev mi yoksa "dilden varsayılan bir işlev mi?"

Bence "sizin tarafınızdan yaratıldı". Bunu söylememin sebebi, Haskell için şartnameyi okursanız, (hiçbir 9yerde) bir fonksiyondan bahsetmeyeceğinizdir . Bunun yerine, belirtim, bir veya daha fazla basamağı birleştirerek bir sayı değişmez değeri oluşturabileceğinizi belirtir. Bu nedenle, bir rakam dizesi yazarak, bir fonksiyon yazdım - sadece bir rakam kullansam bile.


zeki, tip seviyesi fonksiyonları
Mega Man

8

R , 9 bayt

body(t)=0

Çevrimiçi deneyin!

Bunun kurallara uygun olduğunu düşünüyorum. İşlev tgiriş ve çıkış almaz 0. Bu zaten çalışır t(transpozisyon fonksiyonu) denilen bir fonksiyon var ve fonksiyonun gövdesini yeniden tanımlıyor; demekle body(a)=0(çağrılan bir nesne yok a) veya body(F)=0(F mantıksal, işlev değil) ile çalışmaz. Bence hala benim tarafımdan yaratıldığını düşünüyorum: Önceden tanımlanmış fonksiyonun ne yaptığını tekrar kullanmıyorum, sadece adı.

Bunu R golfçüler tarafından kullanıldığını hiç sanmıyorum, ancak bir yardımcı fonksiyona ihtiyacımız olan zorluklarda birkaç bayt kurtarmamıza izin veren durumlar olabilir.

Daha standart bir çözüm:

R , 13 bayt

f=function()0

Çevrimiçi deneyin!

Giriş ve çıkış almayan işlev 0. Bu, girdi almayan ve hiçbir şey çıkaran fonksiyondan 1 byte daha kısadır.

f=function(){}

Body ( f=function()) içermeyen bir işlev tanımlamaya çalışırsak , R bunu tamamlanmamış bir komut olarak yorumlar (bu, R'nin eski sürümlerinde doğru olmayabilir).

OganM'ın işaret ettiği gibi, bunu 11 bayta indiriyoruz

R , 11 bayt

function()0

Çevrimiçi deneyin!

bu, teknik olarak, işleve (geçici olarak) atandığı için bir tür değişkene atanmış olma zorunluluğu gereksinimine uygundur .Last.value.


1
function()0işlevin adlandırılması gerekmediğinden ikinci cevabınız için çalışmalıdır. Düzgün hile, body<-kullanmaya çalıştım bodyve benzeri dil ile uğraşmak için bazı garip zorluklar yapmaya çalıştım
Giuseppe

1
@Giuseppe "İşlev bir çeşit değişkene atanmalıdır", bu yüzden function()0bu zorluğun kurallarına uygun olduğunu düşünmüyorum . body()="Hile başarıyla kullanan bir cevap için bir lütuf vermek için mutlu olurdu .
Robin Ryder

4
function()0bu .Last.value()itmek olsa atanır
OganM

@OganM Güzel nokta!
Robin Ryder

pryr::f(x)eğer pryr'a izin verirsek.
qwr


6

C (gcc) , 5 bayt

Bağımsız fdeğişken almayan ve teknik olarak tanımsız bir tamsayı değeri döndüren bir işlevi tanımlar .

f(){}

Çevrimiçi deneyin!


1
"hiçbir argüman alır" - kötü yalan söylüyor. Bu, C: boş argüman listesi ile ilgili yaygın yanlış anlaşılmalardan biri, bunlara erişmek için taşınabilir bir yol olmadan tanımsız miktarda tanımsız tür argümanı anlamına gelir. Bir sidenote olarak, bu aynı zamanda C / C ++ uyumsuzluğudur.
val diyor Reinstate Monica


6

[Wolfram Dili (Mathematica)], 1 bayt

Bu biraz tartışmalıdır:

f

fÖrneğin "tarafından" çağrılabilen f[], ifadeyi "döndüren" tanımlarf[]


1
Hey, çağrılabilir ve dönüş değeri isteğe bağlıdır. Bu önemlidir.
connectyourcharger

1
Bu çözüm kabul edilebilirse, sıfır bayt yanıtı da iyidir: "tanımınız" fhiçbir şey yapmaz ("Gördüğüm f" hatırlamak dışında ) ve dışarıda bırakılabilir. Sen diyebilirsin f[]hala unevaluated dönen, yine de f[]. Ancak, her durumda, çoğunlukla desen değiştiriciyle hileler oynuyorsunuz ve bir işlevi değerlendirmek için talimat vermiyorsunuz.
Roman

Ben sıfır bayt sürümünü ekleyerek kabul ama sonunda bunu daha da şüpheli gibi hissettim @Roman: bu aslında bir işareti oluşturuyor Global`fboş versiyonu olduğu (eğer iddia olabilir yapmaz iken, Nullatanan %1, ancak Nullbir yerleşik bir "işlev"). Ama cevapta belirttiğim gibi, bir bayt çözümünün geçerli olup olmadığı da tamamen açık değil ...
Lukas Lang


5

Lua , 8 bayt

f=load''

Çevrimiçi deneyin!

Bir (global) işlev tanımlar f.

Bu, loadbizim durumumuzda boş olan (boş kod geçerli koddur) tam olarak vücudunda yazdıklarımızı yapan fonksiyona derlemek için Lua işlevini kullanır : hiçbir şey.

Merak edenler için standart çözüm

function f()end

ancak bu daha uzun (15 bayt).


5

POSIX sh, 6 bayt

s()(1)

Kıvırcık parantez kullanmak bir karakter daha gerektirir.


5

Java, 10 Bayt

bu meydan okuma kurallarına uymalıdır

void f(){}

1
Eminim f=a->a;de geçerli. :)
Kevin Cruijssen

@Kevin Cruijssen Java uzmanı değilim ve asla Java dizi gösterimini kullanmadım. Çözümünüzün derlenmesini nasıl sağlayabilirim? Başlangıçta yöntemimi bu TIO'da "test ettim" ve ardından yaklaşımınızı oraya ekledim . Şimdi, derleyici bir tanımlayıcı bekliyor. Herhangi bir açıklama veya yanlış kullanım?
pixma140

2
Java 8+ lambda fonksiyonudur. Yani bu ikisinden biri bu durumda işe yarar. Henüz bilmiyorsanız Java 8+ lambdas'ın daha derinlemesine bir açıklaması .
Kevin Cruijssen


4

Kotlin , 8 bayt

val f={}

Değişken f'de depolanan boş bir işlev. Veya
tuşunu kullanarak arayın .f()f.invoke()



4

C (gcc) , 14 13 bayt

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

Çevrimiçi deneyin!

Bu , makine kodu dizgi değişmezi içinde yer alan, belirtilmemiş sayıda (ve tür) parametre fdöndüren intve kabul eden bir işlevi tanımlar . Unicode karakter Ã( 0xc3 0x00 0x00 0x00küçük bir endian makinesinde olduğu gibi bellekte saklanır ) retişlevden dönen x86 komutuna karşılık gelir . X86 olmayan mimariler geri dönmek için farklı opcode (kodlar) gerektirebilir.

gcc-zexecstackbayrağın bir segfaulttan kaçınmasını gerektirebilir .



3

Tcl , 6 5 11 bayt

set f {_ ;}

Çevrimiçi deneyin!

Kurallara uymak için bayt hesabının bir parçası olarak f değişkenine atamayı dahil etmek. Bu değişiklikle birlikte, aşağıdaki daha geleneksel tanım yukarıdaki ifadeyi bayt hesabı için bağlar:

proc f _ {}

Bu adlandırılmış bir işlev mi? Daha sonra erişilebilmesi için fonksiyonun bir çeşit değişkene atanması gerekir.
mbomb007

@ mbomb007 Ben senin noktasını görmek ve buna göre sabit
SmileAndNod

3

XSLT, 134 bayt

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

Şablon, bu dilin bir işleve en yakın olanıdır. Kesinlikle çağrılabilir; sıfır argüman alır ve boş dizeyi "döndürür".






2

AppleScript, 10

on a()
end

Açıklanması, derlenmesi ve çağrılması dahil:

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

-- invoke it:
a()


2

SmileBASIC (> = 3), 9 bayt

DEF A
END

İşlev tarafından çağrılır A.


Alternatif DEF A*ENDolarak SB4
12Me21

2

Wolfram Dili (Mathematica) , 2 bayt

#&

Çevrimiçi deneyin!

Ne yazık ki, sadece &çalışmıyor (hiçbir şey yapmayan anonim bir işlev).


İşlevi kurallara göre bir değişkene kaydetmeniz gerekir, örneğinf=#&
Lukas Lang

@LukasLang otomatik olarak kaydedilir, %1böylece gibi bir değişken için açık bir atamaya gerek yoktur f.
Roman

İyi bir nokta, kuralları yerine getirmek için yeterli olmalı
Lukas Lang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.