Faktoringi Bulun!


74

Negatif olmayan bir tamsayı faktörü bulan en kısa programı veya işlevi oluşturun .

İle temsil edilen faktöriyel !olarak tanımlanır

n!:={1n=0n(n1)!n>0

Düz İngilizce'de, 0'ın faktörü 1'dir ve n'nin 0'dan büyük olduğu durumlarda n'nin faktörü, n'den küçük olanın faktörüdür.

Kodunuz standart yöntemler kullanarak giriş ve çıkış yapmalıdır.

Gereksinimler:

  • Faktoringi hesaplayabilen herhangi bir yerleşik kütüphaneyi kullanmaz (bu, herhangi bir biçimini içerir eval)
  • 125'e kadar sayılar için faktoriyalleri hesaplayabilir
  • 0 sayısı için faktörü hesaplayabilir (1'e eşit)
  • 125'e kadar rakamlar için bir dakikadan az sürede tamamlar

En kısa teslim, kazandığı zaman en çok oy alan cevabı kazandığında kazanır.


10
Verilen cevapların kaç tanesi aslında 125'e kadar hesaplanabilir! tamsayı taşması olmadan? Bu şartlardan biri değil miydi? Üstel yaklaşımlar olarak sonuçlar kabul edilebilir mi (yani 125! = 1.88267718 × 10 ^ 209)?
Ami,

6
@SHiNKiROU, hatta golfscript 125 yönetebilir! saniyenin 1 / 10'undan az ve o da yorumlanmış tercüme dil!
gnibbler

5
@ugoren iki karakterli çözümü diğer soruya yerleşik bir faktoring işlevi kullanır. Bu zorlamanın bu versiyonunda buna izin verilmiyor.
Michael Stern,

4
Bir dakikadan daha az bir sürede tamamlanması çok donanım bağımlı bir gereksinim gibi görünüyor. Hangi donanımda bir dakikanın altında bir sürede tamamlanır ?
sergiol,

4
@sergiol Son 2 yılda hiç sorun yaşamadım, çoğu dilde bir dakikadan daha kısa sürede halledebileceğinden şüpheleniyorum.
Kevin Brown

Yanıtlar:


66

Golfscript - 12 karakter

{,1\{)*}/}:f

Golfscript - Factorial'ı adım adım tanıma

İşte golf senaryosunu öğrenmeye çalışanlar için bir şeyler. Önkoşul golfcript ile ilgili temel bir anlayış ve golfcript belgelerini okuma yeteneğidir.

Bu yüzden yeni araç golf senaryomuzu denemek istiyoruz . Basit bir şeyle başlamak her zaman iyidir, bu yüzden faktoring ile başlıyoruz. İşte basit bir emir sözde kodunu temel alan ilk deneme:

# pseudocode: f(n){c=1;while(n>1){c*=n;n--};return c}
{:n;1:c;{n 1>}{n c*:c;n 1-:n;}while c}:f

Boşluk nadiren golfscript'te kullanılır. Beyaz alandan kurtulmanın en kolay yolu farklı değişken isimleri kullanmaktır. Her belirteç değişken olarak kullanılabilir ( sözdizimi sayfasına bakın). Değişkenler gibi özel karakterler olarak Faydalı jetonlar kullanmak |, &, ?kodda başka yerde kullanılan genel bir şey değil -. Bunlar her zaman tek karakter belirteçleri olarak ayrıştırılır. Buna karşılık, gibi değişkenler nsonradan yığına bir sayı itmek için bir boşluk gerektirir. Sayılar temelde önceden başlatılmış değişkenlerdir.

Her zaman olduğu gibi, nihai sonucu etkilemeden değiştirebileceğimiz ifadeler olacak. Golfscript, her şey hariç doğru olarak değerlendirilir 0, [], ""ve {}(bkz bu ). Burada loop çıkış koşulunu basitçe değiştirebiliriz {n}(ek bir süre döngü kurar ve n = 0 olduğunda sonlandırırız).

Herhangi bir dilde golf oynamak gibi, mevcut fonksiyonları bilmek de yardımcı olur. Neyse ki liste golfscript için çok kısa. Başka bir karakter kaydetmek 1-için değişebiliriz (. Şu anda kod şöyle gözüküyor: ( eğer istiyorsak, başlangıç 1yerine |bırakacak olursak , burada yerine kullanabilirdik .)

{:n;1:|;{n}{n|*:|;n(:n;}while|}:f

En kısa çözümleri elde etmek için yığını iyi kullanmak önemlidir (pratik uygulama uygulaması). Genel olarak, değerler yalnızca küçük bir kod segmentinde kullanılıyorsa, bunları değişkenlere depolamak gerekli olmayabilir. Çalışan ürün değişkenini kaldırarak ve sadece yığını kullanarak, oldukça fazla karakter kaydedebiliriz.

{:n;1{n}{n*n(:n;}while}:f

İşte düşünecek başka bir şey var. Değişkeni ndöngü gövdesinin sonundaki yığından kaldırıyoruz , ancak hemen sonra itiyoruz. Aslında, döngü başlamadan önce onu da yığından kaldırırız. Onun yerine yığını bırakmalıyız ve döngü koşulunu boş tutabiliriz.

{1\:n{}{n*n(:n}while}:f

Belki de değişkeni tamamen ortadan kaldırabiliriz. Bunu yapmak için, değişkeni her zaman yığında tutmamız gerekir. Bu, durum kontrolünün sonunda yığındaki değişkenin iki kopyasına ihtiyacımız olduğu anlamına gelir, böylece kontrolden sonra kaybetmemeliyiz. Bu 0, döngü sona erdikten sonra yığında bir yedekli olacağımız anlamına gelir , ancak bu düzeltilmesi kolaydır.

Bu bizi optimal whiledöngü çözümümüze yönlendirir!

{1\{.}{.@*\(}while;}:f

Şimdi hala bunu kısaltmak istiyoruz. Açık hedef, kelime olmalı while. Belgelere bakıldığında, iki uygun seçenek vardır - açılmak ve yapmak . Alınacak farklı rota seçenekleriniz olduğunda, her ikisinin de faydalarını deneyin ve tartın. Açılmak 'hemen hemen bir döngü' olduğundan, bir tahmin olarak 5 karakteri while4'e indireceğiz /. Gelince do, while3 karakter kesiyoruz ve iki veya iki bloğu birleştiriyoruz, ki bu bir veya iki karakter daha kaydedebiliyor.

Aslında bir dodöngü kullanmanın büyük bir dezavantajı var . Koşul kontrolü, vücut bir kez yürütüldükten sonra yapıldığından, değeri 0yanlış olacaktır, bu nedenle bir if ifadesine ihtiyacımız olabilir. Şimdi, açılma işleminin daha kısa olduğunu söyleyeyim (sonunda bazı çözümler sunulur do). Devam et ve dene, elimizde olan kodun minimum bir değişikliğe ihtiyacı var.

{1\{}{.@*\(}/;}:f

Harika! Bizim çözümümüz artık çok kısa ve burada işimiz bitti değil mi? Hayır! Bu 17 karakter ve J 12 karakterden oluşuyor. Asla yenilgiyi kabul etme!


Şimdi düşünüyorsun ... özyinelemeyle

Özyinelemeyi kullanmak dallanma yapısını kullanmamız gerektiği anlamına gelir . Talihsiz, ancak faktoring özlü bir şekilde özyinelemeli olarak ifade edilebildiğinden, bu yinelemeye uygulanabilir bir alternatif gibi görünüyor.

# pseudocode: f(n){return n==0?n*f(n-1):1}
{:n{n.(f*}1if}:f # taking advantage of the tokeniser

Eh bu kolaydı - özyinelemeyi daha önce denemiş olsaydık, bir whiledöngü kullanmaya bile bakmamış olabilirdik ! Yine de, sadece 16 karakterdeyiz.


Diziler

Diziler genellikle iki şekilde oluşturulur - [ve ]karakterlerini kullanarak veya ,işlevini kullanarak. Yığının en üstünde bir tamsayı ile çalıştırılırsa ,, bu uzunluktaki bir diziyi arr [i] = i ile döndürür.

Dizileri yinelemek için üç seçeneğimiz var:

  1. {block}/: ittir, engelle, ittir, engelle, ...
  2. {block}%: [push, block, push, block, ...] (bunun bazı nüansları vardır, örneğin ara değerler istiflerden önce yığından çıkarılır)
  3. {block}*: ittir, ittir, engelle, ittir, engelle, ...

Golfscript belgelerinin {+}*bir dizinin içeriğini toplamak için kullanma örneği vardır . Bu {*}*, bir dizinin ürününü almak için kullanabileceğimizi gösteriyor .

{,{*}*}:f

Ne yazık ki, o kadar basit değil. Tüm elemanlar birer birer kapalıdır ( [0 1 2]yerine [1 2 3]). {)}%Bu sorunu düzeltmek için kullanabiliriz .

{,{)}%{*}*}:f

Pek iyi değil. Bu sıfırı doğru işlemez. Bunu düzeltmek için (n + 1)! / (N + 1) 'i hesaplayabiliriz, bunun maliyeti çok fazladır.

{).,{)}%{*}*\/}:f

Aynı zamanda n = 0'ı n = 1 ile aynı kovada işlemeyi deneyebiliriz. Bu, yapmak, denemek ve mümkün olan en kısa sürede çalışmak için son derece kısa bir gerçektir.

Pek iyi değil 7 karakter, sıralama edilir: [1\]$1=. Bu sıralama tekniğinin bir sayıya sınırlar koymak gibi faydalı amaçları olduğunu unutmayın (örneğin, [[0 \ 100] $ 1 =)
İşte kazanan, sadece 3 karakterli:.! +

Artış ve çarpmayı aynı blokta yapmak istiyorsak, dizideki her eleman üzerinde yinelemeliyiz. Bir dizi oluşturmadığımızdan, bu {)*}/bizi kullanmamız gerektiği anlamına gelir , bu da bizi faktoringin en kısa golf senaryo uygulamasına götürür! 12 karakter uzunluğunda, bu J ile bağlantılı!

{,1\{)*}/}:f


Bonus çözümler

ifBir dodöngü için basit bir çözümle başlamak :

{.{1\{.@*\(.}do;}{)}if}:f

Bundan bir kaç tane daha alabiliriz. Biraz karışık, bu yüzden bu işlerin işe yarayacağına inanmalısın. Bunları anladığınızdan emin olun.

{1\.!!{{.@*\(.}do}*+}:f
{.!{1\{.@*\(.}do}or+}:f
{.{1\{.@*\(.}do}1if+}:f

Daha iyi bir alternatif, (n + 1)! / (N + 1) 'i hesaplamaktır, bu da bir ifyapıya olan ihtiyacı ortadan kaldırır .

{).1\{.@*\(.}do;\/}:f

Ancak buradaki en kısa doçözüm, 0'dan 1'e eşlemek için birkaç karakter ve kendi başına başka her şeyi alır - bu nedenle dallara ihtiyacımız yoktur. Bu tür bir optimizasyonun kaçırılması son derece kolaydır.

{.!+1\{.@*\(.}do;}:f

İlgilenenler için, yukarıda belirtilen uzunluktaki birkaç özyinelemeli özyinelemeli çözüm burada verilmektedir:

{.!{.)f*0}or+}:f
{.{.)f*0}1if+}:f
{.{.(f*}{)}if}:f

* not: Aslında bu yazıda kod parçalarının çoğunu test etmedim, bu nedenle hata olup olmadığını bildirmekten çekinmeyin.


8
İlginçtir, bir spoilerde kod kullanırken spoiler etiketlemesinde bir hata gibi görünüyor ... Meta'dan bahsetmek isteyen var mı?
Ivo Flipse,

5
Golfscript'in - bir golf dili - çok harfli değişken isimlerine izin vermesini ve gerekli boşluklarla 1 harf kullanmanızın "cezalandırmasını"
ilginç buluyorum

44

Haskell, 17

f n=product[1..n]

2
Haskell bilmiyorum ... Ama bu 0 için faktör hesaplar olacak
Kral

11
@ Kral: evet olacak. [1..0] ==> []veproduct [] ==> 1
JB

5
Sorunun yasakladığı "yerleşik kütüphaneyi" kullandığını iddia ediyorum. Yine de, diğer yöntem f 0=1;f n=n*f$n-1de 17 karakterdir.
eternalmatt

5
@eternalmatt: kısıtlamaların bu kısmı bana göre belirtilmiştir. Her ikisi de product, yani, (*)ya da (-)"faktoringi hesaplayabilir", ve hepsi Prelude ile tanımlanır. Neden biri havalı değil diğeri olsun ki?
JB,

2
@YoYoYonnY: Daha az (öznel) okunabilirlik için 17 karakter de sayarım. IMHO yorumlarda sorun yok.
JB,

41

Python - 27

Basitçe:

f=lambda x:0**x or x*f(x-1)

22
İyi hile: 0**x.
Alexandru

Ne hakkında math.factorial? Bu yerleşik değil, değil mi?

1
Faktör hesaplamak için kod yazmadığınız gibi, bir yerleşik olarak sayar @ JackBates.
FlipTack

1
Biri bana arkasındaki numarayı söyleyebilir 0**xmi?
Pavitra

1
@Pavitra: 0 0 = 1 ve bu değerlendiren ilk şey geri döndü. Diğer herhangi bir n için, 0 n = 0'dır, böylece birinci işlenen veya falseydir, öyle ki ikinci işlenen değerlendirilir.
Mega Man

29

APL (4)

×/∘⍳

Anonim bir işlev olarak çalışır:

    ×/∘⍳ 5
120

Bir isim vermek istiyorsanız, 6 karakter:

f←×/∘⍳

APL konuşamıyorum, burada neler oluyor?
Michael Stern,

@MichaelStern: yani bir indeks vektörü yapar ⍳5olduğunu 1 2 3 4 5. ×(açıkçası) çarpma, /azaltma ve fonksiyon bileşimidir. Yani, ×/∘⍳tartışmayı alan xve sayıların çarpımını veren bir fonksiyondur [1..x].
marinus

Ah, @ Yves Klett'in Mathematica çözümündeki yaklaşımın aynısı. Çok hoş.
Michael Stern,

@NBZ: Bu soru yazıldığı zaman 2011'de ya da 2012'de bu cevabı yazdığımda mevcut değildi. Trenler sadece 2014 yılında çıkan Dyalog 14.0'a eklenmiştir.
marinus

19

J (12)

J'de standart bir tanım:

f=:*/@:>:@i.

125 için 1 saniyeden az!

Örneğin:

 f 0
 1
 f 5
 120
  f 125x
 1882677176888926099743767702491600857595403
 6487149242588759823150835315633161359886688
 2932889495923133646405445930057740630161919
 3413805978188834575585470555243263755650071
 31770880000000000000000000000000000000

neden sadece * /> değil: i. ?
Andbdrew

Çünkü OP bir işlev ister ve J'de yapabileceğimizin en iyisini bir fiil tanımlamaktır.
Eelvex

2
Bunun isimsiz bir fonksiyon olmamasının bir nedeni yok mu? Gibi ([:*/1+i.)10 sayı veya parantez yalnızca için gerekli olan hatta 8 için çağrıda değil tanımı için, fonksiyon.
jpjacobs

Sonuncusunda, f 125xne yapar x? Özel bir numara mı?
Cyoce

@Cyoce, evet, genişletilmiş hassas tamsayı.
Eelvex

17

Golfscript - 13 karakter (SYM)

işlevi tanımlar !

{),()\{*}/}:!             # happy robot version \{*}/ 

alternatif 13 karakter sürümü

{),()+{*}*}:! 

tüm program sürümü 10 karakterdir

~),()+{*}*

test durumları 1/10 saniyeden daha kısa sürer:

giriş:

0!

çıktı

1

giriş

125!

çıktı

188267717688892609974376770249160085759540364871492425887598231508353156331613598866882932889495923133646405445930057740630161919341380597818883457558547055524326375565007131770880000000000000000000000000000000

1
Sembolik golf girişi için +1! Keşke birden fazla kez oy kullanabilseydim. :-D
Chris Jester-Young,

@ ChrisJester-Young Sizin için yapacağım.
Cyoce

13

Perl 6: 13 karakter

$f={[*]1..$_}

[*]Haskell'e ile aynıdır productve 1..$_1 ila sayım olan $_argüman.


2
Artık bir boşluk kullanmamaya izin verilmiyor [*]("Arka arkaya iki terim" hata mesajından).
Konrad Borowski,

Bir değişken ayarlamanıza gerek yoktur; çıplak bir kod bloğu, dolaylı olarak bir işlev oluşturduğu için kabul edilebilir bir cevaptır. Ayrıca bu hala 0 için çalışıyor mu?
Phil H,

10

Matlab, 15

f=@(x)prod(1:x)

Test Kılıfları

>> f(0)
ans =
     1
>> f(4)
ans =
    24
>> tic,f(125),toc
ans =
  1.8827e+209
Elapsed time is 0.000380 seconds.

10

Python, 28 bayt

f=lambda x:x/~x+1or x*f(x-1)

(Alexandru'nun çözümüne dayanarak)


9

MATL , 2 bayt

:p

Açıklaması:

:    % generate list 1,2,3,...,i, where i is an implicit input
p    % calculate the product of of all the list entries (works on an empty list too)

Çevrimiçi deneyin!


10
: Ç
Andras Deak

Tam olarak bunu gönderecektim :-) Kodu ve bir örnek girişi içerecek bağlantıyı değiştirmek isteyebilirsiniz
Luis Mendo

Emrettiğiniz gibi Lordum.
kusur,

4
@AndrasDeak, Hayır, 1'den 1'e kadar olan tüm sayıları
çıktıracak

8

Yakut - 21 karakter

f=->n{n>1?n*f[n-1]:1}

Ölçek

irb(main):009:0> f=->n{n>1?n*f[n-1]:1}
=> #<Proc:0x25a6d48@(irb):9 (lambda)>
irb(main):010:0> f[125]
=> 18826771768889260997437677024916008575954036487149242588759823150835315633161
35988668829328894959231336464054459300577406301619193413805978188834575585470555
24326375565007131770880000000000000000000000000000000

8

Java, 85 Karakter

BigInteger f(int n){return n<2?BigInteger.ONE:new BigInteger(""+n).multiply(f(n-1));}

1
Bu, ithalatı kaçırır: import java.math.*;(yani, +19 bayt).
Olivier Grégoire

Doğru tespit. ............
st0le

7

PostScript, 26 karakter

/f{1 exch -1 1{mul}for}def

Örnek:

GS> 0 f =
1
GS> 1 f =
1
GS> 8 f =
40320

Fonksiyonun kendisi sadece 21 karakter alır; Gerisi onu bir değişkene bağlamaktır. Bir bayttan tasarruf etmek için, bir rakam da böyle bir rakamla bağlanabilir:

GS> 0{1 exch -1 1{mul}for}def
GS> 8 0 load exec =
40320

1
Ghostscript 125'i kaldıramaz! 34'ten fazla bir şey! olarak çıkıyor 1.#INF. (X64 Windows için derlenmiş stok GNU Ghostscript 9.0.7 kullandım.)
Ross Presser

7

JavaScript, 25

function f(n)!n||n*f(n-1)

CoffeeScript, 19

f=(n)->!n||n*f(n-1)

İade truen = 0 durumunda, ancak JavaScript yine 1'e o tip-zorlamak olacaktır.


returnJavaScript işlevinde bir ifadeye ihtiyacınız yok mu?
Justin Morgan,

Güncelleme: Kutsal duman, bir ihtiyacınız yokreturn ! Ama neden olmasın?
Justin Morgan,

JavaScript 1.8'dir ( developer.mozilla.org/en/new_in_javascript_1.8 ). Tam açıklama, yalnızca Firefox'ta çalışır!
Casey Chu

1
Nice, Javascript 1.8 için iade beyannamesi dışında olduğumu bilmiyordum. Ayrıca, aynı uzunluk koduna sahip n = 0 durum için doğruluk yerine 1'i de garanti edebilirsiniz: function f(n)n?n*f(--n):1
Briguy37

10
ES6, 17: f=n=>!n||n*f(n-1)Al, CoffeeScript!
Ry-

6

Yakut - 30 29 karakter

def f(n)(1..n).inject 1,:*end

Ölçek

f(0) -> 1
f(5) -> 120

1
endDoğrudan :*yeni bir çizgi veya noktalı virgül olmadan doğrudan koyabilirsiniz .
sepp2k

1
#İnject aramasına 1 iletmeye gerek yok. (1..10).inject :*# => 3628800
Dogbert

1
@Dogbert, peki ya ne için f(0)?
Nemo157

@ Nemo157, ah! Bunu unuttum.
Dogbert

4
Daha kısa 1.9 lambda sözdizimini kullanımı: f=->n{(1..n).inject 1,:*}. İle ara f[n].
Michael Kohl

6

F #: 26 karakter

F # 'da dahili ürün işlevi yoktur, ancak bir katlama ile yapabilirsiniz

let f n=Seq.fold(*)1{1..n}

6

Bakış açınıza bağlı olarak C #, 20 veya 39 karakter

Geleneksel bir örnek yöntem olarak (39 karakter; burada test edilmiştir ):

double f(int x){return 2>x?1:x*f(x-1);}

Bir lambda ifadesi olarak (20 karakter, ancak feragatnameye bakın; burada test edilmiştir ):

f=x=>2>x?1:x*f(x-1);

Kullanmalıyız doubleçünkü 125! == 1.88 * 10 209 , bundan çok daha yüksek ulong.MaxValue.

Lambda versiyonunun karakter sayımı hakkında sorumluluk reddi:

Bir C # lambda içinde özyinelemede, açıkça lambda'yı kendi adını vermesi için adlandırılmış bir değişkende saklamanız gerekir. Ancak (örn.) JavaScript'in aksine, kendinden referanslı bir lambda ilan edilmiş ve önceki bir satırda başlatılmış olmalıdır . Fonksiyonu, değişkeni bildirdiğiniz ve / veya başlattığınız aynı ifadede çağıramazsınız.

Başka bir deyişle, bu işe yaramıyor :

Func<int,double> f=x=>2>x?1:x*f(x-1); //Error: Use of unassigned local variable 'f'

Ancak bu yapar :

Func<int,double> f=null;            
f=x=>2>x?1:x*f(x-1);  

Bu kısıtlamanın iyi bir nedeni yoktur, çünkü fçalıştığı sırada atanamaz. Func<int,double> f=null;Çizginin gerekliliği, C # tuhaflığıdır. Bunun karakter sayısında görmezden gelmeyi adil yapıp yapmadığı okuyucuya aittir.

CoffeeScript, 21 gerçek 19 karakter

f=(x)->+!x||x*f x-1

Burada test edildi: http://jsfiddle.net/0xjdm971/


6

Brachylog , 7 6 bayt

Bir aralık oluşturarak ve çarparak

Max () işlevini kullanma fikri olan ovs'a -1 bayt tank

;1⌉⟦₁×

açıklama

;1          --  If n<1, use n=1 instead (zero case)
  ⟦₁        --      Construct the range [1,n]
    ×       --      return the product of said range

Çevrimiçi deneyin!


Brachylog , 10 9 bayt

yineleme

≤1|-₁↰;?×

açıklama

            --f(n):
≤1          --  if n ≤ 1: return 1
|           --  else:
 -₁↰        --      f(n-1)
    ;?×     --            *n

Çevrimiçi deneyin!


1
Bu 6 bayt için çalışıyor. Girişin tekil olarak alınmasına varsayılan olarak izin verilir.
ovs

@ovs teşekkürler. Fakat ;bunun yerine kullanmak ,sadece normal bir sayısal girişe izin verir. Yine de
-1

5

C (39 karakter)

double f(int n){return n<2?1:n*f(n-1);}

3
Güzel. Ancak bazı karakterleri kaydedebilirsiniz: double f(n){return!n?1:n*f(n-1);}- 33 karakter.
ugoren

2
f(125)taşacak
jkabrg 14:15

4

D: 45 Karakterler

T f(T)(T n){return n < 2 ? 1 : n * f(n - 1);}

Daha okunaklı olmak:

T f(T)(T n)
{
    return n < 2 ? 1 : n * f(n - 1);
}

Bir soğutucu (daha uzun versiyon olsa da) hepsini derleme zamanında yapan ( 64 karakter ) ayarlanmış olandır :

template F(int n){static if(n<2)enum F=1;else enum F=n*F!(n-1);}

Daha okunaklı olmak:

template F(int n)
{
    static if(n < 2)
        enum F = 1;
    else
        enum F = n * F!(n - 1);
}

Eponymous şablonları olsa oldukça güzel, bu yüzden gerçekten kod golf çok iyi kullanamazsınız. D zaten kod sayımı için oldukça zayıf olması için karakter sayısı açısından yeterince ayrıntılı ( gerçekte daha büyük programlar için genel program boyutunu küçültmede gerçekten de iyi). Bu benim en sevdiğim dil, bu yüzden GolfScript'in hoşuna gitmeye zorlanmış olsa bile, kod golfünde ne kadar iyi yapabileceğimi görmeyi deneyebilirim.


3
boşlukları çıkar ve 36 karaktere indirgeyebilirsin
cırcır

@Cyoce Açıklayabilir misiniz?
YoYoYonnY

Siteye Hoşgeldiniz @ user272735. Burada iyileştirmeler yapmak için insanların çözümlerini düzenlemediğimizi unutmayın. Bunun yerine, mandal ucube yukarıda olduğu gibi, bu gelişmeleri öneren yorumlar bırakıyoruz.
Shaggy

4

PowerShell - 36

naif:

filter f{if($_){$_*(--$_|f}else{1}}

Ölçek:

> 0,5,125|f
1
120
1,88267717688893E+209

4

Scala, 39 karakter

def f(x:BigInt)=(BigInt(1)to x).product

Karakterlerin çoğu, BigIntbunların kullanılmasını sağlar, böylece 125'e kadar olan değerler için gereksinimler karşılanır.


Bazı kısa seçenekler:(x:Int)=>(BigInt(1)to x).product def f(x:Int)=(BigInt(1)to x).product def f(x:BigInt)=(x.to(1,-1)).product def f(x:BigInt)=(-x to-1).product.abs
LRLucena 7:16

4

Javascript, ES6 17

f=n=>n?n*f(n-1):1

ES6:

  • Ok işlevi

Eğer doğru hatırlıyorsam ve bu nedenle uygun olamıyorsam ES6 bu mücadeleden daha genç.
lirtosiast

Koşullu işleci ile garip smth var. Neden iki tane kolon var?
Qwertiy

@ Qwertiy Haklısınız, bu bir yazım hatası oldu, teşekkürler.
Afonso Matos

4

PowerShell, 42 bayt

( işlev yerine filtre kullanarak 2 karakter kaydedildi )

filter f($x){if(!$x){1}else{$x*(f($x-1))}}

Çıktı:

PS C:\> f 0
1
PS C:\> f 5
120
PS C:\> f 1
1
PS C:\> f 125
1.88267717688893E+209

1
Bu şimdi çok eski, ama ... if / else: 'i ters çevirerek 1 karakter daha kazanabilirsiniz filter f($x){if($x){$x*(f($x-1))}else{1}}. Ve bir filtre olduğundan (örneğin 125|f) boru hattı üzerinden çağrılırsa 36 karaktere daha da düşürülebilir :filter f{if($_){$_*($_-1|f)}else{1}}
Andrew

4

Raket (şema) 40 35 29 bayt

0 hesaplar! 1 olmak ve 125 hesaplar! Zamanlayıcıya göre 0 saniye içinde Düzenli özyinelemeli yaklaşım

(define(f n)(if(= n 0)1(* n(f(- n 1)))))

Ortak lisp'ı yenmek için yeni sürüm: Bir listenin tüm öğelerini çarpar (bu Haskell çözümüyle aynı)

(λ(n)(apply *(build-list n add1)))

Diğer şema çözümünü yenmek için yeni sürüm ve uygulama yerine foldl kullanarak ve buildlist yerine range kullanarak diğer raket çözümünü matematikle eşleştirin

(λ(n)(foldl * n(range 1 n)))

4

Mornington Crescent , 1827 1698 karakter

Bugün yeni bir dil öğrenmek istemiştim ve bu benim indiğim şeydi ... (Neden bunu kendime yapıyorum?) Bu giriş herhangi bir ödül kazanamayacak, aynı dil!

Take Northern Line to Bank
Take Central Line to Holborn
Take Piccadilly Line to Heathrow Terminals 1, 2, 3
Take Piccadilly Line to Acton Town
Take District Line to Acton Town
Take District Line to Parsons Green
Take District Line to Bank
Take District Line to Parsons Green
Take District Line to Acton Town
Take District Line to Hammersmith
Take Circle Line to Aldgate
Take Circle Line to Aldgate
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Aldgate
Take Circle Line to Hammersmith
Take District Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Acton Town
Take District Line to Acton Town
Take District Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Parsons Green
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Bank
Take Circle Line to Temple
Take Circle Line to Aldgate
Take Circle Line to Aldgate
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Aldgate
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Bank
Take District Line to Upney
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Upney
Take District Line to Bank
Take Circle Line to Embankment
Take Circle Line to Embankment
Take Northern Line to Angel
Take Northern Line to Moorgate
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Moorgate
Take Circle Line to Moorgate
Take Northern Line to Mornington Crescent

Çevrimiçi deneyin!

Londra'da dolaşan herkes bunu anında anlayacaktır, bu yüzden tam bir açıklama yapmam gerekmediğinden eminim.

Başlangıçtaki işlerin çoğu 0 olayı ele alıyor. Ürünü 1'de başlattıktan sonra, yeni girdiyi elde etmek için maksimum değeri (giriş, 1) hesaplamak için kullanabilirim. = 1! Sonra ana döngü başlayabilir.

(EDIT: 1'i 7'yi (Sisters) bölerek kendinden ayırmak yerine 1'i "Heathrow Terminal 1, 2, 3" den çıkarmak suretiyle bir sürü yolculuk kurtarıldı. sonraki adım.)

Mornington Crescent'te düşürme pahalıdır (Tüpün kendisinden daha az pahalı olmasına rağmen). İşleri daha verimli hale getirmek için, ayrıştırılan 0'IN DEĞERLENDİRMESİNİ alarak -1'i oluşturur ve bunu döngünün çoğu için Hammersmith'te saklarım.


Bunun üzerine bazı önemli çalışmalar yaptım, ancak bu, Mornington Crescent'te golf oynamadaki ilk girişimim olduğu için (aslında herhangi bir dilde ilk girişimim ), burada ve oradaki birkaç optimizasyonu kaçırdığımı umuyorum. Bu dilde programlama yapmak istiyorsan (ve neden olmasın?), Ezoterik IDE - hata ayıklama modu ve izleme penceresiyle - bir zorunluluktur!


3

Befunge - 2x20 = 40 karakter

0\:#v_# 1#<\$v *\<
    >:1-:#^_$>\:#^_$

Bu, sarmalamayı kullanmayan bağımsız bir kod bloğu olması fonksiyonudur. Argümanı yığının en üstüne yerleştirmeniz, sonra sol üst sağdan girmeniz gerekir, fonksiyon sağ alttan sağa doğru çıkar ve sonuç yığının en üstündeki sonuçtan çıkar.

Örneğin, 125'in faktörünü hesaplamak için

555**   0\:#v_# 1#<\$v *\<
            >:1-:#^_$>\:#^_$    .@

Test 0

0   0\:#v_# 1#<\$v *\<
        >:1-:#^_$>\:#^_$    .@

Bunun oldukça eski olduğunu biliyorum, ancak bunun biraz daha kısa ve daha hızlı olduğunu düşünüyorum: &:!#@_>:# 1# -# :# _$>\# :#* _$.@(girişin yerini ve yerini alması gerekir). It's 32 chars / bytes
FliiFe

3

J - 6 karakter

*/>:i.

Bu sayılır mı? Önceki J örneğine çok benzer olduğunu biliyorum, ancak biraz daha kısa :)

J ile yeni başlayan biriyim ama şu ana kadar çok eğlenceli!


3

C (23 Karakter)

Bu, herhangi bir geri dönüş belirtilmemişse, son ödev sayısını bir geri dönüş olarak yapan GCC "özelliğini" kötüye kullanır.

f(a){a=a>0?f(a-1)*a:1;}

Uygun C, 28 karakter

f(a){return a>0?f(a-1)*a:1;}

GCC "özelliği" için +1. Ben GCC bile (böyle bir şey yaptığını hatırlıyor) bir blok dönüş değeri verir düşünüyorum0 == ({printf("Hello, world!"); 0;});
YoYoYonnY

3

Kona ( 11 6)

*/1.+!

K Sağdan sola (çoğunlukla), bu yüzden numaralandırmak çalışır x(dan numarası listesi / dizi yapmak 0için x-1,) ekleyin 1(liste aralıkları buna 0karşı x), sonra hep birlikte sayıları çarpın. Hesaplama zorunluluğu olmasaydı 125!, .yanında ekleyerek 1 bayt daha biriktirebilirdim 1. Her halükarda, 125! sadece milisaniye cinsinden hesaplanır:

  */1.+!125.
1.882677e+209

Buna çok ihtiyacın yok. K'nin kıvrılması var, bu yüzden cevabın tamamı */1.+!: 6 bayt.
kirbyfan64sos

@ kirbyfan64sos: Doğru & Düzenler
Kyle Kanos
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.