ขอย่อตัวเลขเหล่านั้น! ตอนนี้ย้อนกลับ?


11

บทนำ:

เช่น Twitter และ Instagram และอื่น ๆ ผมอยากจะแสดงผลตัวเลขเหมือน1.2Kและ3.8 Mแทนหรือ1,2223,823,456

แต่นั่นไม่ใช่ทั้งหมด! อย่างที่เราทุกคนรู้ว่าอาจมีมนุษย์บางคนที่ไม่ชอบตัวย่อเหล่านี้อย่างแน่นอนและจะพยายามที่จะกลับพวกเขา ดังนั้น1.2kจะกลายเป็น1,200และจะกลายเป็น3.8 M3,800,000

งาน:

  • งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่แปลงรายการของตัวเลข ( ซึ่งได้รับเป็นสตริง ) เป็นคู่ตัวย่อและในทางกลับกัน

ตัวอย่างเช่นหากรายการอินพุต (หรือใด ๆSTDIN) เป็น['1.4k', '1,234,567', '7.99M']เช่นนั้นคุณควรส่งออก:

['1,400', '1.2M', '7,990,000']

คุณสามารถทำตามสคีมาต่อไปสำหรับตัวย่อ:

  • 10 3 -> หนึ่งกิโลกรัม -> K
  • 10 6 -> หนึ่งล้าน -> M
  • 10 9 -> หนึ่งพันล้าน -> B

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

