Berechnen Sie einen Tipp

16

Sie und ein Freund gehen in eine Bar. Der Barkeeper behandelt Sie gut, und Sie beschließen, ihm ein Trinkgeld zu geben. Sie ziehen also Ihren zuverlässigen Taschencomputer heraus und schreiben ein schnelles Programm, um einen Tipp für Sie zu berechnen, da er keinen eingebauten Taschenrechner enthält. Aber warte! Ihre Vermittlungstasten sind defekt! Ihre Aufgabe ist es, ein Trinkgeld von 20% für einen bestimmten Eingabebetrag zu berechnen. Die Testeingaben haben die Form xx.xx, z. B. 20.96. Hier sind die Regeln:

  • Keine Verwendung der folgenden in mathematischer Form Operatoren: + - * / %(Dank Wally West)
  • Keine Verwendung von integrierten Prozentfunktionen oder APIs
  • Kein Zugriff auf das Netzwerk
  • Keine Verwendung von evaloder ähnlichem
  • Nein Windows-Rechner (ja, die Leute haben schon einmal damit geantwortet)
  • Keine eingebauten Tippfunktionen (nicht, dass irgendeine Sprache eine haben würde)

Die Ausgabe sollte auf zwei Dezimalstellen aufgerundet werden.

Die Bewertung basiert auf der Länge in Byte.

-20%, wenn Ihr Programm Trinkgeld akzeptiert. Die Eingabe für den Betrag erfolgt in Form von xx, z. B. 35, nicht 0,35

Milo
quelle
5
@mniip: Ein Trinkgeld ist eine bizarre Extragebühr, die Sie in einem Restaurant bezahlen müssen, das nicht zum offiziellen Preis gehört. Ich weiß nicht, ob sie das in Russland tun.
user2357112 unterstützt Monica
5
Oh, diese neue Generation ... Ich würde lieber Papier und Stift verwenden, wenn ich eine Zahl nicht mental durch 5 teilen kann.
VisioN
4
@VisioN Hinweis: Das Teilen durch fünf entspricht dem Teilen durch 10 und dann dem Multiplizieren mit 2, und beide sollten sehr einfache mentale Operationen sein.
user12205
1
Kann jemand die Regeln klarstellen: Ist die Verwendung verbotener Operationen zulässig, wenn Sie diese Operatoren nicht verwenden? Ist Multiplikation erlaubt, wenn Sie nicht verwenden *?
Ypnypn
2
@TheDoctor ist es wirklich ein Duplikat? Weil es nicht hinzufügt.
Milo

Antworten:

18

Javascript 81

EDIT : Das Ergebnis ist jetzt eine echte Rundung, nicht abgeschnitten.

Verwenden Sie hier KEINE Mathematik, nur Zeichenfolgenmanipulation und bitweise Operatoren.
Alle +Zeichen sind Zeichenfolgenverkettungen oder Konvertierungen von Zeichenfolgen in Gleitkommazahlen .
Funktioniert für alle xx.xx Ein- und Ausgänge im (x) x.xx Format

s='00'+(prompt().replace('.','')<<1);(+s.replace(/(.*)(...)/,'$1.$2')).toFixed(2)

Trick erklärt: 20% wird durch 10 geteilt und mit 2 multipliziert.

  • Machen Sie eine Division durch 10, indem Sie den Punkt nach links bewegen (String-Manipulation)
  • Multiplizieren Sie jeden Teil mit 2, indem Sie die Bits nach links bewegen (bitweise Operation).
Michael M.
quelle
Bei Eingabe von wird 99.99dies zurückgegeben 19.998, sodass es nicht gemäß OP auf zwei Dezimalstellen aufgerundet wird.
Geobits
2
Umm das ist eine lange Lösung, aber es hat 12 positive Stimmen. Was ist los mit dem Code-Golf-Voting?
Justin
@Quincunx Ja, Sie haben Recht, es ist kein Beliebtheitswettbewerb!
Mukul Kumar
Da es ein Code-Golf ist, werde ich wahrscheinlich nicht gewinnen, aber das bedeutet nicht, dass die Leute meine Lösung nicht mögen können ... Oft sind Code-Golf-Gewinner nicht die mit den meisten positiven Stimmen.
Michael M.
@ n̴̖̋h̷͉̃ã̷͉h̷̭̿d̷̰̀ĥ̷̳, auf jeden Fall! Vielen Dank für diesen Hinweis. Jetzt
Michael M.
6

