Faktoring faktörleri


16

Bugün istatistik dersimde, bazı faktörlerin birlikte çarpıldığında basitleştirilebileceğini buldum! Örneğin:5! * 3! = 5! *3*2 = 5! *6 = 6!

Senin işin:

Sadece Arapça sayıları ve ünlem işaretlerini içeren bir dize verildiğinde, faktöriyelimi diliniz için en az bayt miktarı olan kod golf stilinde mümkün olan en kısa dize ile basitleştirin.

Giriş

Yalnızca Arapça sayılar ve ünlem işaretleri içeren bir dize. Girdi için faktörler 200'den büyük olmayacak !. Faktörler sayı başına birden fazla faktöre sahip olmayacaktır. Giriş, tamsayıların bir listesi olarak alınabilir.

Çıktı

Girdi üzerinde eşdeğer değere sahip, muhtemelen kısaltılmış bir dize. Düzen önemsizdir. Faktöriyel gösterim bir zorunluluktur, ancak sayı başına birden fazla faktöriyel sembol kullanmanız gerekmez.

Test senaryoları

In: 3!2!2!  
Out: 4! 

In 2!3!2!0! 
Out: 4! 

In: 7!2!2!7!2!2!2!2! 
Out: 8!8! 

In: 23!3!2!2! 
Out: 24!  
Also: 4!!

In: 23!3!2!2!2! 
Out: 24!2!

In: 127!2!2!2!2!2!2!2! 
Out: 128!

In: 32!56!29!128!  
Out: 29!32!56!128!

İyi şanslar


Boş ürün 1 için çıktı olduğundan, 1!1!boş bir dize mi?
Jonathan Allan

@JonathanAllan 1! 1! 1'e düşürür! Veya 0!
tuskiomi

Bu daha sonra boş karakter dizisine indirgenir: /
Jonathan Allan

Yanıtlar:


5

Jöle ,  17  18 bayt

!P
ÇṗLÇ⁼¥ÐfÇḢḟ1ȯ0F

Sayıların bir listesini alan ve döndüren monadik bir bağlantı (sayı başına bir faktöriyelere yapışır)

Çevrimiçi deneyin!

Nasıl?

Pietu1998'in çözümünün golf (bağımsız olarak yazılmış olmasına rağmen) versiyonu.

!P - Link 1, product of factorials: list
!  - factorial (vectorises)
 P - product

ÇṗLÇ⁼¥ÐfÇḢḟ1ȯ0F - Main link: list                       e.g. [3,2,2]
Ç               - call the last link (1) as a monad           24
  L             - length                                      3
 ṗ              - Cartesian power      [[1,1,1],[1,1,2],...,[1,1,24],...,[24,24,24]]
        Ç       - call the last link (1) as a monad           24
      Ðf        - filter keep if:
     ¥          -   last two links as a dyad:
   Ç            -     call the last link (1) as a monad     [1,2,...,24!,...,24!^3]
    ⁼           -     equal?
         Ḣ      - head
          ḟ1    - filter out any ones
            ȯ0  - or with zero (for the empty list case)
              F - flatten (to cater for the fact that zero is not yet a list)

1
Bana yeterince açık görünüyor - onu kullanmamız gerekmiyor, ancak istersek yapabiliriz.
Jonathan Allan

1
@tuskiomi Altbilgi sadece liste çıktısını netlik için biçimlendiriyor ... tam bir program olarak (bir işlev olarak değil), kod Jelly'nin bir liste biçimini yazdırır (boş liste için hiçbir şey içermez ve hiçbir uzunluk [1 için] içermez) .
Jonathan Allan

1
@tuskiomi TIO'nun sınırları vardır ;-) ama teorik olarak çalıştığını düşünüyorum.
Outgolfer Erik

