คำนวณทิป


16

คุณและเพื่อนเดินเข้าไปในบาร์ บาร์เทนเดอร์ปฏิบัติต่อคุณเป็นอย่างดีดังนั้นคุณตัดสินใจที่จะทิปเขา ดังนั้นคุณจึงดึงพ็อคเก็ตคอมพิวเตอร์ที่น่าเชื่อถือออกมาและเขียนโปรแกรมด่วนเพื่อคำนวณเคล็ดลับสำหรับคุณเนื่องจากไม่มีเครื่องคิดเลขในตัว แต่เดี๋ยวก่อน! กุญแจตัวดำเนินการของคุณเสีย! งานของคุณคือการคำนวณทิป 20% สำหรับจำนวนเงินที่กำหนด อินพุตทดสอบจะอยู่ในรูปแบบของ xx.xx เช่น 20.96 นี่คือกฎ:

  • ไม่มีการใช้สิ่งต่อไปนี้ในโอเปอเรเตอร์ฟอร์มทางคณิตศาสตร์: + - * / %(ขอบคุณ Wally West)
  • ไม่มีการใช้ฟังก์ชันเปอร์เซ็นต์หรือ APIs ในตัว
  • ไม่มีการเข้าถึงเครือข่าย
  • ไม่มีการใช้evalหรือคล้ายกัน
  • ไม่มี Windows Calculator (มีคนเคยตอบไว้ก่อนหน้านี้)
  • ไม่มีฟังก์ชั่นเคล็ดลับ (ไม่มีภาษาใดจะมี)

ผลลัพธ์ควรถูกปัดเศษทศนิยมสูงสุดสองตำแหน่ง

คะแนนขึ้นอยู่กับความยาวเป็นไบต์

-20%ถ้าโปรแกรมของคุณสามารถรับจำนวนทิปได้ ป้อนจำนวนเงินจะได้รับในรูปแบบของ xx เช่น 35 ไม่ใช่ 0.35


5
@mniip: เคล็ดลับคือจำนวนเงินพิเศษที่แปลกประหลาดที่คุณคาดว่าจะจ่ายที่ร้านอาหารที่ไม่ได้เป็นส่วนหนึ่งของราคาอย่างเป็นทางการ ฉันไม่รู้ว่าพวกเขาทำอย่างนั้นในรัสเซียหรือไม่
user2357112 รองรับ Monica

5
โอ้คนรุ่นใหม่นั้น ... ฉันอยากใช้กระดาษและปากกามากกว่าถ้าฉันไม่สามารถหารตัวเลขด้วย 5 ได้
VisioN

4
@VisioN หมายเหตุ: การหารด้วยห้าจะเท่ากับการหารด้วย 10 จากนั้นคูณด้วย 2 และทั้งสองจะเป็นการดำเนินการทางจิตที่ง่ายมาก
user12205

1
บางคนสามารถอธิบายกฎ: ใช้การดำเนินการที่ต้องห้ามได้หรือไม่ถ้าคุณไม่ใช้โอเปอเรเตอร์เหล่านั้น อนุญาตให้คูณหากคุณไม่ได้ใช้*หรือไม่
Ypnypn

2
@TheDoctor มันซ้ำกันจริงๆ? เพราะมันไม่ได้เพิ่ม
Milo

คำตอบ:


18

Javascript 81

แก้ไข : ผลลัพธ์คือการปัดเศษที่แท้จริงไม่ใช่การปัดเศษ

อย่าใช้คณิตศาสตร์ใด ๆที่นี่เพียงแค่การจัดการสตริงและตัวดำเนินการระดับบิต ถ่าน
ทั้งหมด+คือการต่อสตริงหรือสตริงที่จะแปลงลอย
ใช้ได้กับอินพุตและเอาต์พุต xx.xx ใด ๆ ในรูปแบบ (x) x.xx

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

