Ty i przyjaciel wchodzicie do baru. Barman traktuje cię dobrze, więc decydujesz się go napiwić. Wyciągasz zaufany komputer kieszonkowy i piszesz szybki program, który obliczy dla ciebie wskazówkę, ponieważ nie ma wbudowanego kalkulatora. Ale poczekaj! Twoje klucze operatora są zepsute! Twoim zadaniem jest obliczyć 20% napiwek dla dowolnej kwoty wejściowej. Wejścia testowe będą miały postać xx.xx, np. 20,96. Oto zasady:
- Bez użycia następujących operatorów matematycznych:
+ - * / %
(Dzięki Wally West) - Bez użycia wbudowanych funkcji procentowych lub interfejsów API
- Brak dostępu do sieci
- Bez użycia
eval
lub podobne - Brak kalkulatora systemu Windows (tak, ludzie już wcześniej odpowiedzieli)
- Brak wbudowanych funkcji podpowiedzi (nie żeby żaden język miałby taki)
Dane wyjściowe należy zaokrąglić w górę do dwóch miejsc po przecinku.
Wynik oparty jest na długości w bajtach.
-20%, jeśli twój program może zaakceptować dowolną kwotę napiwku. Dane dotyczące kwoty zostaną podane w postaci xx, np. 35, a nie 0,35
*
?Odpowiedzi:
JavaScript 81
EDYCJA : Rezultatem jest teraz prawdziwe zaokrąglenie, nie obcięte.
Nie używaj ŻADNEJ matematyki, tylko manipulacje ciągami i operatory bitowe.
Wszystkie
+
znaki są konkatenacją ciągów lub konwersją ciągów do pływaków .Działa z dowolnym wejściem i wyjściem xx.xx w formacie (x) x.xx
Sztuczka wyjaśniona: 20% jest dzielone przez 10 i mnożone przez 2.
źródło
99.99
zwracane19.998
, więc nie są one „zaokrąglane w górę do dwóch miejsc po przecinku” zgodnie z OP.J (9 znaków)
Krótka odpowiedź w J:
źródło
^
ale tutaj~
oznacza, że kolejność powinna zostać odwrócona;(^.2)
jest log (.2), a inicjałem,^.
który jest wykonywany jako ostatni, jest logarytm wszystkiego, z czego obliczono wcześniej: zatem log (32 ^ log (.2))Pure Bash,
5043 znakówJestem pewien, że to zostanie pokonane, ale oto początek:
Zgodnie z komentarzami:
/
nie jest tutaj operatorem podziału, jest częścią rozszerzenia parametru podstawiania wzorca%
nie jest tutaj operatorem modulo, jest częścią rozszerzenia parametru-
nie jest tutaj operatorem odejmowania, jest negacją, która była dozwolona zgodnie z komentarzamiWynik:
źródło
/
jest częścią rozszerzenia parametru bash, a nie operatorem podziału. Dozwolone czy nie?Python 98 * 0,8 = 78,4
Python 74 (bez premii)
Uwaga
+
służy do łączenia łańcuchów*
służy do tworzenia kopii ciąguNie golfił
Uwaga
W duchu pytania uważam, że poniższe rozwiązanie jest zgodne z wszystkimi zasadami tego pytania i stanowi nadużycie
Python 41
Wreszcie
Jeśli nalegasz, aby symbole matematyczne były zabronione, ma 90-znakowe rozwiązanie
Python 90 (bez żadnego symbolu matematycznego)
źródło
*
i+
są zepsute KLUCZE (do czego ich używasz).No use of the following in mathematical form operators: + - * / % (Thanks Wally West)
. Innymi słowy, pytanie należy przeformułować. I nie użyłem ich w formie matematycznej0.05
.`input`
(backticks w zestawie) zamiastraw_input
.APL (9 znaków, nowy kod z 7 znakami, ustalony z 13 znakami)
Oblicz 20% podanej kwoty.
W APL
*
jest operatorem wykładniczym.Wypróbuj online .
Ale po co do tego używać funkcji? Zobacz nową wersję:
Wypróbuj online .
Proszę, przed oddaniem głosu,
*
nie jest zabronione jako KLUCZ i nie oznacza tutaj mnożenia.OK, oto wersja zaokrąglona do 2 miejsc po przecinku (Dyalog APL):
źródło
*
jest niedozwolone w jakiejkolwiek formie matematycznej zgodnie z regułami wyzwania.*
jest zabroniony jako klucz, a nie jako jego matematyczne znaczenie.^
znaku daszka ( ) dla takiego operatora, lub używane jest wywołanie funkcji. Nie ma specyfikacji przez OP, która*
jest niedozwolona tylko wtedy, gdy jest używana w kontekście mnożenia. Podejrzewam, że byłoby pomocne, gdyby OP miał o tym zadecydować, ustalić, który z nas źle interpretuje reguły wyzwania i wyjaśnić zamieszanie.×
i÷
są dozwolone, nie ma ich na liście.R,
30273634Zaktualizowano do zaokrąglenia do 2 miejsc po przecinku
Uratował 2 postacie dzięki plannapusowi
Tworzy wektor od 0 do x i przyjmuje drugi element.
Przykład:
Dalsze wyjaśnienia:
tworzy wektor o długości 6 od 0 do wartości wejściowej x, z wartościami pomiędzy równo rozmieszczonymi.
Pierwsza wartość wynosi wtedy 0%, druga 20%, trzecia 40% itd.
źródło
dc + sed + pipe (44 znaki)
Moja trzecia odpowiedź (jedna APL, jedna J, a teraz jedna ze starym i czcigodnym dc).
Poprosi o wprowadzenie wartości INTEGER i obliczy 20% w trudny sposób. Dane wejściowe są konwertowane na bazę 5 (łatwe do zrobienia z wieloma innymi narzędziami, ale czekaj ...); kropka jest dodawana przed ostatnią cyfrą z sed (niestety, dc nie radzi sobie bardzo dobrze z łańcuchami), A NASTĘPNIE, dc konwertuje z bazy 5 na liczbę zmiennoprzecinkową (nie wszystkie narzędzia mogą to zrobić).
źródło
dc -e 5o?p|sed 's/\(.\)\./.\1/'|dc -e 5i?p
. Po tym i usunięciused
s-e
, to jest 42. Ale rezultatem wciąż nie jest specyfikacja (nie 2 miejsca po przecinku)Python, 88
Nie jest to wcale takie krótkie, ale pokazuje to, jak należy dokonać normalnego podziału mentalnego na pięć. Zakłada się, że dane wejściowe muszą mieć postać xx.xx
Lub do wprowadzenia dowolnej długości wymagane są dodatkowe 3 znaki.
Objaśnienie: Pobieramy dane wejściowe jako ciąg znaków, a następnie przesuwamy kropkę dziesiętną o jedno miejsce do przodu (dzieląc przez 10). Następnie rzucamy go na liczbę zmiennoprzecinkową i używamy
ldexp
funkcji do pomnożenia przez 2.Zauważ, że w tej odpowiedzi
+
są operatorami konkatenacji łańcuchów i%
służą do formatowaniaprint
.Jeśli nalegasz, aby nie używać żadnego z tych znaków, oto rozwiązanie dla 159 znaków:
źródło
+
i-
są dozwolone, ponieważ klucze są zepsute (cokolwiek oznaczają w twoim kodzie)..split('.')
dc + sed - 45 * 0,8 = 36
(Zainspirowany odpowiedzi przez ברוכאל )
Przykładowe przebiegi (dane wejściowe są akceptowane przez STDIN):
źródło
.0+
idea is great; I voted up for your solution inspired by mine, but some may tell you are using addition; maybe some workaround? I trieddc -e 9k5o?v2^p
but it is 2 characters more.-20%
!Mathematica, 19
No use of the mathematical operators of
+
,-
,*
,/
, or%
. Uses properties of logarithms to calculate the answer; when you simplify the expression, you get.2*Input[]
With the bonus (30 * 0.8 = 24):
Input the percentage first, then the amount.
When you simplify the expression, you get
Input[]*Input[]*.01
.Thanks to ברוכאל for help with shortening the code.
źródło
Log[E^2]
orLog[E^Input[]]
can be written more shortly. Even10^-1
can be written.01
(though I don't use Mathematica but I am pretty sure it can). The whole expression(E^10^-1)^Log[E^2]
seems to be something likeE^.2
, isn't it?TI-89 Basic - 39 * 0.8 = 31.2
Works by inputting the two numbers, then using the logarithm properties to compute
x * y / 100
.If I can assume input from placement in global variables
x
andy
, then this is much shorter, for a score of 17 * 0.8 = 13.6:Without bonus (12):
But if it needs to be wrapped in a function, then this works (38 chars, for 30.4):
źródło
Input x,y
??? Works in 83/84.Input{x,y}
(does 83/84 haveln
?)žr¹msmžr.n
- shameless port of this code into 05AB1E.PHP 107 *.8 = 85.6
can't really run for code-golf with PHP, but at least I can operate on strings. accepts both numbers as command-line arguments.
had to reverse it twice since I can't use -2 :(
źródło
Python,
81 8089 charactersExplanation
Technically, this is cheating as it truncates to two decimals rather than rounding it but I can argue that it rounds down(Better for you, less tip).
źródło
[-3:]
instead of[-3:-1]
JavaScript 251 (forced restriction: no +, -, *, ? or % in any manner)
While I know this won't win, I figured I'd try to get brownie points through taking a very strict approach and not even think about using the restricted operators in any shape or form... as a result, I came up with this beauty...
I used bitwise operations to create the Add function
A
, and then started chaining up from there:The integer division function
D
used a series of Negated Addition (subtraction in the form ofA(x,A(~y,1)
over a loop; the rest is string manipulation and concatenation so as to avoid using+
concatenation operators...The number must be provided in decimal form with two decimal places for this to work...
źródło
Perl,
5060 bytesThe input is expected at STDIN. It must contain the decimal separator with two decimal digits. The output is written to STDOUT.
Update: The step
$_<<=1
removes leading zeroes. Thereforem|\d{3}$|
would not match for bills < 1. Therefore ten bytes$_="00$
were added, Now even0.00
works.Examples:
20.96
, output:4.19
12.34
, output:2.47
Ungolfed version:
First the number is read from STDIN. Then the decimal dot is removed, that is multiplied with 100. Then the amount is doubled by a shifting operator. Then the decimal dot is reinserted and the result is printed and rounded to two decimal digits.
50 bytes, if bill ≥ 1:
If
x.xx
is greater or equal than1.00
, then 10 bytes can be removed:źródło
JavaScript (ES6) (Regex) 142
Regex is great and it can do many things. It can even do maths!
Readable version:
The
tip()
function expects String argument, rather than Number.All instances of
*
,/
,+
are not related to math operations.+
is string concatenation in all instances it is used.*
is part of RegExp syntax/
is the delimiter of RegExp literalThe input must use
.
as decimal point, and there must be 2 digits after decimal point.Stack Snippet
źródło
Haskell 32 Chars -20% = 25.6 Chars
Abuses the fact that exponents become multiplication in logarithms.
źródło