1
@tuskiomi Kartezyen gücü 23! ^ 4 listesinin bir listesi ile sonuçlanacaktır. Bellek yoksa zaman kalmaz (TIO'da 60 sn sınırı).
Jonathan Allan

1
N! ^ M burada N ürün ve M terim sayısıdır (ve uzayda da !!)
Jonathan Allan

3

Jöle , 19 bayt

,!P€E
SṗLçÐfµḢḟ1ȯ1F

Çevrimiçi deneyin!

Hızlı ve kirli. Çok yavaş, 23!2!3!2!test senaryosu bile bir esnektir. Tamsayıların listesi olarak G / Ç.

açıklama

,!P€E    Helper link. Arguments: attempt, original
,        Make the array [attempt, original].
         Example: [[1,1,1,4], [2,3,2,0]]
 !       Take the factorial of each item.
         Example: [[1,1,1,24], [2,6,2,1]]
  P€     Take the product of each sublist.
         Example: [24, 24]
    E    Check if the values are equal.

SṗLçÐfµḢḟ1ȯ1F   Main link. Arguments: original
S               Find the sum S of the integers in the input.
  L             Find the number N of integers in the input.
 ṗ              Generate all lists containing N integers from 1 to S.
   çÐf          Take the lists whose factorial-product is the same as the original.
       Ḣ        Take the first match. This is the one with the most ones.
        ḟ1      Remove any ones.
          ȯ1    If there were only ones, return a one instead.
            F   Turn into a list if needed.

Listeleri G / Ç olarak kullanabiliriz
Jonathan Allan

@JonathanAllan Oh, görünüşe göre OP içinde düzenlenmedi
PurkkaKoodari

Benim 17 daha yavaş görünüyor ...
Jonathan Allan


@JonathanAllan Devam edin ve yayınlayın, algoritma aslında aynı olsa bile benim için farklı görünüyor.
PurkkaKoodari

2

Temiz , 397 ... 317 bayt

import StdEnv,StdLib
c=length
f c m=sortBy c o flatten o map m
%n=f(>)@[2..n]
@1=[]
@n#f=[i\\i<-[2..n]|n/i*i==n&&and[i/j*j<i\\j<-[2..i-1]]]
=f++ @(n/prod f)
?l=group(f(>)%l)
$l=hd(f(\a b=c a<c b)(~(?l))[0..sum l])
~[]_=[[]]
~i n=[[m:k]\\m<-take n[hd(i!!0++[0])..],k<- ~[drop(c a)b\\a<-group(%m)&b<-i|b>a]n|i== ?[m:k]]

Çevrimiçi deneyin!

Bu, bir [Int]sonuca ulaşır, sonucun ana faktörlerini belirler ve herhangi bir aşamadaki en büyük faktörü bir sonraki faktöriyel terim için temel değer olarak kullanarak en küçük temsili bulmak için faktörleri azaltır. TIO'daki bazı test vakalarını tamamlamayacak, ancak oldukça * hızlı ve orta kademe bir dizüstü bilgisayarda 3 dakikadan kısa sürede çalıştırabilir.

* O((prod(N)!)^sum(N))karmaşıklık algoritması için


Testcase: 6, 2, 2
tsh

@tsh Şimdi düzeltildi. En küçük uzunluğa göre değil, yanlış bir varsayım temelinde en büyük ilk üye tarafından sıralandı.
Οurous

1

> <> , 66 bayt

1}:?\~l1=?v{!
-:?!\:{*}1
v?( 4:{/}1<o"!"n-1
{:,} :{/?%}:+1
\:1-?n;

Çevrimiçi deneyin!

Verimli değil, en küçük dizeyi bulamıyor ve yorumlayıcı çok büyük sayılarla çok iyi başa çıkmıyor. Ama en azından denedim? Girdiyi rakamların bir listesi olarak-v bayraktan bir .

İlk olarak, her bir sayıyı faktöriyelleştirerek ve bunları çarparak girdinin değerini hesaplar. Daha sonra temiz bir şekilde toplama bölen ve çıktısını veren en büyük faktöriyeti bulur. (Çıktı aldığı) veya 1 olana ve programdan çıkana kadar tekrarlayın. Bu nedenle, bazen sayının kısa temsilini bulamazsa, örneğin, test durumu 7!2!2!7!2!2!2!2!döner 10!224yerine 8!8!o toplamını bulmaktadır, çünkü 10 ile bölünebilir! ilk.


1

Yakut , 240237 233 bayt

Bu inanılmaz derecede verimsiz

Bir dizi diziyi girdi olarak kabul eder

Bir dize döndürür ve örneğin '720!', '6!!'ve arasında en kısa seçeneği seçer.'3!!!'

->i{f=->n{n>0?n*f[n-1]:1}
s=->a{eval a.map{|i|f[i]}*?*}
r=->e,a=[2]{e==s[a]?a:s[a]<=e&&(r[e,a[0..-2]+[a[-1]+1]]||r[e,a+[2]])}
j=->v{v.join(?!)+?!}
u=r[s[i]]
while j[g=u.map{|i|i&&r[i]?[r[i],p]:i}.flatten].size<j[u].size;u=g;end
j[u]}

Çevrimiçi deneyin!

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.