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
eval
oder ä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
*
?Antworten:
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
Trick erklärt: 20% wird durch 10 geteilt und mit 2 multipliziert.
quelle
99.99
dies zurückgegeben19.998
, sodass es nicht gemäß OP auf zwei Dezimalstellen aufgerundet wird.J (9 Zeichen)
Eine kurze Antwort in J:
quelle
^
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))Pure Bash,
5043 ZeichenIch bin mir ziemlich sicher, dass das klappt, aber hier ist ein Anfang:
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 warAusgabe:
quelle
/
ist Teil einer Bash-Parameter-Erweiterung und kein Divisionsoperator. Erlaubt oder nicht?Python 98 * 0,8 = 78,4
Python 74 (ohne Bonus)
Hinweis
+
wird für die Verkettung von Zeichenfolgen verwendet*
wird zum Erstellen von Kopien von Zeichenfolgen verwendetUngolfed
Hinweis
Im Geiste der Frage glaube ich, dass die folgende Lösung, obwohl sie allen Regeln der Frage folgt, ein Missbrauch ist
Python 41
Schließlich
Wenn Sie darauf bestehen, dass die mathematischen Symbole verboten sind, ist sie eine 90-Zeichen-Lösung
Python 90 (ohne mathematisches Symbol)
quelle
*
und+
KEYS sind kaputt (wofür du sie verwendest).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 verwendet0.05
.`input`
(Backticks enthalten)raw_input
.APL (9 Zeichen, neuer Code mit 7 Zeichen, fest mit 13 Zeichen)
Berechnen Sie 20% des angegebenen Betrags.
In APL
*
ist der Exponentialoperator.Probieren Sie es online aus .
Aber warum eine Funktion dafür verwenden? Siehe diese neue Version:
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):
quelle
*
nach den Regeln der Herausforderung in keiner mathematischen Form zulässig.*
als Schlüssel verboten ist und nicht als mathematische Bedeutung.^
) 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.×
und÷
erlaubt, sind diese nicht aufgeführt.R
30273634Auf 2 Dezimalstellen gerundet
2 Zeichen dank Plannapus gespeichert
Erstellt einen Vektor von 0 bis x und nimmt das 2. Element.
Beispiel:
Weitere Erklärung:
Erstellt einen Vektor der Länge 6 von 0 bis zum Eingabewert x, wobei die dazwischen liegenden Werte gleich weit voneinander entfernt sind.
Der erste Wert ist dann 0%, der zweite 20%, der dritte 40% usw.
quelle
dc + sed + pipes (44 zeichen)
Meine dritte Antwort (eine APL, eine J und jetzt eine mit dem alten und ehrwürdigen DC).
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).
quelle
dc -e 5o?p|sed 's/\(.\)\./.\1/'|dc -e 5i?p
. Mit diesem und Entfernen vonsed
s-e
s ist dies 42. Aber das Ergebnis ist immer noch nicht spezifizierbar (nicht 2 Dezimalstellen)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
Für die Eingabe einer beliebigen Länge sind zusätzlich 3 Zeichen erforderlich.
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
ldexp
multiplizieren es mit 2.Beachten Sie, dass in dieser Antwort die
+
Zeichenfolgenverkettungsoperatoren und die%
zum Formatieren verwendet werdenprint
.Wenn Sie darauf bestehen, keines dieser Zeichen zu verwenden, finden Sie hier eine Lösung mit 159 Zeichen:
quelle
+
und-
ist zulässig, da die KEYS defekt sind (was auch immer sie in Ihrem Code bedeuten)..split('.')
in meiner Antwort, gehackt eindc + sed - 45 × 0,8 = 36
(Inspiriert von der Antwort von ברוכאל )
Beispielläufe (Eingabe wird über STDIN akzeptiert):
quelle
.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^p
aber es sind 2 Zeichen mehr.-20%
!Mathematica, 19
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 ):
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.
quelle
Log[E^2]
oderLog[E^Input[]]
kann in Kürze geschrieben werden. Es10^-1
kann 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 seinE^.2
, nicht wahr?TI-89 Basic - 39 * 0,8 = 31,2
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
x
undy
, so ist dies viel kürzer, für eine Punktzahl von 17 * 0,8 = 13,6 :Ohne Bonus ( 12 ):
Wenn es jedoch in eine Funktion eingeschlossen werden muss, funktioniert dies ( 38 Zeichen, für 30.4 ):
quelle
Input x,y
??? Arbeitet in 83/84.Input{x,y}
(hat 83/84ln
?)žr¹msmžr.n
- Schamloser Port dieses Codes in 05AB1E.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.
musste es zweimal umkehren, da ich -2 nicht verwenden kann :(
quelle
Python,
81 8089 ZeichenErläuterung
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).
quelle
[-3:]
anstelle von[-3:-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...
Ich habe bitweise Operationen verwendet, um die Add-Funktion zu erstellen
A
, und dann angefangen, von dort aus zu verketten:Die Ganzzahldivisionsfunktion
D
verwendete eine Reihe negierter Additionen (Subtraktion in FormA(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 ...
quelle
Perl,
5060 BytesDie Eingabe wird bei STDIN erwartet. Es muss das Dezimaltrennzeichen mit zwei Dezimalstellen enthalten. Die Ausgabe wird nach STDOUT geschrieben.
Update: Der Schritt
$_<<=1
entfernt führende Nullen. Daherm|\d{3}$|
würde nicht für Rechnungen <1 passen. Daher wurden zehn Bytes$_="00$
hinzugefügt, Jetzt0.00
funktioniert sogar .Beispiele:
20.96
Ausgang:4.19
12.34
Ausgang:2.47
Ungolfed-Version:
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.xx
größer oder gleich ist1.00
, können 10 Bytes entfernt werden:quelle
JavaScript (ES6) (Regex) 142
Regex ist großartig und kann viele Dinge. Es kann sogar rechnen!
Lesbare Version:
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-LiteralDie Eingabe muss verwenden
.
als Dezimalpunkt, und es müssen zwei Stellen nach dem Komma sein.Stapel-Snippet
quelle
Haskell 32 Zeichen -20% = 25,6 Zeichen
Missbraucht die Tatsache, dass Exponenten zu Multiplikationen in Logarithmen werden.
quelle