J (9 Zeichen)

Eine kurze Antwort in J:

^.(^.2)^~ 32
Thomas Baruchel
quelle
1
... und ich spreche nicht J. Was sagt es aus?
CousinCocaine
Es heißt: Berechne 32 angehoben auf Power Log (2); Normalerweise befindet sich der Exponent rechts von, ^aber hier wird ~angegeben, dass die Reihenfolge umgekehrt werden soll. (^.2)ist log (.2), ​​und die Initiale, ^.die zuletzt ausgeführt wird, ist der Logarithmus von allem, was zuvor berechnet wurde: also log (32 ^ log (.2))
Thomas Baruchel
4

Pure Bash, 50 43 Zeichen

Ich bin mir ziemlich sicher, dass das klappt, aber hier ist ein Anfang:

a=$[10#${1/.}<<1]
echo ${a%???}.${a: -3:2}

Wie aus den Kommentaren hervorgeht:

  • /ist hier kein Divisionsoperator, sondern Teil einer Erweiterung des Mustersubstitutionsparameters
  • % ist hier kein Modulo-Operator, sondern Teil einer Parametererweiterung
  • - ist hier kein Subtraktionsoperator, es ist eine Negation, die laut den Kommentaren erlaubt war

Ausgabe:

$ ./20pct.sh 0.96
.19
$ ./20pct.sh 20.96
4.19
$ ./20pct.sh 1020.96
204,19
$ 
Digitales Trauma
quelle
Ich glaube, ich sehe dort einen Schrägstrich.
Milo
@Milo /ist Teil einer Bash-Parameter-Erweiterung und kein Divisionsoperator. Erlaubt oder nicht?
Digital Trauma
1
Ich würde es erlauben, es ist in diesem Fall kein mathematischer Operator ...
WallyWest
1
-3 fungiert als Negation und nicht als Subtraktion ... @Milo, Sie müssen die Negation berücksichtigen und andere Möglichkeiten, wie diese Operatoren neben ihren mathematischen Entsprechungen verwendet werden können ... + kann beispielsweise als Verkettung in JavaScript verwendet werden. .. Kann ich einen Vorschlag machen? Ändern Sie "Keine Verwendung der folgenden Operatoren: + - * /%" in "Keine Verwendung der folgenden Operatoren in ihrer mathematischen Form: + - * /%"
WallyWest
2
@WallyWest Um Devil's Advocate zu spielen, ist die Negation hier immer noch ein mathematischer Operator. Vielleicht "Keine Verwendung der folgenden Operatoren in ihrer nicht-einheitlichen mathematischen Form: + - * /%" ;-)
Digitales Trauma
4

Python 98 * 0,8 = 78,4

d=`len('X'*int("{}{:>02}".format(*(raw_input()+".0").split('.')))*2)`;print'%s.%s'%(d[:-3],d[-3:])

Python 74 (ohne Bonus)

d=len('X'*int(raw_input().replace('.',''))*2);print'%s.%s'%(d[:-3],d[-3:])

Hinweis

  • + wird für die Verkettung von Zeichenfolgen verwendet
  • * wird zum Erstellen von Kopien von Zeichenfolgen verwendet

Ungolfed

def tip():
    amount = raw_input()
    #Add an extra decimal point so that we can accept integer
    #amount
    amount += ".0"
    #Split the integer and decimal part
    whole, frac = amount.split('.')
    #Multiply amount by 100 :-)
    amount = "{}{:>02}".format(whole, frac)
    #Create amount copies of a character
    st = 'X'*amount
    #Double it
    st *= 2
    #Calculate the Length
    d = len(st)
    #Display the result as 3 decimal fraction
    print'%s.%s'%(d[:-3],d[-3:])

Hinweis

Im Geiste der Frage glaube ich, dass die folgende Lösung, obwohl sie allen Regeln der Frage folgt, ein Missbrauch ist

Python 41

print __import__("operator")(input(),0.2)

Schließlich

Wenn Sie darauf bestehen, dass die mathematischen Symbole verboten sind, ist sie eine 90-Zeichen-Lösung

Python 90 (ohne mathematisches Symbol)

print' '.join(str(int(raw_input().replace(".",""))<<1)).replace(' ','.',1).replace(' ','')
Abhijit
quelle
1
Wie schon gesagt, *und +KEYS sind kaputt (wofür du sie verwendest).
Thomas Baruchel
2
@ ברוכאל: No use of the following in mathematical form operators: + - * / % (Thanks Wally West). Mit anderen Worten, die Frage muss umformuliert werden. Und ich habe sie nicht in mathematischer Form verwendet
Abhijit
OK, aber in diesem Fall war die Abwertung der APL-Lösung nicht wirklich fair, da aus diesem Grund keine andere Lösung abgelehnt wurde.
Thomas Baruchel
Ihre Antwort wird ein Problem mit dem winzigen Geldbetrag haben, z 0.05.
n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̷̰̀ĥ̷̳
Sie können statt verwenden `input`(Backticks enthalten) raw_input.
nyuszika7h
4

APL (9 Zeichen, neuer Code mit 7 Zeichen, fest mit 13 Zeichen)

Berechnen Sie 20% des angegebenen Betrags.

{⍟⍵*⍨*.2} 32

In APL *ist der Exponentialoperator.

Probieren Sie es online aus .

Aber warum eine Funktion dafür verwenden? Siehe diese neue Version:

⍟(*.2)* 32

Probieren Sie es online aus .

Bitte, vor dem Downvoting ist das *nicht als KEY verboten und es bedeutet hier keine Multiplikation.

OK, hier ist die Version, die auf 2 Dezimalstellen rundet (Dyalog APL):

⎕PP←2⋄⍟(*.2)* 32.01
Thomas Baruchel
quelle
2
Die Potenzierung ist nach wie vor eine mathematische Operation und *nach den Regeln der Herausforderung in keiner mathematischen Form zulässig.
Tony Ellis
Potenzierung ist hier nicht verboten, und andere Lösungen verwenden sie tatsächlich, aber Sie haben Recht mit der Tatsache, dass sie *als Schlüssel verboten ist und nicht als mathematische Bedeutung.
Thomas Baruchel
@Tony H. Bitte, könnten Sie Ihre Ablehnung entfernen, da offensichtlich alle Kommentare in anderen Lösungen solche SCHLÜSSEL endgültig zu akzeptieren scheinen, solange sie nicht für die verbotenen mathematischen Operationen in der Anfangsliste verwendet werden.
Thomas Baruchel
1
@ ברוכאל Ich verstehe, dass die Verwendung eines Sterns in irgendeiner Weise, die sich auf eine mathematische Bedeutung bezieht, verboten ist, einschließlich der Potenzierung. Jede andere Antwort, die Exponenten verwendet, ist in einer Sprache verfasst, die das Caret ( ^) für einen solchen Operator verwendet, oder es wird ein Funktionsaufruf verwendet. Es gibt keine Spezifikation durch das OP, *die nur dann unzulässig ist, wenn sie im Kontext der Multiplikation verwendet wird. Ich vermute, es wäre hilfreich, wenn OP darüber entscheiden würde, um zu entscheiden, wer von uns die Regeln der Herausforderung falsch interpretiert, und um die Verwirrung zu beseitigen.
Tony Ellis
1
Vielleicht ×und ÷erlaubt, sind diese nicht aufgeführt.
Marinus
4

R 30 27 36 34

Auf 2 Dezimalstellen gerundet

2 Zeichen dank Plannapus gespeichert

Erstellt einen Vektor von 0 bis x und nimmt das 2. Element.

a=function(x)round(seq(0,x,l=6)[2],2)

Beispiel:

> a(20.36)
[1] 4.07

Weitere Erklärung:

seq(0,x,len=6)

Erstellt einen Vektor der Länge 6 von 0 bis zum Eingabewert x, wobei die dazwischen liegenden Werte gleich weit voneinander entfernt sind.

> seq(0,5,len=6)
[1] 0 1 2 3 4 5

Der erste Wert ist dann 0%, der zweite 20%, der dritte 40% usw.

Riss
quelle
Warte was ? Bitte geben Sie weitere Details darüber, wie es für diejenigen (wie ich) funktioniert, die R.
Michael M.
@Michael hat meine Antwort aktualisiert, um den Code zu erklären
Rift
Ihre Lösung rundet nicht.
n̴̖̋h̴̖̋a̷̭̿h̷̭̿d̸̡̅ẗ̵̨́
@ n̴̖̋h̴̖̋ã̷͉h̷̭̿d̸̡̅ẗ̵̨́ Sie haben Recht (aber die meisten Lösungen runden nichts). 9 zusätzliche Zeichen würden "normal" runden. Nur Aufrunden wäre viel schwieriger ...
Rift
@Rift: Ich habe mehrere Antworten getestet (hauptsächlich Python, JS und Perl, da sie leicht verfügbar sind) und die meisten runden ab. Keiner von denen, die ich getestet habe, fasst die Ergebnisse zusammen.
n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̸̡̅ẗ̵̨́
3

dc + sed + pipes (44 zeichen)

Meine dritte Antwort (eine APL, eine J und jetzt eine mit dem alten und ehrwürdigen DC).

dc -e 5o?p|sed -e 's/\(.\)$/.\1/'|dc -e 5i?p

Es wird nach einer INTEGER-Eingabe gefragt und 20% auf knifflige Weise berechnet. Die Eingabe wird in Basis 5 konvertiert (einfach mit vielen anderen Tools zu machen, aber warten ...); Ein Punkt wird vor der letzten Ziffer mit sed angehängt (dc kann leider nicht sehr gut mit Strings umgehen), und DANN konvertiert dc von Basis 5 auf eine Gleitkommazahl zurück (nicht alle Werkzeuge können das).

Thomas Baruchel
quelle
1
"INTEGER input" entspricht nicht der Spezifikation. Ich denke , man kann es beheben , indem Sie sed Ausdruck zu ändern: dc -e 5o?p|sed 's/\(.\)\./.\1/'|dc -e 5i?p. Mit diesem und Entfernen von seds -es ist dies 42. Aber das Ergebnis ist immer noch nicht spezifizierbar (nicht 2 Dezimalstellen)
Digital Trauma
@DigitalTrauma. Du hast recht. Aber diese Lösung war eigentlich eher ein Proof of Concept und ich war mehr an der ungewöhnlichen Eigenschaft der Basenumwandlung in DC (und auch in BC) interessiert. Vielen Dank für Ihren Kommentar und Ihre Verlegenheit in sed.
Thomas Baruchel
2

Python, 88

Dies ist nicht annähernd kurz, aber es zeigt, wie eine normale mentale Division durch fünf erfolgen sollte. Dies setzt voraus, dass die Eingabe die Form xx.xx haben muss

import math
a,b=raw_input().split('.')
print'%.2f'%math.ldexp(float(a[0]+'.'+a[1]+b),1)

Für die Eingabe einer beliebigen Länge sind zusätzlich 3 Zeichen erforderlich.

import math
a,b=raw_input().split('.')
print'%.2f'%math.ldexp(float(a[:-1]+'.'+a[-1]+b),1)

Erläuterung: Wir nehmen die Eingabe als Zeichenfolge und verschieben den Dezimalpunkt um eine Stelle vorwärts (dividiert durch 10). Wir werfen es dann in einen Float und ldexpmultiplizieren es mit 2.

Beachten Sie, dass in dieser Antwort die +Zeichenfolgenverkettungsoperatoren und die %zum Formatieren verwendet werden print.

Wenn Sie darauf bestehen, keines dieser Zeichen zu verwenden, finden Sie hier eine Lösung mit 159 Zeichen:

import math
a,b=raw_input().split('.')
l=[a[0]]
l.append('.')
l.append(a[1])
l.append(b)
c=str(math.ldexp(float(''.join(l)),1))
print ''.join([c[0:2],c[2:4]])
user12205
quelle
Bereits für viele andere Antworten gesagt, aber das glaube ich wirklich nicht +und -ist zulässig, da die KEYS defekt sind (was auch immer sie in Ihrem Code bedeuten).
Thomas Baruchel
@ Hebräisch: Siehe meine Antwort auf Ihren Kommentar in meiner Antwort
Abhijit
Benutzt Ihr .split('.')in meiner Antwort, gehackt ein
Zeichen
2

dc + sed - 45 × 0,8 = 36

(Inspiriert von der Antwort von ברוכאל )

  • Verarbeitet einen beliebigen Spitzenbetrag (Integer oder Float)

Beispielläufe (Eingabe wird über STDIN akzeptiert):

$ dc -e 5o?.0+p|sed 's/\(.\)\./.\1/'|dc -e 5i?p
42
8.400
$ dc -e 5o?.0+p|sed 's/\(.\)\./.\1/'|dc -e 5i?p
20.96
4.1920
devnull
quelle
Die .0+Idee ist großartig; Ich habe für Ihre von mir inspirierte Lösung gestimmt, aber einige sagen vielleicht, dass Sie Addition verwenden. Vielleicht ein Workaround? Ich habe es versucht, dc -e 9k5o?v2^paber es sind 2 Zeichen mehr.
Thomas Baruchel
@ ברוכאל Ich wusste nicht, dass das + auch in diesem Zusammenhang als Zusatz qualifizieren könnte.
Devnull
@ ברוכאל Ich werde dieses löschen. Fordern Sie Sie auf, Ihr so ​​zu ändern, dass es Schwimmer handhaben und sich für qualifizieren kann -20%!
Devnull
2

Mathematica, 19

Log[(E^.2)^Input[]]

Keine Verwendung der mathematischen Operatoren von +, -, *, /, oder %. Verwendet Eigenschaften von Logarithmen, um die Antwort zu berechnen. Wenn Sie den Ausdruck vereinfachen, erhalten Sie.2*Input[]

Mit dem Bonus ( 30 * 0,8 = 24 ):

Log[((E^.01)^Input[])^Input[]]

Geben Sie zuerst den Prozentsatz und dann den Betrag ein.

Wenn Sie den Ausdruck vereinfachen, erhalten Sie Input[]*Input[]*.01.

Vielen Dank an ברוכאל für die Hilfe bei der Kürzung des Codes.

Justin
quelle
3
Sind Sie wirklich sicher, dass es nicht vereinfacht werden kann? Für mich Log[E^2]oder Log[E^Input[]]kann in Kürze geschrieben werden. Es 10^-1kann sogar geschrieben werden .01(obwohl ich Mathematica nicht benutze, aber ich bin mir ziemlich sicher, dass es kann). Der ganze Ausdruck (E^10^-1)^Log[E^2]scheint so etwas wie zu sein E^.2, nicht wahr?
Thomas Baruchel
1

TI-89 Basic - 39 * 0,8 = 31,2

Input y:Input x:Disp ln(((e^y)^.01)^x))

