İtibarı biçimlendirin


13

Muhtemelen Stack Exchange'deki farklı itibar seviyelerinin, sorular sayfasından / gönderiden bakıldığında farklı biçimlendirildiğini biliyorsunuzdur. Tüm yeniden biçimlendirme kuralları vardır:

  • bir kullanıcının 1 ila 999 (bir ila üç basamaklı) temsilcisi varsa, olduğu gibi kalır.
  • bir kullanıcının 1000 ila 9999 rep (dört basamaklı) değeri varsa, virgül ayırıcı olarak alınır: 9,999
  • Bir kullanıcının 10000 ila 99999 rep (beş basamaklı) numarası varsa, kısaltılır ve yuvarlanır. Yani, 16741 rep, 16.7kalt rep için virgülün aksine (önceki nokta) nokta ayırıcıya dikkat edin.

    1. 16750 zaten sonuçlanacak 16.8k(bu düzeltilmiş gibi görünüyor )

    2. 16941 16.9k, 17014'e 17kkadar olduğu gibi 16950 mermi ile sonuçlanır .

    3. 99941 mermi 99.9k, 99950 mermi 100k(bu , SE'deki yeniden yuvarlamadan gerçekten nefret ettiğim bir şeydir, çünkü 100.000 böyle bir kilometre taşıdır ve 99950 hiçbir yere yakın değildir).

  • Bir kullanıcının 100000 ila 999999 temsilcisi varsa, bu şekilde yuvarlanır:

    1. 100100 tur 100k, 100500 tur 101k. Şey, yuvarlama yapılır, ancak ondalık kısım soyulur (dört basamaklı rep'den farklı olarak).

    2. 100450 aşağı doğru yuvarlar 100k, 450'den 500'e yuvarlanmak için bir adım olmaz 100k.

    3. 279843 en fazla 280kve 399999 en fazla 400k.

Girdi olarak, size ham itibar verilir ve biçimlendirilmiş olarak çıktılanır.

O girdi düşünebiliriz olmaz , sıfır dolgulu yani herhangi geçersiz numaraları / olmayan numaralar, veya sayıları almak 0001234.

Jon Skeet yakında 1.000.000'a ulaşmıyor gibi göründüğü için, kodunuzun mümkün olduğunca kısa olması gerekir, bu temsilciyi bir milyondan fazla kullanmanız gerekmez (yani 999500 ve üstü için özel durumlar yoktur).


7
"Çünkü Jon Skeet yakında 1.000.000'e ulaşmıyor gibi görünüyor" [alıntı gerekli]
Milo Brandt

@Milo Easy - 2015 için 93 bin kazandı. 1.000.000'a kadar 163.685 kaldı, bu yüzden onu 1,5 yıldan fazla sürecek (neredeyse 2, söyleyebilirim). Bununla, yıllık temsilcisinin 2011'den bu yana her yıl azaldığını da dikkate almalısınız. 2011: 134.7k, 2012: 131.8k, 2013: 116.8k, 2014: 104.3k, 2015: 94.3k.
nicael

Uzun bir açıklama, ama sonuçta, yuvarlama genellikle bize yapılır
edc65

@Edc Bu yanıta bakınız Peter Taylor.
nicael

2
Bence açıklama " Rep 10000 ile 994999 (her ikisi de dahil) aralığında ise, yarım bölme kuralı kullanılarak 1000'e bölünmüş ve .ondalık nokta için görüntülenen 3 önemli rakama yuvarlanabilir. ve sonek eklenmişse k, üçüncü önemli rakam 0ondalık noktasının sağındaysa ve sağındaysa , değerin sadece 2 anlamlı sayıya gösterilmesi gerekir. "Spesifik kesimler daha sonra tek bir test listesine taşınabilir. yazının sonunda, test çerçevesine kopya yapıştırmak için daha uygun olan durumlar.
Peter Taylor

Yanıtlar:


4

Japt, 50 48 bayt

İlk girişim; daha iyi bir yöntem olabilir.

U<A³?U:U<L²?Us i1', :(U<1e5?Ue2n)r /A:Ue3n)r)+'k

Çevrimiçi deneyin!

Nasıl çalışır

          // Implicit: U = input integer, A = 10, L = 100
U<A³?U    // If U is less than A³ (10³ = 1000), return U.
:U<L²?    // Else, if U is less than L² (100² = 10000), return:
Us i1',   //  U.toString, with a comma inserted at position 1.
:(        // Else, return:
U<1e5?    //  If U is less than 1e5:
Ue2n)     //   U * (10 to the power of -2), 
r /A      //   rounded and divided by 10.
:Ue3n)r)  //  Else: U * (10 to the power of -3), rounded.
+'k       //  Either way, add a "k" to the end.
          // Implicit: output last expression