กฎและข้อ จำกัด :

  • คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่านSTDIN(หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและแสดงผลลัพธ์ผ่านทางSTDOUT(หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือฟังก์ชัน (ออก)
  • อินพุตอาจอยู่ในรายการหรือรูปแบบสตริงที่สะดวก คุณอาจสันนิษฐานว่ารายการนั้นน้อยกว่าแต่ละรายการและรายการนั้นมีองค์ประกอบอย่างน้อยหนึ่งรายการai231
  • แต่ละตัวย่อจะมีเพียงหนึ่งตัว .ในขณะที่หมายเลขปกติจะมีจำนวนมาก , ที่สุดเท่าที่จำเป็น (คุณอาจคิดว่าตัวเลขนี้จะไม่ถูกเปลี่ยนแปลง)
  • คุณอาจไม่ได้ป้อนหมายเลข'123456'แต่ต้องการ123,456
  • ใช้กฎมาตรฐานของ

กรณีทดสอบ:

Input: ['1.5M', '77.6k', '123,456,789']         Output: ['1,500,000', '77,600', '123.4M']
Input: ['3,000,000,000', '581k', '2b']          Output: ['3B', '581,000', '2,000,000,000']
Input: ['0.1k']                                 Output: ['100']
Input: ['888', '33']                            Output: ['0.888k', '0.033k']

ชี้แจง:

  • สำหรับตัวเลข <1,000 หลังจุดทศนิยมในเอาต์พุตตัวย่อคุณควรมีตัวเลขให้มากที่สุดเท่าที่จำเป็นเพื่อให้ได้ผลลัพธ์ที่ถูกต้อง (เช่น: 2-> จะกลายเป็น0.002k) - ที่หมายถึงทศนิยม 3 ตำแหน่งที่มากที่สุด ; สำหรับตัวเลข> 1,000 คุณสามารถมีทศนิยมได้สูงสุด 1ตัว
  • ตัวย่ออาจเป็นทั้งตัวเล็กและตัวใหญ่
  • ฉันลบข้อ จำกัด ในตัวตามที่แนะนำในความคิดเห็น

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!


1
ร้องขอเพื่อความกระจ่าง: มีกี่หลักหลังจุดทศนิยมในเอาต์พุตตัวย่อ? จะย่อหมายเลข <1,000 ได้อย่างไร? เป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กหรือทั้งในอินพุตและเอาต์พุต
edc65

1
ไม่ควร'123,456,789' -> '123.4M'? นอกจากนี้ยังไม่ได้อธิบายถึงจำนวนทศนิยมที่ใช้ อะไรก็ตามที่อยู่ภายใต้ 1,000 นั้นไม่ควรที่จะย่อตัว
Kade

1
@ anonymous2 อ่านกฎข้อที่สาม
Grajdeanu Alex

4
"คุณไม่ได้รับอนุญาตให้ใช้โมดูล / ฟังก์ชั่นในตัว" ฟังก์ชั่นใด ๆในตัว?
Alex Howansky

1
การใช้งานของคุณ "กิโลกรัม" แสดงให้เห็นคำนำหน้า SI ["k", "M", "G"]และผู้ที่จะเป็น "ในขณะที่หมายเลขปกติจะมีจำนวนมากเท่าที่จำเป็น " หมายถึงในประเทศของฉันมันจะเป็นความผิดพลาดที่จะใช้ใด ๆ
Angs

คำตอบ:


2

PHP, 234 224 213 201 205 ไบต์

for(;$x=$argv[++$n];){$y=str_replace(",","",$x)/1e3;for($i=0;$y>999;$i++)$y=($y|0)/1e3;echo(A<$c=substr($x,strlen($x)-1))?number_format($x*[k=>1e3,m=>1e6,b=>1e9][$c]):($i?($y*10|0)/10:$y).kmb[$i]," ";}

6 ไบต์บันทึกโดยใช้ชื่อผู้ใช้ที่นี่, 4 ไบต์ได้รับแรงบันดาลใจจากสิ่งนั้น


  • รับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งพิมพ์ผลการเว้นวรรคด้วยตัวคั่นต่อท้าย
  • คาดว่าตัวย่อของตัวพิมพ์เล็ก
  • ทำงานด้วย -r

-2 ไบต์ถ้าขีดเป็นตัวคั่นเป็น ok: แทนที่ด้วย" " -1 ไบต์ถ้าปัดเศษที่ถูกต้องคือ ok: แทนที่ด้วย -17 ไบต์สำหรับ PHP 7.1: แทนที่ด้วย_
($y*10|0)/10round($y,1)
substr($x,strlen($x)-1)$x[-1]


80 (63) ไบต์สำหรับการขยายหนึ่งอาร์กิวเมนต์เท่านั้น:

<?=number_format(($x=$argv[1])*[K=>1e3,M=>1e6,B=>1e9][substr($x,strlen($x)-1)]);

บันทึกไปยังแฟ้มแล้วรัน (หรือเปลี่ยน<?=กับechoพื้นที่และ Run + -rกับ


ตัวอย่างที่สองของคุณไม่ได้รวบรวม
Alex Howansky

1
คุณมี parens ที่ไม่สมดุล
Alex Howansky

1
-4 bytes: for($j=1;$x=$argv[$j++];) - แทนforeach($argv as$i=>$x)if($i)
insertusername ที่นี่

1
-2 ไบต์: kmb[$i] - "kmb"[$i]แทน
แทรกชื่อผู้ใช้ ณ

1
@insertusernamehere ดัชนีสตริงเชิงลบกำลังมาใน PHP 7.1; และนั่นคือ RC (ยัง) ขอบคุณสำหรับไบต์อื่น ๆ !
ติตัส

2

JavaScript, 545 524 522 518 514 508 504 498 494 214 ไบต์

ขอบคุณ @ETHproductions สำหรับการบันทึก 180 ไบต์!

d=F=>F.map(f=>1/f.slice(-1)?f=(f=f.replace(/,/g,""))[9]?(f/1e8|0)/10+"B":f[6]?(f/1e5|0)/10+"M":f/1e3+"k":R(R(f.slice(0,-1)+"e"+' kMB'.indexOf(f.substr(-1))*3-0+"").match(/.{1,3}/g)+""),R=x=>[...x].reverse().join``)

วิธีเรียกใช้ฟังก์ชัน:

d(["1.5M","1,500,000"]) //["1,500,500","1.5M"]

เอาต์พุตเป็นalert, โดยที่แต่ละรายการalertมีองค์ประกอบที่แตกต่างกันของอินพุต

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

d = F => F.map(f => 1 / f.slice(-1) ? f = (f = f.replace(/,/g, ""))[9] ? (f / 1e8 | 0) / 10 + "B" : f[6] ? (f / 1e5 | 0) / 10 + "M" : f / 1e3 + "k" : R(R(f.slice(0, -1) + "e" + ' kMB'.indexOf(f.substr(-1)) * 3 - 0 + "").match(/.{1,3}/g) + ""), R = x => [...x].reverse().join ``)

บทสรุปของการแก้ไข:ฟังก์ชันที่แปลงเป็นฟังก์ชันลูกศร

  • ลบ semi-colons ';'
  • ลบออก var
  • แปลงเป็นฟังก์ชันลูกศร
  • แผนที่ที่ใช้ในการวนซ้ำผ่านองค์ประกอบแต่ละส่วนของอาร์เรย์
  • ใช้|0แทนพื้น
  • ใช้ regex สำหรับการทดสอบ
  • ใช้ตัวดำเนินการที่ประกอบไปด้วยคำสั่งแทนที่ if-else
  • รวมฟังก์ชั่นแยกต่างหากสำหรับ .reverse().join''

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