เคล็ดลับอธิบาย: 20% หารด้วย 10 และคูณด้วย 2

  • ทำให้การหารด้วย 10 โดยการย้ายจุดไปทางซ้าย (การจัดการสตริง)
  • คูณแต่ละส่วนด้วย 2 โดยเลื่อนบิตไปทางซ้าย (การทำงานระดับบิต)

เมื่ออินพุตคือ99.99สิ่งนี้จะส่งคืน19.998ดังนั้นจึงไม่ "ปัดเศษทศนิยมสองตำแหน่งเป็น" ตาม OP
Geobits

2
อืมนี่เป็นวิธีแก้ปัญหาที่ยาว แต่มี 12 upvotes เกิดอะไรขึ้นกับการลงคะแนนรหัสของกอล์ฟ
Justin

@Quincunx ใช่คุณพูดถูกไม่ใช่การประกวดความนิยม!
Mukul Kumar

เนื่องจากมันเป็น code-golf ฉันอาจจะไม่ชนะ แต่นี่ไม่ได้หมายความว่าคนไม่ชอบวิธีการแก้ปัญหาของฉัน ... บ่อยครั้งผู้ชนะ code-golf ไม่ใช่ผู้ที่มี upvotes มากที่สุด
Michael M.

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ อย่างแน่นอน! ขอบคุณที่ชี้นำสิ่งนี้ แก้ไขแล้วตอนนี้ :)
Michael M.

6

J (9 ตัวอักษร)

คำตอบสั้น ๆ ใน J:

^.(^.2)^~ 32

1
... และฉันไม่พูด J มันพูดอะไร?
CousinCocaine

มันบอกว่า: คำนวณ 32 ยกขึ้นสู่อำนาจ (2); โดยปกติแล้วเลขชี้กำลังอยู่ทางด้านขวา^แต่ที่นี่~บ่งชี้ว่าควรมีการกลับคำสั่งซื้อ (^.2)คือ log (.2) และค่าเริ่มต้น^.ซึ่งดำเนินการครั้งสุดท้ายคือลอการิทึมของทุกสิ่งที่คำนวณอย่างชัดเจน: ดังนั้น log (32 ^ log (.2))
Thomas Baruchel

4

ทุบตีบริสุทธิ์50 43 ตัวอักษร

ค่อนข้างแน่ใจว่านี่จะชนะ แต่นี่เป็นการเริ่มต้น:

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

ตามความเห็น:

  • / ไม่ใช่ตัวดำเนินการหารที่นี่มันเป็นส่วนหนึ่งของการทดแทนรูปแบบ ขยายพารามิเตอร์การ
  • % ไม่ใช่ตัวดำเนินการ modulo ที่นี่เป็นส่วนหนึ่งของการขยายพารามิเตอร์
  • - ไม่ใช่ตัวดำเนินการลบที่นี่มันเป็นการปฏิเสธซึ่งได้รับอนุญาตตามความคิดเห็น

เอาท์พุท:

$ ./20pct.sh 0.96
.19
$ ./20pct.sh 20.96
4.19
$ ./20pct.sh 1,020.96
204.19
$ 

ฉันคิดว่าฉันเห็นสแลชข้างใน
Milo

@Milo ที่/เป็นส่วนหนึ่งของการขยายพารามิเตอร์ bashและไม่ใช่ตัวดำเนินการหาร อนุญาตหรือไม่
บาดเจ็บทางดิจิทัล

1
ฉันจะให้มันก็ไม่ได้เป็นผู้ประกอบการทางคณิตศาสตร์ในกรณีนี้ ...
WallyWest

1
-3 ทำหน้าที่เป็นการปฏิเสธไม่ใช่การลบ ... @Milo คุณต้องคำนึงถึงการปฏิเสธและวิธีการอื่น ๆ ที่ตัวดำเนินการเหล่านี้สามารถใช้นอกเหนือจากการเทียบเท่าทางคณิตศาสตร์ของพวกเขา ... ตัวอย่างเช่น + สามารถใช้เป็น concatenator ใน JavaScript .. ฉันขอคำแนะนำได้ไหม? เปลี่ยน"ไม่มีการใช้งานของตัวดำเนินการต่อไปนี้: + - * /%"เป็น"ไม่ใช้ตัวดำเนินการต่อไปนี้ในรูปแบบทางคณิตศาสตร์ของพวกเขา: + - * /%"
WallyWest