Funktioniert durch Eingabe der beiden Zahlen und anschließende Verwendung der Logarithmus-Eigenschaften zur Berechnung x * y / 100.

Wenn ich eine Eingabe von Platzierung in globalen Variablen annehmen kann xund y, so ist dies viel kürzer, für eine Punktzahl von 17 * 0,8 = 13,6 :

ln(((e^y)^.01)^x)

Ohne Bonus ( 12 ):

ln((e^.2)^x)

Wenn es jedoch in eine Funktion eingeschlossen werden muss, funktioniert dies ( 38 Zeichen, für 30.4 ):

:f(x,y):Func:ln(((e^y)^.01)^x):EndFunc
Justin
quelle
Bitte beachten Sie meine Kommentare zu Ihrer anderen Lösung (in Mathematica); Dieser Code kann wirklich sehr vereinfacht werden.
Thomas Baruchel
Input x,y??? Arbeitet in 83/84.
Timtech
@ Timtech Funktioniert nicht in 89, aber vielleicht kann ich so etwas tun Input{x,y}(hat 83/84 ln?)
Justin
@ Quincunx Ja, siehe meine neue Antwort.
Timtech
žr¹msmžr.n- Schamloser Port dieses Codes in 05AB1E.
Magic Octopus Urn
1

PHP 107 * .8 = 85.6