7

JavaScript (ES6), 76 68 bayt

x=>x<1e4?x.toLocaleString():(x<1e5?(x/1e2+.5|0)/10:(x/1e3+.5|0))+"k"

Başka bir ilk girişim. Bu kullanışlı için çok şükür .toLocaleString(), bulabildiğim en kısa alternatif 21 bayt daha uzun ...

Bu, binlerce kişiyi ya ,da .hangi ülkede yaşadığınıza bağlı olarak ayırır . Beş iki bayt daha fazla için her zaman virgül kullanmasını sağlayabilirsiniz:

x=>x<1e4?x.toLocaleString`en`:(x<1e5?(x/1e2+.5|0)/10:(x/1e3+.5|0))+"k"

Yerel ayarınız sizin için iyi çalışıyor, ancak burada İtalya'da 1.234 (virgül yerine nokta)
alıyorum

@ edc65 Şimdi bu bir kod golf ile karşılaşacağımı hiç düşünmemiştim bir sorun. Şu anda çalışıyor mu?
ETHproductions

Mükemmel. Gerçekten bunun yapılabilir olduğunu düşünmedim. Ve sadece 'en' denedim ve çok işe yarıyor gibi görünüyor
edc65

Yerel ayar yapmanız gerektiğini düşünmüyorum, çünkü taşınabilir olması gerekmiyor.
geokavel

1
Temel olarak, eğer bilgisayarınızda çalışıyorsa, bence yeterince iyi.
geokavel

3

JavaScript (ES6), 71

Benim ipucunu görmezken @ETHProductions dayak. Onu gördü.

x=>x<1e3?x:x<1e4?(x+='')[0]+','+x.slice(1):(x/1e3).toFixed(x<99950)+'k'

Ölçek

f=x=>x<1e3?x:x<1e4?(x+='')[0]+','+x.slice(1):(x/1e3).toFixed(x<99950)+'k'

function test() { n=+I.value, O.textContent = n + ' -> ' + f(n) }

test()
<input id=I type=number value=19557 oninput=test()>
<pre id=O></pre>

Ölçek


1
Belki de "dayak ETHproductions" hattınızı güncellemelisiniz ...?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ bitti.
edc65

2

ES6, 68 62 bayt

x=>x<1e4?`${x}`.split(/(?=...)/)+"":x.toPrecision(3)/1e3+"k"

Düzenleme: ["1", "001"]Dize olduğunu fark ettiğimde 6 bayt kaydedildi "1,001".

Düzenle: @ Mwr247 adlı kullanıcının yorumunu düzeltmek için 2 bayt kaydedildi!


1695016.9kyerine verir17k
Mwr247

@ Mwr247 Teşekkürler, düzeltme beni iki bayt kurtardı!
Neil

1

Python 2.7, 58 bayt

lambda x:['%.3g'%((x+.5)/1e3)+'k','{:,}'.format(x)][x<1e4]

Davayla (x+.5)başa çıkmak için kullanmak zorunda kaldım 16950->17k..

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.