2
@WallyWest ในการเล่นผู้สนับสนุนของปีศาจการปฏิเสธที่นี่ยังคงเป็นตัวดำเนินการทางคณิตศาสตร์ บางที"ไม่มีการใช้โอเปอเรเตอร์ต่อไปนี้ในรูปแบบทางคณิตศาสตร์ที่ไม่ใช่เอกสิทธิ์ของพวกเขา: + - * /%" ;-)
Digital 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 (ไม่รวมโบนัส)

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

บันทึก

  • + ใช้สำหรับการต่อสตริง
  • * ใช้เพื่อสร้างสำเนาของสตริง

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:])

บันทึก

ด้วยจิตวิญญาณของคำถามฉันเชื่อว่าวิธีแก้ไขปัญหาต่อไปนี้ แต่การปฏิบัติตามกฎทั้งหมดของคำถามเป็นการละเมิด

Python 41

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

ในที่สุด

หากคุณยืนยันว่าสัญลักษณ์ทางคณิตศาสตร์เป็นสิ่งต้องห้ามเธอเป็นตัวละคร 90 ตัว

Python 90 (ไม่มีสัญลักษณ์ทางคณิตศาสตร์ใด ๆ )

print' '.join(str(int(raw_input().replace(".",""))<<1)).replace(' ','.',1).replace(' ','')

1
ดังที่ได้กล่าวไปแล้ว*และ+มีคีย์แตก (สิ่งที่คุณใช้เพื่อ)
Thomas Baruchel

2
@ No use of the following in mathematical form operators: + - * / % (Thanks Wally West)ברוכאל: กล่าวอีกนัยหนึ่งคำถามจะต้อง rephrased และฉันไม่ได้ใช้พวกเขาในรูปแบบคณิตศาสตร์
Abhijit

ตกลง แต่ในกรณีนี้ downvote ของ APL solution นั้นไม่ยุติธรรมเลยเพราะไม่มีวิธีอื่นที่ downvote ด้วยเหตุผล
Thomas Baruchel

คำตอบของคุณกำลังจะมีปัญหากับจำนวนเงินที่น้อย0.05เกินไปเช่น
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

คุณสามารถใช้`input`(backticks รวม) raw_inputแทน
nyuszika7h

4

APL (9 ตัวอักษร, รหัสใหม่ที่มี 7 ตัวอักษร, แก้ไขด้วย 13 ตัวอักษร)

คำนวณ 20% ของจำนวนเงินที่ระบุ

{⍟⍵*⍨*.2} 32

ใน APL *เป็นตัวดำเนินการเอ็กซ์โปเนนเชียล

ลองมันออนไลน์

แต่ทำไมถึงใช้ฟังก์ชั่นสำหรับเรื่องนั้น? ดูเวอร์ชั่นใหม่นี้:

⍟(*.2)* 32

ลองมันออนไลน์

โปรดก่อนที่จะทำการ downvoting สิ่ง*นี้ไม่ได้ถูกห้ามเป็นกุญแจและมันไม่ได้หมายถึงการคูณที่นี่

ตกลงนี่คือการปัดเศษทศนิยมเป็น 2 ทศนิยม (Dyalog APL):

⎕PP←2⋄⍟(*.2)* 32.01

2
การยกกำลังยังคงเป็นการดำเนินการทางคณิตศาสตร์และ*ไม่ได้รับอนุญาตในรูปแบบทางคณิตศาสตร์ใด ๆ ตามกฎของการท้าทาย
Tony Ellis

การยกกำลังไม่ได้ถูก fobidden ที่นี่และวิธีแก้ปัญหาอื่น ๆ ใช้จริง แต่คุณมีสิทธิ์เกี่ยวกับความจริงที่*ถูกห้ามเป็นกุญแจและไม่ใช่ความหมายทางคณิตศาสตร์
โทมัสบารูเชล

