Güç aktarma tertibatını bul!


29

Kazanan (oldukça açık bir şekilde) Jelly'i 10 byte kullanan Dennis ♦!

Bu meydan okuma hala burada devam edecek, ancak sonuç alınmayacak.


Bir sayının güç kaynağı, John Conway (Conway'in Yaşam Oyununu yapmakta da kayda değer olan bir kavramdır) ama mesele bu değil. Bu şekilde tanımlanır:

Herhangi bir sayı için görüntü tanımını buraya girin..., sayının güç görüntü tanımını buraya girin... (yani her 2. basamak, soldan sağa, ondan önceki hanenin gücüdür). Bu işlem, sonuç tek bir rakam olana kadar tekrar edilir.

ÖRNEKLER:

2592 => (2^5)(9^2) = 2592 <= Cannot be further decomposed 135 => (1^3)5 = 5 1234 => (1^2)(3^4) = 81 => (8^1) = 8 1100 => (1^1)(0^0) = 1 # (0^0) = 1 -42 => -42 # Negative numbers output the input

Buradaki zorluk, ngirişteki herhangi bir sayı için, çıktı olarak geri dönüş powertrain(n)(yani ngüç aktarım sistemi ayrışma bittikten sonra).

Bu kod golf, bu yüzden en az bayt miktarı kazanır.

REDDİ-ŞEYLER:

  • Girişte tek sayıda rakam olabilir, son rakamın bir gücü olmaz.
  • 0 ^ 0, 1 ise, eğer 0 ise, o zaman birçok sayı anında 0 veya 1'e düşecektir.
  • Sayı, hesaplama işleminin herhangi bir yerinde (örneğin, sona ererse 2592) tahrip edilemezse , sadece sayıyı yazdırabilirsiniz.
  • Giriş ise < 10(yani tüm tek haneli sayılar ve negatifler) girişi girin.

Muhtemelen birkaç saat sonra bir kazanan ilan edeceğim .

Güncel afiş:

  1. Jöle ( Dennis ♦ ): 10
  2. Pyth ( DenkerAffe ): 16
  3. MATL ( Don Müsli ): 21
  4. Perl ( Ton Hospel ): 42
  5. Haskell ( Damien ): 64
  6. Javascript ES6 ( edc65 ): 71
  7. Mathematica ( murphy ): 74
  8. Mathematica ( LegionMammal978 ) ve Haskell ( Renzeee ): 77
  9. Python 2 ( mathmandan ): 111
  10. Piton 3 ( Erwan ): 161
  11. Java 8 ( Mavi ): 229
  12. Oracle SQL 11.2 ( Jeto ): 456
  13. Befunge '93 ( Lex ): 490

Bazı daha fazla test vakası takdir edilecektir.
Mego

Yani giriş maksimum 4 hane olacak?
Denker

7
Bir çevrime ulaşılırsa, ancak döngü süresi 1 değilse veya giriş numarası döngünün bir parçası değilse ne olur?
feersum

1
“Eminim fizibilite alemlerinde hiç yoktur”. Asla olmayacağını varsayabilir miyiz? Yani,> 1 döneme ulaşıldığında döngünün sonsuza dek sürmesine izin vermek mi?
Stewie Griffin

6
Önerilen sınama durumları: 1100ve sınama durumlarında -42görünmüyorsa kenar durumlarla ilgili kuralları kaçırmak kolaydır.
Dennis,

Yanıtlar:


4

Jöle, 15 14 12 10 bayt

Ds2*/€Pµ³¡

Çevrimiçi deneyin!

Nasıl çalışır

Ds2*/€Pµ³¡  Main link. Argument: n

D           Convert n into the array of its decimal digits.
 s2         Split into pairs of digits.
   */€      Reduce each pair by exponentiation.
      P     Take the product of the resulting powers.
       µ    Push the preceding chain as a link, and start a new one.
        ³¡  Execute the link n times and return the last result.

Bu, basitçe yinelenen nzamanlarla daha da kısaltılabilir , ancak bunun mümkün olan tüm girdiler için çalıştığına dair bir kanıtım yok.
Dennis,

1
Makul bir rakam için iyi olmalısın. Aslında, 16 yinelemeyi kullanarak HERHANGİ bir sayı için kesinlikle sorun yok : oeis.org/A133503
Ton Hospel

@Dennis Hm, cevabımda yaptığım şey bu
Luis Mendo

1
@DonMuesli Ve şimdi bunu düşündüm, muhtemelen çalışıyor. 0 ve tek bir endeks elde etme ihtimali çok büyük ...
Dennis

Modern Jelly'te bu 7 baytta yapılabilir:D*2/Pµ¡
Dennis

5

Haskell, 67 64 bayt

(>> = (==)) >> = $ p.show , girdi olarak bir tamsayı alan ve güç aktarımını döndüren adsız bir işlev olana kadar .

Zgarb sayesinde 3 bayt kurtarıldı

p(x:y:r)=p[x]^p[y]*p r;p[]=1;p x=read x
(>>=(==))>>=until$p.show

1
((==)=<<g)üzerine iki bayt kaydeder (\n->g n==n).
Zgarb

Vay canına, Monad'ın ((->) r) örneğine aşina değilim. Numara için teşekkürler.
Damien

Noktalama işaretlerinin bu barajı (>>=(==))>>=bir tren gibi görünüyor!
Andreï Kostyrka,

4

Perl, 42 48 bayt

İçin +2'yi ekle -lp(siz de bırakabilirsiniz -lancak yeni satırları severim)

STDIN'deki giriş ile çalıştırın, örn.

perl -lp powertrain.pl <<< 1234

powertrain.pl:

s/\B/1&pos?"**":"*"/eg until++$.>($_=eval)

(eski perls'de, regex ile kadar arasındaki boşluğu bırakabilirsiniz)

Bu, sabit noktanın üstesinden gelemez 24547284284866560000000000ancak bu büyük bir değer yine de işe yaramaz çünkü perl, üstel notasyona geçmiştir.

Yukarıdaki sürüm aslında 2592perl'in üssel notasyon kullanmadan temsil edebileceği tüm sayılar için hızlı bir şekilde çalışacaktır (en fazla döngüde), 2592ve 24547284284866560000000000( https://oeis.org/A135385 ) arasında sabit bir nokta olmadığı kanıtlanmıştır.

Ancak bu henüz kanıtlanmamış bir şeyi varsayar. Prensip olarak, X=10^7adımdan daha fazla bir azalma olabilir (sabit olmayan bir noktanın 16 basamaktan daha fazla sürmediği, https://oeis.org/A133503 ) ve değeri aşağıya inen X(ancak yukarıda kalan 10^7) bir azalma olabilir. tekrar. Bu durumda geri dönmeliyim:

s/\B/1&pos?"**":"*"/eg until$s{$_=eval}++||/-/

açıklama

Kod , rakamların arasına koyarak **ve koyarak*

s/\B/1&pos?"**":"*"/eg

öyle 2592olur 2**5*9**2ve 12345olur 1**2*3**4*5. Bunlar, değerlendirilebilecek geçerli perl ifadeleridir.

$_ = eval

( 0**0Olup 1perl'de). Sonra bunun etrafına bir döngü koyarak süresinin dolmasına neden olan bir sayaç koyun. Sabit noktalar haricinde, değerler son derece hızlı bir şekilde düştüğü için, güç aktarma serisi, sayaç gerçekten ilerlemek için bir şans almadan önce birleşir.


3

Pyth, 25 18 11 16 bayt

?<Q0Qu*F^McjGT2Q

Burada dene!

7 14 byte @Jakube yardımı ile kaydedildi

açıklama

? <Q0Qu * F ^ McjGT2Q # Q = eval (giriş)

? <Q0Q # Giriş negatifse Q dönüşü
     Q # Bir döngüye ulaşana kadar aşağıdaki işlevi uygulayın               
                   # başlangıç ​​değeri Q, mevcut değer G cinsinden
           jGT # girişi bir basamak listesine bölme
          c 2 # 2 çiftine bölünmüş
        ^ M # her çiftin gücünü hesapla
      * F # tüm güçlerin ürününü hesaplar


1
Pyth temelde küçük değişiklikler dışında Python'un sadece golf versiyonudur mu?
clismique

1
@Jakube İpuçları için teşekkürler! :) Hala sabahın erken saatlerinde benim için ...
Denker

@DerpfacePython Yea, biraz. Öğrenmek istersen doktora bir göz at .
Denker

Sorun değil. ;-)
Jakube

4
@DerpfacePython Pyth, sadece "kısaltılmış Python" olarak başladı, ama bunu şimdi aşağılayıcı olacağını söylemek için. Pyth, Python'dan önemli ölçüde ayrıldı.
Mego

3

Python 2,111 bayt

def p(n,b=0,o=''):
 if n<1:return n
 for c in str(n):o+=c+'**'[b:];b=~b
 j=eval(o+'1');return p(j)if j-n else j

Fikir ve rakam bir dize yapmaktır narasında alternatif işlemleri ile ayrılır *ve **ve sonra evaldize söyledi. (Diğer çözümler de aynı fikri kullanıyor; örneğin Ton Hospel'in Perl cevabına bakınız .)

Bu nedenle, işlem '**'[0:], olan **ve '**'[-1:]sadece olan arasında gidip gelir *.

Bununla birlikte, for-loop'un sonunda , dize bir işlemle (biri ya da diğeri) sona erer, bu nedenle dizgenin anlam kazanması için son işlemi bırakmamız ya da başka bir rakam eklememiz gerekir.

Neyse ki, sonuna bir ekleme, 1hangi işlemin sonuncusu olursa olsun işe yarayacak. (İsterseniz, 1çarpma ve üstelik için sağdan tek taraflı bir kimliktir. Bunu söylemenin başka bir yolu da powertrain(n) == powertrain(10*n + 1)herkes içindir) n>0.

Son olarak, sonucun evalgirişi (aynı uzunluk 1döngüsündeki gibi) girişle aynı olursa , fonksiyon sona erer. Aksi takdirde, işlev sonuçtan kendisini çağırır. (Herhangi bir uzunluk döngüsünde sonsuza dek askıda > 1kalır, ancak OP'nin yorumlarına göre böyle bir döngü olmadığını kabul etmeme izin verilir.)

(Not: Yukarıdaki açıklama tek basamaklı pozitif tamsayılar için geçerlidir, çünkü tek basamaklı bir giriş ntamamlanır ve n**1bunun için bir 1döngü sağlar. Ancak, pozitif olmayan girişi de kabul etmemiz gerekir. Girdiden daha az olursa kısa devrelere başlamak 1. Bu çizgiyi ortadan kaldırabiliriz ve eğer girişin negatif olmadığından emin olursak 17 byte tasarruf edebiliriz.)


Bu önyargılı geliyor, ama ... Python 2 olduğu için fazla oy. Ve bir açıklaması var.
clismique

@DerpfacePython Teşekkürler! (Sanırım bu Python 3'te de işe yarayacak ...)
mathmandan

3

Java 8, 265 244 229 bayt

Bu benim ilk cevabım ama bu siteyi bir süredir okudum ve ne yaptığımı bildiğimi düşünüyorum. En azından befunge ve SQL'i yeniyor ...

Ne yazık ki, diğer cevaplar gibi, bu da tamsayıların ne kadar büyük olabileceğine dair kısıtlamalar getirilmiş olan java'a bağlı olarak 24547284284866560000000000 için çalışmıyor.

@JackAmmo sayesinde 36 bayt kaydedildi

public int p(int n){if(n<10)return n;int i=1,t=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){int a=(int)Math.pow(10,i);r[s-i++]=n%a/(a/10);}for(i=0;i<s-1;i++)t*=Math.pow(r[i],r[++i]);if(s%2==1)t*=r[s-1];return n==t?n:p(t);}

Ungolfed Açıklama

public int powertrain(int input){
    //handles negative and 1-digit cases
    if(input<10)return input;
    //initialize output variable       
    int total=1;
    // get "length" of number. Shorter than getting length of string representation
    int size=(int)Math.log10(input)+1;
    //initialize array to store digits
    int[] array=new int[size];
    //Now, because Java doesn't have support
    // for the "**" operation, and the way of turning
    // an integer into a string takes too many bytes,
    // I decided just to put every digit into an array with
    // math and iterate from there
    for(int i=1;i<=size;){
        int place=(int)Math.pow(10,i);
        //crazy math. Saved 1 byte by incrementing i when accessed
        array[size-i++]=input%place/(place/10);
    }
    for(int i=0;i<size-1;i++)
        //This is where the train happens.
        //Saved 1 byte by incrementing while accessing 
        //again, instead of i+=2 and i+1
        total*=Math.pow(array[i],array[++i]);
    //Make sure last number isn't left out if size is odd
    if(size%2==1)
        total*=array[size-1];
    //if we end up with same number, stop.
    //otherwise, keep recurring
    return input==total?input:powertrain(total);
}

if(n<10)return n;else{...}İlkinizde if… başkası gerekli değildir, çünkü mantıksal olarak diğer bloktaki her şey sadece n <10 yanlış olduğunda çalışacaktır. Başka ve 2 uygun parantezin çıkarılması, 6 bayttan tasarruf etmenizi sağlar. Sonuncunuzla da benzer bir durum var ... eğer if(n==t)return n;else return p(t);başka 5 bayttan tasarruf etmek için başkasını ve ardındaki alanı kaldırırsanız. Aslında eğer bunun yerine triadik operatörü kullanırsanız daha da kısaltabilirsiniz ... başkaları gibireturn n==t?n:p(t);
Jack Ammo

t, s, r ve for döngüsünün birlikte olduğunu bildirerek birkaç bayt (17 sanırım) kazanabilirsinizint t=i=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){...}for(i=0;...)...
Jack Ammo

@JackAmmo Değişkenlerin böyle bildirilebileceğinin farkında değildim, denemek zorundayım. Yardımın için teşekkürler!
Mavi,

evet, bir başkasını başlatmak için bir tane kullanıyorsanız, onları açıklamanın sırasına dikkat etmeniz gerekir (r 'nin s uzunluğunu tanımlamak için nasıl kullandığı gibi)
Jack Ammo

keyfi büyük sayılar için, java 'nın BigInteger sınıfına bakmalısınız docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html
Jack Ammo

2

JavaScript (ES6) 71

Bir tekrarlama bulunduğunda durduran bir özyinelemeli işlev. Bu, daha uzun döngüler için işe yaramadı (2 veya daha fazla değer tekrarı), ancak bunun en azından javascript sayı hassasiyetinin sınırlı aralığında (17 basamak) olamayacağı görülüyor.

f=n=>[...n+'1'].map((c,i)=>i&1?r*=Math.pow(d,c):d=c,r=1)&&n-r?f(r):n

Ölçek

f=n=>[...n+'1'].map((c,i)=>i&1?r*=Math.pow(d,c):d=c,r=1)&&n-r?f(r):n

function go()
{
  v=+I.value
  R.textContent=f(v)
}  

go()
<input id=I value="1234"><button onclick="go()">Go</button>
<span id=R></span>


+'1'Tek taşla iki kuş öldürmek çok güzel !
Neil

Zaten araştırıp araştırmayacağınızı bilmiyorum ama en iyisini yapabileceğim en iyi replaceşey 1 byte daha uzun oldu:f=n=>`${n}1`.replace(/../g,([x,y])=>r*=Math.pow(x,y),r=1)&&n-r?f(r):n
Neil

@Neil Ben de çok denedim, ama bu şablon dizesi yeni bir fikir ...
edc65

1

Mathematica, 77 bayt

Times@@(If[#2<1,1,#^#2]&)@@@Partition[IntegerDigits@#,2,2,1,1]&~FixedPoint~#&

Anonim işlev Çok karmaşık değil.


Öyle olsa bile, hala bir açıklama yapabilir miyim?
clismique, 14.06.16

1

Befunge 720 490 bayt

Bana asla bir şey söylemediğinden sonra bir daha yapmak için direnemedim . Bu yüzden öncekinin “ASCII-fier” ını optimize ettim. Bu durumda, talimat göstergesinin rakamları okumak için okumaya gerek duymadığımı gördüm, bu yüzden onları okunabilir hale getirmek için çaba harcamamıştım. Yani şimdi daha çok bir sayısallaştırıcı var.

Yine, bir açıklama yapmak istiyorsanız, yorumlarda bana bildirin, bazı yararlı açıklamalar oluşturmaya çalışacağım. Kodu kopyalayarak tercümana yapıştırabilirsiniz . 24547284284866560000000000 örneğinin 0 çıktı verdiğini buldum, ancak bu, son adımlarda doğru değeri görüldüğünü açıkça görebildiğiniz için, ızgara üzerindeki bir noktadan bu kadar büyük bir değer elde etmekle ilgili bir sorun gibi görünüyor.

v                                                    //top row is used for "variables"
>&:0`#v_.@                                           //initialize the counter                          
v     <                           g01_v#-p01:  <     //on our way back to the digitifier, check if we're done
>::>210p>55+%:10g0p-55+/:v            >10g.@         //digitifier, creates a series of ASCII characters at the top line, one for each digit in the source
        ^p01+1g01    _v#:<
v1$$                  <                              //forget some remainders of the digitifier, put 1 on the stack as a base of calculation
                      v p0-1g01-1g0-1g01*g0g01<      //taking powers of each pair of digit
>10g2-!#v_10g1-!#v_  1>                10g1-0g|
^                                  p01-2g01  *<
        >10g0g*  >                             ^     //extra multiplication with last digit if the number of digits was odd

Bu sürüm ayrıca negatif girişi de destekler. Kendim söylersem, önceki sürümde büyük bir gelişme var. En az 1 hata giderildi ve boyut büyük ölçüde azaltıldı.


Negatif sayıları girmek için kaç bayt daha gerekir?
clismique

Dürüst olacağımdan emin değilim. Olumsuz sayılarla ilgili bazı problemlerim vardı ve onları ızgarada bir yere yazdım. Tekrar deneyeceğim.
rael_kid

Ben de yeni bir hata buldum. Negatif sayılar için destek eklemeyi başardım. Yakında bir güncelleme göndereceğim! Tüm ızgarayı saydığım için muhtemelen aynı miktarda bayt olacak.
rael_kid 11:16

1

Haskell, 100 79 77 bayt

g x|x==h x=x|1<2=g$h x;h=i.map(read.(:[])).show;i[]=1;i[a]=a;i(a:b:c)=a^b*i c

Golf değil:

g x|x==h x=x|1<2=g$h x
h=i.map(read.(:[])).show
i[]=1
i[a]=a
i(a:b:c)=a^b*i c

Bu fonksiyon girişi rakamlara böler ve numarayı yapar i.

EDIT: Bazı ipuçları için nimi teşekkürler.


Birkaç ipucu: a) i(a:[])=aolduğu i[a]=a, b) gerek max 1, çünkü 0^0 = 1Haskell, c) yerini de (:[])sahip pured) hareket letiçinde gayrı bir işleve ve değiştirme if ... then ... elsekorumaları ile:h=i.map(read.pure).show ; g x|x==h x=x|1<2=h x
nimi

purePrelude değil, ama ipuçlarının geri kalanı işe yarıyor, teşekkürler. Gardiyanlarla yapmaya çalışıyordum ama gardiyantan ;önce kullandım ve bu işe yaramadı, ama şimdi nasıl çalışması gerektiğini biliyorum.
Renzeee

pureüssü 4.8.2.0 ile birlikte gelen Prelüd. Ne zaman tanıtıldığını bilmiyorum. Buna gerek yok ( )in i([a])=a.
nimi

1

Mathematica, 74 bayt

0~f~0=f[]=1
f@n_=n
f[a_,b_,c___]:=f[c]a^b
#//.i_/;i>0:>f@@IntegerDigits@i&

açıklama

Bu çözüm f, sayının basamaklarını argüman olarak alan ve güç aktarma işleminin bir yinelemesini uygulayan bir yardımcı işlev kullanır . Son satır, bir ifadeye kural uygulayan (bu durumda saf fonksiyonun argümanı ) artık değişmeyene kadar ReplaceRepeated(veya //.kısaca) işlevden yararlanmak için hazırlanmış #saf bir işlevdir. Kural, i_/;i>0:>f@@IntegerDigits@inegatif olmayan her şeyi fondalık basamaklarına uygulanan işlevle değiştirir.


Satır 2 çalışmıyor (kullanım :=)
CalculatorFeline

Açıklama, lütfen?
clismique

@CatsAreFluffy Sorununuzu 2. satırla göremiyorum. Bu benim için iyi çalışıyor!
murphy

SetDelayed::write: Tag Times in n f[a_,b_,c___] is Protected. >>, Vs Set::write: Tag Times in 1 f[n_] is Protected. >>kullandığımda ikinci hata kayboluyor . :==
Hesap MakinesiFeline

Üzgünüz, bu hatayı yeniden oluşturamıyorum. Ancak çıktınız, satır sonlarının sorunun bir parçası olduğunu gösterir. Lütfen ;satır sonları yerine s ile sürümü deneyin :0~f~0=f[]=1;f@n_=n;f[a_,b_,c___]:=f[c]a^b;#//.i_/;i>0:>f@@IntegerDigits@i&
murphy

1

MATL , 21 bayt

tt0>*:"V!UtQgv9L2#)^p

Çıktının üretilmesi birkaç saniye sürebilir.

DÜZENLEME (2016 30 Temmuz): bağlantılı kod cümledeki 9Ltarafından 1Ldilinde son değişikliklere uyum sağlamak.

Çevrimiçi deneyin!

Bu, kod verimliliği pahasına bayt sayısını azaltmak için aşağıdaki iki numarayı kullanır:

  • Bıkmadan nyerine bir döngü beklemenin kez bulunur. OP'nin yorumlarına göre bu kabul edilebilir.
  • Tek sayıda basamak için 1, son güç işlemini tamamlamak için bir final eklenmelidir. Bunun yerine, eklenen 1sayı, hane sayısıdır. Bu eşit bir sayı sağlar, böylece tüm güç işlemleri yapılabilir (sonuncusu gereksiz 1^1işlem olsa bile ).

Kod:

t         % implicitly take input x. Duplicate
t0>*      % duplicate. Is it greater than 0? Multiply. This gives 0 if input is negative,
          % or leaves the input unchanged otherwise
:         % Generate array [1,2,...,x]
"         % for each (repeat x times)
  V       %   convert x to string
  !       %   transpose into column char array
  U       %   convert each char into number
  tQg     %   duplicate. Add 1 so that no entry is zero. Convert to logical: gives ones
  v       %   concatenate vertically
  9L2#)   %   separate odd-indexed and even-indexed entries
  ^       %   element-wise power
  p       %   product of all entries
          % implicitly end for each
          % implicitly display

Uh ... heh heh heh ... "sayı döngüler" derken, bunun gibi sayıları kastettim - a, b, a, breklam sonsuz (birden fazla terim). Bir terim tekrarlanırsa, o sayıyı yazmalısınız. Üzgünüm, eğer net değildi.
Clismique

Bir terim tekrarlanırsa, bu sayıyı çıkarıyorum. Birçok yinelemeden sonra sonucu çıkardım
Luis Mendo

Oh, şimdi anlıyorum ... sadece soruyorum, kaç kez tekrar ederdi (yaklaşık)? Çünkü 2592girdiyi yazdığımda , bir süredir hiçbir şey çıkmıyor gibi görünüyor.
clismique

Yinelemelerin sayısı giriş numarasıdır, yani bu durumda 2592. Evet, biraz zaman alıyor
Luis Mendo

0

Python 3, 169 161 bayt

def f(s):
 o=[['1',s]['-'in s]]
 while s not in o:
  o+=[s];s+='1'*(len(s)%2==1);r=1;
  for i,j in zip(s[::2],s[1::2]):r*=int(i)**int(j);s=str(r);
 return o[-1]

Ungoldfed

def f(s):
 o=[['1',s]['-'in s]]
 while s not in o:
  o+=[s]
  s+='1'*(len(s)%2==1)
  r=1
  for i,j in zip(s[::2],s[1::2]):
   r*=int(i)**int(j)
  s=str(r)
 return o[-1]

Sonuçlar

>>> [f(i) for i in ['135', '1234', '642', '2592', '-15']]
['5', '8', '2592', '2592', '-15']

@PeterTaylor Sabit!
Erwan

Bunları birer tane ile ayırırsanız, tek bir satıra birden çok ifade koyabilirsiniz. ;Bu şekilde, boşluk boşluklarını kaydedersiniz. Ayrıca for döngüsünün gövdesini aynı satıra yerleştirebilirsiniz.
Denker

Önerilen golf oyunu:def f(s,o=[['1',s]["-"in s]],n=int): while s not in o: o+=[s];s+=1*(len(s)%2<1);r=1 for i,j in zip(s[::2],s[1::2]):r*=n(i)**n(j) s=str(r) return o[-1]
CalculatorFeline

@CatsAreFluffy o=[['1',s]["-"in s]]varsayılan argüman benim için işe yaramaz, bir hata tanımlanmadı '
Erwan

Oops, o sonraki satıra geçin.
Hesap MakinesiFeline

0

Oracle SQL 11.2, 456 bayt

WITH v(n,c,i,f,t)AS(SELECT:1+0,CEIL(LENGTH(:1)/2),1,'1',0 FROM DUAL UNION ALL SELECT DECODE(SIGN(c-i+1),-1,t,n),DECODE(SIGN(c-i+1),-1,CEIL(LENGTH(t)/2),c),DECODE(SIGN(c-i+1),-1,1,i+1),DECODE(SIGN(c-i+1),-1,'1',RTRIM(f||'*'||NVL(POWER(SUBSTR(n,i*2-1,1),SUBSTR(n,i*2,1)),SUBSTR(n,i*2-1,1)),'*')),DECODE(SIGN(c-i+1),-1,0,TO_NUMBER(column_value))FROM v,XMLTABLE(f)WHERE i<=c+2 AND:1>9)CYCLE n,c,i,f,t SET s TO 1 DEFAULT 0SELECT NVL(SUM(n),:1) FROM v WHERE s=1;

Un-golfed

WITH v(n,c,i,f,t) AS
(
  SELECT :1+0,CEIL(LENGTH(:1)/2),1,'1',0 FROM DUAL
  UNION ALL
  SELECT DECODE(SIGN(c-i+1),-1,t,n),
         DECODE(SIGN(c-i+1),-1,CEIL(LENGTH(t)/2),c),
         DECODE(SIGN(c-i+1),-1,1,i+1),
         DECODE(SIGN(c-i+1),-1,'1',RTRIM(f||'*'||NVL(POWER(SUBSTR(n,i*2-1,1),SUBSTR(n,i*2,1)),SUBSTR(n,i*2-1,1)),'*')),
         DECODE(SIGN(c-i+1),-1,0,TO_NUMBER(column_value))
  FROM v,XMLTABLE(f) WHERE i<=c+2 AND :1>9 
)  
CYCLE n,c,i,f,t SET s TO 1 DEFAULT 0
SELECT NVL(SUM(n),:1) FROM v WHERE s=1;

v özyinelemeli bir görünümdür, parametreler

n: 2 basamak parçaya bölünecek sayı

c: 2 basamaklı parça sayısı

i: hesaplanacak mevcut 2 hane bölümü

f: güçleri * ile ayırıcı olarak birleştiren dize

t: f değerlendirmesi

DECODE'ler, mevcut sayının tüm bölümleri tamamlandığında bölmek ve hesaplamak için bir sonraki sayıya geçer.

XMLTABLE (f), sonucu “column_value” sözde sütununa koyarak, değerlendirir ve değerlendirir. Bu bir golfed versiyonu http://tkyte.blogspot.fr/2010/04/evaluating-expression-like-calculator.html

CYCLE döngü tespiti için kehanet inşa ve çıkış koşulu olarak kullanılır.

Şu sonuç için: 1 <10: 1 ve v, bu durumlar için satır döndürmez, SUM değer olarak NULL olan bir satırı zorlar. NVL döndürür: satır boşsa sonuç olarak 1.


Açıklama nerede?
clismique
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.