JS, 1719/1694
teori
Maalesef, sağladığınız kural kümesi matematiksel açıdan akıllıca bir karar olmayabilir. Aslında, daha küçük bir kural alt kümesi kullanarak, verilen aralıktaki her sayı için bir çözüm bulabilirsiniz.
![I = [1; 10000]](https://i.stack.imgur.com/KBiqV.gif)
dışında
![X = [1; 3] 8 [5; 10] ∪ {12}](https://i.stack.imgur.com/rDCDo.gif)
bunun için bir çözüm yoktur.
İndirgenmiş kural seti
Aşağıdaki kural alt kümesini düşünün:
- Yalnızca operatörlerini kullanın
plus, minusve times.
- Sen uygulamak gerekmez birden fazla kopyasını
plusveya minusifadelerinizdeki.
- Sen uygulamak gerekmez ne
divisionde operator associativity(onların çözüm kümesi zaten birinci kuralının geçerli olduğu gibi).
Bunun çalışmasının nedeni, @Qwix ile daha önce tartıştığınız gibi sıkıcı cevaplara , yani normal ifadeyle biten ifadelere
izin vermenizdir ( times one)+$. Buna izin vermek gerekirse, verilen aralıktaki her sayının bir çözümü olacaktır.
Yorumlarınızdan birinde cevap verdiğinizde,
@Qwix Evet; 104, 105, 106, 107, 108, 109, 110 veya 111 için işe yaramasa da sıkıcı cevaplar kabul edilebilir. -
kesinlikle haklıydınız: İfadenizi sayılardan başlayarak, yani bu sayılardan başlayarak oluşturmaya çalıştığınızda bu işe yaramaz one hundred four times one times one ….
Bununla birlikte, ifadeniz, değerlendirmesi verilen sayılardan birine eşit olan bir ifadeyle başlarsa, şansınız kalmaz. Örneğin, bunun 17 + 87gerçekten olduğunu unutmayın 104, böylece şöyle yazabiliriz 104:
104: seventeen plus eighty seven times one times one times one times one times one times one times one times one times one times one
Bu alt kümenin çalıştığını görmek için bu dosyayı farklı kaydedin num.jsve komut satırları için bir JavaScript motoru olan SpiderMonkey'in sisteminizde yüklü olduğundan emin olun.
Algoritma
KPozitif tamsayıların özelliğini Nharflere ve değerine sahip sayının durumu olarak tanımlayalım N.
- Ayrıca
F, bir ifadenin özelliğini 8k, k-evaluation ℕ ile değerlendirmesinden daha kısa sürelerdeki kelime dönüştürme durumu olarak tanımlayalım. F"doldurulabilir" anlamına gelir ve ifadenin kelime dönüşümünü uzunluk (8 " times one") ifadeleriyle doldurabilip dolduramayacağımızı açıklar, böylece elde edilen ifade özelliği alabilir N.
Daha sonra şu şekilde ilerleriz:
- Giriş numarasını kelimelere dönüştürün.
- Giriş numarasının özelliği olup olmadığını kontrol edin
K.
- Eğer öyleyse, kelimeleri döndür (
4maalesef bu özelliğe sahip tek sayıdır).
- Değilse, devam edin.
- Girdi numarasıyla sonuçlanan tüm iki işlenen ifadeler (bu sırayla toplama, çıkarma ve çarpma) için değerlendirmelerinde özellik olup olmadığını kontrol edin
K.
- Varsa, kelimeleri iade edin.
- Değilse, iki işlenen ifadenin özelliği olup olmadığını kontrol edin
N.
- Varsa, ifadeyi doldurun
" times one"ve elde edilen ifadenin değerlendirmesinin bir özelliği olup olmadığını kontrol edin K.
- Varsa, kelimeleri iade edin
- Değilse, devam edin
- Değilse, devam edin
- Git bir kahve iç
Uygulama
num.js (SpiderMonkey / komut satırları için)
function X(e,t){return e+": "+t}function P(e){var n,t;for(n=1;.5*e+(e%2===0?1:0)>n;++n){if(t=C.s(n)+" plus "+C.s(e-n),t.replace(/\s/g,"").length===e)return t;if(F(e,t)&&e>t.length)return G(e,t)}return!1}function M(e){var t,n;for(t=L;t>1;--t){if(0>t-e)return!1;if(n=C.s(t)+" minus "+C.s(t-e),n.replace(/\s/g,"").length===e)return n;if(F(e,n)&&e>n.length)return G(e,n)}return!1}function F(e,t){return(e-t.replace(/\s/g,"").length)%8===0}function G(r,t){var e,i=(r-t.replace(/\s/g,"").length)/8,n="";for(e=0;i>e;++e)n+=" times one";return t+n}function T(e){var t,n,r;if(F(e,C.s(e)))return G(e,C.s(e));for(t=1,n=1;t<Math.floor(Math.sqrt(e));++t){for(;e>tn;)++n;if(tn===e&&(r=C.s(t)+" times "+C.s(n),r.replace(/\s/g,"").length===e))return r}return!1}function Y(e){var n,r,t;return e===C.s(e).length?X(e,C.s(e)):(n=P(e))?X(e,n):(r=M(e))?X(e,r):(t=T(e),t?X(e,t):X(e,"impossible"))}var L=1e4,C=new function(){return this.o=["","one","two","three","four","five","six","seven","eight","nine"],this.t=["","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"],this.T=["ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"],this.s=function(e){return e?this.m(e):"zero"},this.m=function(e){return e>=1e6?this.m(Math.floor(e/1e6))+" million"+(e%1e6!==0?" "+this.Z(e%1e6):""):this.Z(e)},this.Z=function(e){return e>=1e3?this.h(Math.floor(e/1e3))+" thousand"+(e%1e3!==0?" "+this.h(e%1e3):""):this.h(e)},this.h=function(e){return e>99?this.o[Math.floor(e/100)]+" hundred"+(e%100!==0?" "+this.U(e%100):""):this.U(e)},this.U=function(e){return 10>e?this.o[e]:e>=10&&20>e?this.T[e-10]:this.t[Math.floor(e/10)]+(e%10!==0?" "+this.o[e%10]:"")},this};print(Y(0|arguments[0]))
num.js (tarayıcılar için)
Yukarıdaki kod, verilen komut dosyasından güzel bir komut oluşturmak için komut satırı bağımsız değişkenlerini alan son komutu nedeniyle tarayıcılar için çalışamaz.
JavaScript kodunu doğrudan tarayıcınızdan çalıştırmak için yukarıdaki kodun bu parçasını seçin:
function X(e,t){return e+": "+t}function P(e){var n,t;for(n=1;.5*e+(e%2===0?1:0)>n;++n){if(t=C.s(n)+" plus "+C.s(e-n),t.replace(/\s/g,"").length===e)return t;if(F(e,t)&&e>t.length)return G(e,t)}return!1}function M(e){var t,n;for(t=L;t>1;--t){if(0>t-e)return!1;if(n=C.s(t)+" minus "+C.s(t-e),n.replace(/\s/g,"").length===e)return n;if(F(e,n)&&e>n.length)return G(e,n)}return!1}function F(e,t){return(e-t.replace(/\s/g,"").length)%8===0}function G(r,t){var e,i=(r-t.replace(/\s/g,"").length)/8,n="";for(e=0;i>e;++e)n+=" times one";return t+n}function T(e){var t,n,r;if(F(e,C.s(e)))return G(e,C.s(e));for(t=1,n=1;t<Math.floor(Math.sqrt(e));++t){for(;e>tn;)++n;if(tn===e&&(r=C.s(t)+" times "+C.s(n),r.replace(/\s/g,"").length===e))return r}return!1}function Y(e){var n,r,t;return e===C.s(e).length?X(e,C.s(e)):(n=P(e))?X(e,n):(r=M(e))?X(e,r):(t=T(e),t?X(e,t):X(e,"impossible"))}var L=1e4,C=new function(){return this.o=["","one","two","three","four","five","six","seven","eight","nine"],this.t=["","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"],this.T=["ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"],this.s=function(e){return e?this.m(e):"zero"},this.m=function(e){return e>=1e6?this.m(Math.floor(e/1e6))+" million"+(e%1e6!==0?" "+this.Z(e%1e6):""):this.Z(e)},this.Z=function(e){return e>=1e3?this.h(Math.floor(e/1e3))+" thousand"+(e%1e3!==0?" "+this.h(e%1e3):""):this.h(e)},this.h=function(e){return e>99?this.o[Math.floor(e/100)]+" hundred"+(e%100!==0?" "+this.U(e%100):""):this.U(e)},this.U=function(e){return 10>e?this.o[e]:e>=10&&20>e?this.T[e-10]:this.t[Math.floor(e/10)]+(e%10!==0?" "+this.o[e%10]:"")},this}
Şimdi tarayıcınızın JavaScript konsoluna yapıştırın, böylece aynı sonuçları tarayıcınızdan aşağıdakilerle üretebilirsiniz:
Y(1234);
Örnekler (komut satırı)
chiru@chiru ~ $ js num.js 28
28: fourteen plus fourteen times one
chiru@chiru ~ $ js num.js 7
7: impossible
chiru@chiru ~ $ js num.js 42
42: nine thousand sixty minus nine thousand eighteen
Ve her sayı çalışması hangi ile numara görmek için, sadece bir göz sıkıcı cevap için js num.js 1337:
1337: ten plus one thousand three hundred twenty seven times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one
Sağlanan kodlar, verilen aralık için geçerli çözümler üretir (ve muhtemelen üstte, yalnızca değişkenin değerini yükseltmeniz gerekir L).
İstatistik
Bu bölüm verilen aralıktaki her sayı için bir çözüm bulmaktan sorumlu olduğu için , ifadelerin "ne kadar sıkıcı " olduğunu (veya: times onebu algoritma içinde ifade başına alt dizenin ne kadar kullanıldığını) ilgilendim . Kendiniz görün:
x : n'inci ifade (min. 0, maks. 10.000)
y : ifade içinde "kez bir" alt dizesinin oluşum sayısı (min. 0, maks. 1245)

Sonuç:
- İfadeler doğrusal bir şekilde gittikçe sıkıcı olmaya meyillidir.
- Çözeltilerin% 99'dan fazlası sıkıcıdır.
So for 1234 we can do (massive expression) times zero plus one thousand two hundred thirty four.Sıfırı hariç tutmak isteyebilirsiniz. Sana bağlı.