@Tony H. ได้โปรดคุณสามารถลบ downvote ของคุณได้เนื่องจากความคิดเห็นทั้งหมดในโซลูชันอื่น ๆ ดูเหมือนว่าในที่สุดก็ยอมรับคีย์ดังกล่าวตราบใดที่พวกเขาไม่ได้ใช้สำหรับการดำเนินการทางคณิตศาสตร์ที่ต้องห้ามในรายการเริ่มต้น
โทมัสบารูเชล

1
@ ברוכאלฉันเข้าใจว่าการใช้เครื่องหมายดอกจันในลักษณะใด ๆ ที่เกี่ยวข้องกับความหมายทางคณิตศาสตร์นั้นเป็นสิ่งต้องห้ามซึ่งรวมถึงการยกกำลังด้วย ทุกคำตอบอื่น ๆ จนถึงขณะนี้ที่ใช้ exponents อยู่ในภาษาที่ใช้ caret ( ^) สำหรับผู้ประกอบการดังกล่าวหรือการใช้ฟังก์ชั่นการโทร ไม่มีสเปคจาก OP ที่*ไม่ได้รับอนุญาตเฉพาะเมื่อมันถูกใช้ในบริบทของการคูณ ฉันสงสัยว่ามันจะมีประโยชน์ถ้า OP มีการปกครองในเรื่องนี้เพื่อตัดสินว่าหนึ่งในเรากำลังตีความกฎของการท้าทายและเพื่อขจัดความสับสน
Tony Ellis

1
บางทีอาจจะเป็น×และ÷มีการอนุญาตให้ผู้ที่ไม่ได้ระบุไว้
marinus

4

R, 30 27 36 34 34

อัปเดตเป็นปัดเศษทศนิยม 2 ตำแหน่ง

บันทึก 2 ตัวละครด้วย plannapus

สร้างเวกเตอร์จาก 0 ถึง x และใช้องค์ประกอบที่ 2

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

ตัวอย่าง:

> a(20.36)
[1] 4.07

คำอธิบายเพิ่มเติม:

seq(0,x,len=6)

สร้างเวกเตอร์ที่มีความยาว 6 จาก 0 ถึงค่าอินพุต x โดยมีค่าอยู่ระหว่างเว้นระยะเท่ากัน

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

ค่าแรกคือ 0%, 20% ที่สอง, 40% ที่สามเป็นต้น


รออะไร ? โปรดให้รายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงานสำหรับผู้ที่ไม่รู้จักอาร์
ไมเคิลเอ็ม

@Michael อัปเดตคำตอบของฉันเพื่ออธิบายรหัส
Rift

ทางออกของคุณจะไม่ปัดเศษ
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ คุณพูดถูก (แต่คำตอบส่วนใหญ่ไม่ได้ปัดเศษอะไร) อักขระพิเศษ 9 ตัวจะทำการปัดเศษ "ปกติ" การปัดเศษเท่านั้นจะยากกว่านี้ ...
ระแหง

@ ระแหง: ฉันได้ทดสอบคำตอบหลายอย่าง (ส่วนใหญ่คือ Python, JS และ Perl เนื่องจากพวกมันใช้งานได้ง่าย) และส่วนใหญ่จะปัดเศษ ไม่มีใครที่ฉันได้ทำการทดสอบแล้ว
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

3

dc + sed + pipes (44 ตัวอักษร)

คำตอบที่สามของฉัน (หนึ่ง APL, หนึ่ง J, และตอนนี้หนึ่งคำตอบด้วย dc เก่าและเคารพ)

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

มันจะขออินพุทแบบ INTEGER และคำนวณ 20% ด้วยวิธีที่ยุ่งยาก อินพุตถูกแปลงเป็นฐาน 5 (ง่ายต่อการใช้เครื่องมืออื่น ๆ อีกมากมาย แต่รอ ... ); จุดต่อท้ายตัวเลขสุดท้ายด้วย sed (น่าเสียดายที่ dc ไม่สามารถจัดการกับสตริงได้ดีมาก) และจากนั้น dc แปลงกลับจากฐาน 5 ในจำนวนลอยตัว (ไม่ใช่เครื่องมือทั้งหมดที่สามารถทำได้)