Ich kann nicht wirklich mit PHP für Code-Golf laufen, aber zumindest kann ich mit Strings arbeiten. akzeptiert beide Zahlen als Befehlszeilenargumente.

<? @$r=strrev;unset($argv[0]);echo$r(substr_replace($r(str_replace('.','',array_product($argv)))),'.',2,0);

musste es zweimal umkehren, da ich -2 nicht verwenden kann :(

Einacio
quelle
1

Python, 81 80 89 Zeichen

a,b=map(str,raw_input().split('.'));c=str(int(a+b)<<1).zfill(4);print c[:-3]+'.'+c[-3:-1]

Erläuterung

x = raw_input()       # say 20.96
a , b = x.split('.')  # a = 20 , b = 96
c = a + b             # c = '2096'      # string concatenation , multiplying by 100
d = int(c)<<1         # multiply by 2 by bitshift left , c = 4096
e = str(d).zfill(4)   # zfill pads 0's making the string 
                      # atleast 4 chars which is required 
                      # for decimal notation next

#     divide by 1000 (4) + . (4.) + fraction rounded to 2 decimals (4.09)
print        e[:-3]      +   '.'  +              e[-3:-1]

Technisch gesehen ist dies ein Betrug, da es auf zwei Dezimalstellen verkürzt und nicht gerundet wird, aber ich kann argumentieren, dass es abgerundet wird (besser für Sie, weniger Trinkgeld).

user80551
quelle
Ich denke, Sie können [-3:]anstelle von[-3:-1]
Justin
@Quincunx Kann nicht, das -1 ist auf zwei Dezimalstellen abzuschneiden.
user80551
@ n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̷̰̀ĥ̷̳ Ja, das wurde behoben.
user80551
1

JavaScript 251 (erzwungene Einschränkung: in keiner Weise +, -, *,? Oder%)

Obwohl ich weiß, dass dies nicht gewinnen wird, dachte ich, ich würde versuchen, durch einen sehr strengen Ansatz Brownie-Punkte zu erzielen, und würde nicht einmal daran denken, die eingeschränkten Operatoren in irgendeiner Form zu verwenden diese Schönheit...

A=(x,y)=>{for(;x;)b=x^y,x=(a=x&y)<<1,y=b;return y};D=(x,y,i=x,j=0)=>{for(;i>=y;)i=A(i,A(~y,1)),j=A(j,1);return j};alert(parseFloat((x="00".concat(String(D(prompt().replace(".",""),5)))).substr(0,A(x.length,y=A(~2,1))).concat(".").concat(x.substr(y))))

Ich habe bitweise Operationen verwendet, um die Add-Funktion zu erstellen A, und dann angefangen, von dort aus zu verketten:

Die Ganzzahldivisionsfunktion Dverwendete eine Reihe negierter Additionen (Subtraktion in Form A(x,A(~y,1)einer Schleife; der Rest ist String-Manipulation und Verkettung, um die Verwendung von +Verkettungsoperatoren zu vermeiden).

Die Zahl muss in Dezimalform mit zwei Nachkommastellen angegeben werden, damit dies funktioniert ...

WallyWest
quelle
Ah, es wird jetzt ... obwohl, wenn ich mich an die neuen Regeln halten musste, ich es erweitern musste ... 251 Bytes jetzt ...
WallyWest
1

Perl, 50 60 Bytes

$_=<>;s|\.||;$_<<=1;$_="00$_";m|\d{3}$|;printf'%.2f',"$`.$&"

Die Eingabe wird bei STDIN erwartet. Es muss das Dezimaltrennzeichen mit zwei Dezimalstellen enthalten. Die Ausgabe wird nach STDOUT geschrieben.

Update: Der Schritt $_<<=1entfernt führende Nullen. Daher m|\d{3}$|würde nicht für Rechnungen <1 passen. Daher wurden zehn Bytes $_="00$hinzugefügt, Jetzt 0.00funktioniert sogar .

Beispiele:

  • Eingang: 20.96Ausgang:4.19
  • Eingang: 12.34Ausgang:2.47

Ungolfed-Version:

$_=<>;
s|\.||; # multiply by 100
$_ <<= 1; # multiply by 2
$_="00$_";
m|\d{3}$|; # divide by 1000
printf '%.2f'," $`.$&"

Zuerst wird die Nummer aus STDIN gelesen. Dann wird der Dezimalpunkt entfernt, das heißt mit 100 multipliziert. Dann wird der Betrag durch einen Verschiebeoperator verdoppelt. Dann wird der Dezimalpunkt erneut eingefügt und das Ergebnis gedruckt und auf zwei Dezimalstellen gerundet.

50 Bytes, wenn Rechnung ≥ 1:

Wenn x.xxgrößer oder gleich ist 1.00, können 10 Bytes entfernt werden:

$_=<>;s|\.||;$_<<=1;m|\d{3}$|;printf'%.2f',"$`.$&"
Heiko Oberdiek
quelle
@ n̴̖̋h̷͉̃ã̷͉h̷̭̿d̷̰̀ĥ̷̳: Danke, jetzt behoben.
Heiko Oberdiek
1

JavaScript (ES6) (Regex) 142

Regex ist großartig und kann viele Dinge. Es kann sogar rechnen!

a=('x'.repeat(prompt().replace('.', ''))+'xxxx').match(/^((x*)\2{99}(x{0,99}))\1{4}x{0,4}$/);c=a[3].length;alert(a[2].length+'.'+(c<10?'0'+c:c))

Lesbare Version:

function tip(m) {
    var s = 'x'.repeat(m.replace('.', '')) + 'xxxx';
    var a = s.match(/^((x*)\2{99}(x{0,99}))\1{4}x{0,4}$/);
    var c = a[3].length;
    if (c < 10) c = '0' + c;
    return a[2].length + '.' + c;
}

Die tip()Funktion erwartet ein String-Argument anstelle von Number.

Alle Instanzen *, /, +sind nicht auf mathematische Operationen zusammenhängen.

  • + ist die Verkettung von Zeichenfolgen in allen Fällen, in denen sie verwendet wird.
  • * ist Teil der RegExp-Syntax
  • / ist das Trennzeichen für das RegExp-Literal

Die Eingabe muss verwenden .als Dezimalpunkt, und es müssen zwei Stellen nach dem Komma sein.

Stapel-Snippet

<button onclick = "a=('x'.repeat(prompt().replace('.', ''))+'xxxx').match(/^((x*)\2{99}(x{0,99}))\1{4}x{0,4}$/);c=a[3].length;alert(a[2].length+'.'+(c<10?'0'+c:c))">Try it out</button>

n̴̖̋h̴̖̋ã̷͉h̷̭̿d̷̰̀ĥ̷̳
quelle
0

Haskell 32 Zeichen -20% = 25,6 Zeichen

t y x=log $(^x)$(**0.01)$ exp y

Missbraucht die Tatsache, dass Exponenten zu Multiplikationen in Logarithmen werden.

PyRulez
quelle