JS, 1719/1694
Theorie
Leider ist der von Ihnen angegebene Regelsatz aus mathematischer Sicht möglicherweise keine kluge Entscheidung. Tatsächlich können Sie mithilfe einer kleineren Teilmenge von Regeln für jede Zahl im angegebenen Intervall eine Lösung finden
![I = [1; 10000]](https://i.stack.imgur.com/KBiqV.gif)
ausser für
![X = [1; 3] ∪ [5; 10] ∪ {12}](https://i.stack.imgur.com/rDCDo.gif)
für die es keine lösung gibt.
Reduzierter Regelsatz
Beachten Sie die folgenden Regeln:
- Verwenden Sie nur die Betreiber
plus, minusund times.
- Sie müssen nicht mehrere Vorkommen von
plusoder minusin Ihren Ausdrücken implementieren .
- Sie brauchen sich nicht zu implementieren weder
divisionnoch operator associativity(wie ihre Lösungsmenge bereits durch die erste Regel abgedeckt ist).
Der Grund dafür ist, dass Sie, wie Sie bereits mit @Qwix besprochen haben, langweilige Antworten zulassen, dh Ausdrücke, die mit dem regulären Ausdruck enden
( times one)+$. Wenn Sie dies zulassen, hat jede Zahl im angegebenen Intervall eine Lösung.
Als Sie in einem Ihrer Kommentare geantwortet haben,
@ Qwix Ja; langweilige Antworten sind akzeptabel, obwohl dies für 104, 105, 106, 107, 108, 109, 110 oder 111 nicht funktioniert. -
Sie hatten vollkommen recht: Dies funktioniert nicht, wenn Sie versuchen, Ihren Ausdruck aus den Zahlen selbst one hundred four times one times one …oder einer anderen dieser Zahlen zu erstellen .
Wenn Ihr Ausdruck jedoch mit einem Ausdruck beginnt, dessen Bewertung einer der angegebenen Zahlen entspricht, haben Sie kein Glück. Beachten Sie beispielsweise, dass dies 17 + 87tatsächlich 104so ist , dass wir schreiben könnten 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
Um zu sehen, ob diese Teilmenge funktioniert, speichern Sie diese Datei unter num.jsund stellen Sie sicher, dass SpiderMonkey, eine JavaScript-Engine für Befehlszeilen, auf Ihrem System installiert ist.
Der Algorithmus
- Definieren wir die Eigenschaft
Kfür positive Ganzzahlen als den Zustand der Zahl mit NBuchstaben und einem Wert von N.
- Definieren wir die Eigenschaft
Feines Ausdrucks weiter als den Zustand seiner 8kWortumwandlung , der -mal kürzer ist als seine Auswertung mit k ∈ ∈. Fsteht für "fillable" und beschreibt, ob wir die Wortkonvertierung des Ausdrucks mit Ausdrücken der Länge 8 (dh " times one") füllen können oder nicht , damit der resultierende Ausdruck die Eigenschaft erhält N.
Wir gehen dann wie folgt vor:
- Wandle die eingegebene Zahl in Wörter um.
- Überprüfen Sie, ob die eingegebene Nummer eine Eigenschaft hat
K.
- Wenn dies der Fall ist, geben Sie die Wörter zurück (
4dies ist leider die einzige Zahl mit dieser Eigenschaft).
- Wenn nicht, fahren Sie fort.
- Überprüfen Sie für alle Zwei-Operanden-Ausdrücke (Additionen, Subtraktionen und Multiplikationen in dieser Reihenfolge), die zur Eingabenummer führen, ob ihre Auswertung Eigenschaften hat
K.
- Wenn dies der Fall ist, geben Sie die Wörter zurück.
- Ist dies nicht der Fall, prüfen Sie, ob der Ausdruck mit zwei Operanden eine Eigenschaft hat
N.
- Wenn dies der Fall ist, füllen Sie den Ausdruck mit
" times one"und prüfen Sie, ob die Auswertung des resultierenden Ausdrucks eine Eigenschaft hat K.
- Wenn dies der Fall ist, geben Sie die Wörter zurück
- Wenn nicht, fahren Sie fort
- Wenn nicht, fahren Sie fort
- Geh einen Kaffee trinken
Trainieren
num.js (für SpiderMonkey / Kommandozeilen)
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 (für Browser)
Der angegebene Code von oben kann aufgrund seines letzten Befehls, der die Befehlszeilenargumente aufgreift, nicht für Browser verwendet werden, um aus dem angegebenen Skript einen netten Befehl zu machen.
Um den JavaScript-Code direkt in Ihrem Browser auszuführen, wählen Sie diesen Teil des obigen Codes aus:
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}
Fügen Sie es nun in die JavaScript-Konsole Ihres Browsers ein, damit Sie die gleichen Ergebnisse in Ihrem Browser erzielen, zum Beispiel mit:
Y(1234);
Beispiele (Kommandozeile)
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
Und um zu sehen, mit welchem Trick Sie jede Zahl zum Laufen bringen können, werfen Sie einen Blick auf die langweilige Antwort für 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
Mit den angegebenen Codes werden gültige Lösungen für das angegebene Intervall generiert (und wahrscheinlich müssen Sie auch darüber nur den Wert der Variablen erhöhen L).
Statistiken
Ich war daran interessiert, wie " langweilig " die Ausdrücke waren (oder wie viel der Teilstring times onepro Ausdruck in diesem Algorithmus verwendet wurde), da dieser Teil dafür verantwortlich war, für jede Zahl innerhalb des angegebenen Intervalls eine Lösung zu finden. Überzeugen Sie sich selbst:
x : n-ter Ausdruck (min. 0, max. 10.000)
y : Anzahl der Vorkommen der Teilzeichenfolge "mal eins" innerhalb des Ausdrucks (min. 0, max. 1245)

Schlussfolgerungen:
- Die Ausdrücke werden linear immer langweiliger.
- Über 99% der Lösungen sind langweilig.
So for 1234 we can do (massive expression) times zero plus one thousand two hundred thirty four.Möglicherweise möchten Sie Null ausschließen. Wie du willst.