1
"อินพุต INTEGER" ไม่ตรงตามข้อกำหนด ฉันคิดว่าคุณสามารถแก้ไขได้ด้วยการเปลี่ยนการแสดงออกของคุณ: dc -e 5o?p|sed 's/\(.\)\./.\1/'|dc -e 5i?p. ด้วยสิ่งนี้และการลบseds -eนี่คือ 42 แต่ผลที่ได้ยังไม่ได้ระบุ (ไม่ใช่ทศนิยม 2 ตำแหน่ง)
Digital Trauma

@DigitalTrauma คุณพูดถูก แต่วิธีการแก้ปัญหานี้ค่อนข้างเป็นข้อพิสูจน์แนวคิดและฉันก็สนใจคุณสมบัติที่ผิดปกติของการแปลงฐานใน dc (และใน bc) ขอบคุณสำหรับความคิดเห็นและการแก้ไขของคุณ
Thomas Baruchel

2

Python, 88

นี่ไม่ใช่ที่ใกล้สั้น แต่นี่แสดงให้เห็นว่าควรแบ่งจิตปกติโดยห้า สมมติว่าอินพุตนั้นต้องอยู่ในรูปแบบ xx.xx

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

หรือสำหรับการป้อนข้อมูลที่มีความยาวใด ๆ จำเป็นต้องเพิ่ม 3 ตัวอักษร

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

คำอธิบาย: เรารับอินพุตเป็นสตริงจากนั้นเลื่อนจุดทศนิยมไปข้างหน้าหนึ่งตำแหน่ง (หารด้วย 10) จากนั้นเราก็โยนมันให้ลอยและใช้ldexpฟังก์ชันเพื่อคูณด้วย 2

โปรดทราบว่าในคำตอบนี้+มีผู้ประกอบการ concatenation สตริงและจะใช้ในรูปแบบ%print

หากคุณยืนยันที่จะไม่ใช้ตัวอักษรใด ๆ ต่อไปนี้เป็นตัวละคร 159 ตัว:

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]])

พูดไปแล้วสำหรับคำตอบอื่น ๆ อีกมากมาย แต่ฉันไม่คิดอย่างนั้น+และ-ได้รับอนุญาตตั้งแต่ KEYS เสีย (สิ่งที่พวกเขาหมายถึงในรหัสของคุณ)
โทมัสบารูเชล

@ ברוכאל: ดูการตอบสนองต่อความคิดเห็นของคุณในคำตอบของฉัน
Abhijit

ใช้.split('.')คำตอบของฉันสับถ่านหนึ่งตัว
user80551

2

dc + sed - 45 * 0.8 = 36

(แรงบันดาลใจจากคำตอบโดยברוכאל )

  • จัดการจำนวนทิปใด ๆ (จำนวนเต็มหรือลอย)

ตัวอย่างการรัน (อินพุตยอมรับผ่าน STDIN):

$ 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

.0+ความคิดที่ดี; ฉันโหวตให้โซลูชันของคุณได้รับแรงบันดาลใจจากฉัน แต่บางคนอาจบอกว่าคุณกำลังใช้การเพิ่ม บางทีวิธีแก้ปัญหาบางอย่าง? ฉันพยายามdc -e 9k5o?v2^pแต่มันมี 2 ตัวอักษรมากกว่านี้
Thomas Baruchel

@ ברוכאלฉันไม่ได้ตระหนักว่าเครื่องหมาย + แม้ในบริบทนี้อาจมีคุณสมบัติเป็นการเพิ่ม
devnull

@ ברוכאלฉันจะลบอันนี้ ขอให้คุณแก้ไขของคุณเพื่อให้สามารถจัดการกับลอยตัวและมีคุณสมบัติได้-20%!
devnull

2

Mathematica, 19

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

ไม่มีการใช้งานของผู้ประกอบการทางคณิตศาสตร์ของ+, -, *, หรือ/ %ใช้คุณสมบัติของลอการิทึมเพื่อคำนวณคำตอบ เมื่อคุณทำให้นิพจน์ง่ายขึ้นคุณจะได้รับ.2*Input[]

ด้วยโบนัส ( 30 * 0.8 = 24 ):

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

ป้อนเปอร์เซ็นต์ก่อนจากนั้นจำนวน

Input[]*Input[]*.01เมื่อคุณลดความซับซ้อนของการแสดงออกของคุณจะได้รับ

ขอบคุณברוכאלสำหรับความช่วยเหลือในการย่อรหัส


3
คุณแน่ใจหรือไม่ว่าไม่สามารถทำให้ง่ายขึ้นได้? ถึงฉันLog[E^2]หรือLog[E^Input[]]สามารถเขียนได้เร็ว ๆ นี้ แม้10^-1สามารถเขียนได้.01(แม้ว่าฉันจะไม่ใช้ Mathematica แต่ฉันค่อนข้างมั่นใจว่ามันสามารถ) การแสดงออกทั้งหมด(E^10^-1)^Log[E^2]ดูเหมือนจะเป็นอย่างE^.2นั้นใช่ไหม
โทมัสบารูเชล

1

พื้นฐาน TI-89 - 39 * 0.8 = 31.2

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

x * y / 100ทำงานโดยการป้อนตัวเลขสองแล้วใช้คุณสมบัติลอการิทึมในการคำนวณ

หากฉันสามารถสมมติว่าอินพุตจากตำแหน่งในตัวแปรโกลบอลxและyจากนั้นจะสั้นกว่ามากสำหรับคะแนน17 * 0.8 = 13.6 :

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

ไม่รวมโบนัส ( 12 ):

ln((e^.2)^x)

แต่ถ้ามันจะต้องถูกห่อในฟังก์ชั่นแล้วงานนี้ ( 38ตัวอักษรสำหรับ30.4 ):

:f(x,y):Func:ln(((e^y)^.01)^x):EndFunc

โปรดดูความคิดเห็นของฉันต่อโซลูชันอื่นของคุณ (ใน Mathematica); รหัสนี้สามารถทำให้ง่ายขึ้นมากจริงๆ
โทมัสบารูเชล

Input x,y??? ทำงานได้ใน 83/84
Timtech

@Timtech ใช้งานไม่ได้ใน 89 แต่บางทีฉันสามารถทำสิ่งที่ชอบInput{x,y}(83/84 มีln?)
Justin

@Quincunx ใช่เห็นคำตอบใหม่ของฉัน
Timtech

žr¹msmžr.n- พอร์ตไร้ยางอายของรหัสนี้เป็น 05AB1E
Magic Octopus Urn

1

PHP 107 * .8 = 85.6

ไม่สามารถรันโค้ดกอล์ฟด้วย PHP ได้ แต่อย่างน้อยฉันก็สามารถใช้งานกับสตริงได้ ยอมรับทั้งสองหมายเลขเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

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

ต้องย้อนกลับสองครั้งเนื่องจากฉันไม่สามารถใช้ -2 :(


1

Python, 81 80 89 ตัวอักษร

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

คำอธิบาย

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]

ในทางเทคนิคนี่เป็นการโกงเพราะมันตัดทอนเป็นสองทศนิยมแทนที่จะปัดเศษ แต่ฉันสามารถยืนยันได้ว่ามันปัดลง (ดีกว่าสำหรับคุณเคล็ดลับน้อยกว่า)


ฉันคิดว่าคุณสามารถทำได้[-3:]แทน[-3:-1]
Justin

@Quincunx ไม่สามารถ -1 จะตัดทอนทศนิยมสองครั้ง
user80551

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ ใช่แก้ไขแล้ว
user80551

1

JavaScript 251 (ข้อ จำกัด บังคับ: no +, -, *,? หรือ% ในลักษณะใด ๆ )

ในขณะที่ฉันรู้ว่าสิ่งนี้จะไม่ชนะฉันคิดว่าฉันพยายามที่จะได้รับคะแนนบราวนี่ผ่านวิธีการที่เข้มงวดมากและไม่คิดถึงการใช้ตัวดำเนินการที่ถูก จำกัด ในรูปแบบหรือรูปแบบใด ๆ ... ด้วยเหตุนี้ฉันจึงคิด ความงามนี้ ...

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))))

ฉันใช้การดำเนินการระดับบิตเพื่อสร้างฟังก์ชั่นเพิ่มAแล้วเริ่มผูกมัดจากที่นั่น:

ฟังก์ชันการหารจำนวนเต็มDใช้ชุดของลบส่วนบวก (ลบในรูปแบบของA(x,A(~y,1)การวนรอบส่วนที่เหลือคือการจัดการสตริงและการต่อข้อมูลเพื่อหลีกเลี่ยงการใช้+ตัวดำเนินการเชื่อมต่อ ...

ต้องระบุหมายเลขในรูปแบบทศนิยมโดยมีทศนิยมสองตำแหน่งเพื่อให้ทำงาน ...


อาตอนนี้มันจะ ... แม้ว่าถ้าฉันต้องทำตามกฎใหม่ฉันต้องขยายมัน ... 251 bytes ตอนนี้ ...
WallyWest

1

Perl, 50 60 ไบต์

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

คาดว่าอินพุตที่ STDIN มันจะต้องมีตัวคั่นทศนิยมที่มีทศนิยมสองหลัก เอาต์พุตถูกเขียนไปยัง STDOUT

อัปเดต:ขั้นตอน$_<<=1จะลบศูนย์นำหน้า ดังนั้นm|\d{3}$|จะไม่ตรงกับค่า <1 ดังนั้นจึง$_="00$เพิ่มสิบไบต์ตอนนี้0.00งานได้แล้ว

ตัวอย่าง:

  • อินพุต: 20.96, เอาต์พุต:4.19
  • อินพุต: 12.34, เอาต์พุต:2.47

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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

อันดับแรกอ่านจาก STDIN จากนั้นจุดทศนิยมจะถูกลบออกซึ่งจะถูกคูณด้วย 100 จากนั้นจำนวนเงินจะเพิ่มขึ้นเป็นสองเท่าโดยผู้ดำเนินการขยับ จากนั้นจุดทศนิยมจะถูกแทรกเข้าไปใหม่และผลลัพธ์จะถูกพิมพ์และปัดเศษเป็นทศนิยมสองหลัก

50 ไบต์หากบิล≥ 1:

หากx.xxมากกว่าหรือเท่ากับ1.0010 ไบต์สามารถลบได้:

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

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳: ขอบคุณแก้ไขแล้ว
Heiko Oberdiek

1

JavaScript (ES6) (Regex) 142

Regex นั้นยอดเยี่ยมและสามารถทำอะไรได้หลายอย่าง มันสามารถทำคณิตศาสตร์ได้!

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))

รุ่นที่อ่านได้:

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;
}

tip()ฟังก์ชั่นคาดว่าอาร์กิวเมนต์สตริงมากกว่าจำนวน

ทุกกรณี*, /, +ไม่เกี่ยวข้องกับการดำเนินการทางคณิตศาสตร์

  • + คือการต่อสตริงในทุกกรณีที่ใช้
  • * เป็นส่วนหนึ่งของไวยากรณ์ RegExp
  • / เป็นตัวคั่นของตัวอักษร RegExp

อินพุตต้องใช้.เป็นจุดทศนิยมและต้องมี 2 ​​หลักหลังจุดทศนิยม

กองย่อย

<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>


0

Haskell 32 Chars -20% = 25.6 Chars

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

การละเมิดความจริงที่ว่าเลขชี้กำลังกลายเป็นการคูณในลอการิทึม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.