Sıfır gibi yuvarla


12

Hedef

Bir giriş numarası verildiğinde, bir anlamlı rakamla en yakın sayıya yuvarlayın.

Gereksinimler

Giriş

  • Kayan nokta sayısı.
  • Giriş numarasının veri türünün sınırları dahilinde bir çıktıyla sonuçlandığını varsayın (yani taşma hatalarını yok sayın.)
  • 0 geçersiz bir giriş.
  • Kayan nokta veri türünde (örn. "0.35"Olarak depolanmakta 0.3499999) tam olarak temsil edilemeyen sayıların desteklenmesi gerekmez.

Çıktı

  • Sıfır olmayan bir basamak ve herhangi bir sayıda sıfır basamaktan oluşan en yakın sayı.
  • Sonuç, negatif sayıları ve kesirli sayıları desteklemelidir.
  • Giriş tam olarak olası iki çıkış arasında olduğunda, sıfırdan uzaklaşın.

Sunum

Odak, sunumdan ziyade hesaplama üzerinedir. Çıktı bir kayan nokta veri türü olabilir. Tam ya da bilimsel gösterimde metin olabilir. Belirli bir yol sunmanın bayt sayınızı azalttığı bir boşluk bulursanız, kudos size!

Örnekler

9
-3000
.2
0.2
-.2
7e12
5e-15
1e0

Test Durumları

Input     Output
1         1
10        10
17        20
99        100
54321     50000
56789     60000
-123      -100
-789      -800
0.23      0.2
0.25      0.3
-0.25     -0.3
4.56e23   5e23
4.56e-23  5e-23

puanlama

Bir hafta sonra en az bayt sayısına sahip olan kod kazanır.


3
Bence "önemli bir figür" aradığınız kelime öbeği.
Steve Bennett

2
0 için yuvarlama kuralı oldukça garip.
xnor

2
@xnor, haklısın. 0 0.0001'e 1'den daha yakın. Bence 0 sadece geçersiz olmalı.
Hand-E-Food

1
Evet, hedef beyanıyla eşleşmiyor.
Steve Bennett

Yanıtlar:


6

MATL , 3 bayt

1&V

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

0.25TIO üzerinde Octave'de çalışan derleyici için test durumu başarısız oluyor, ancak Windows'ta Matlab'da çalışıyor:

resim açıklamasını buraya girin

Farklı davranış, sprintfplatforma bağlı olarak Octave / Matlab'ın "banker yuvarlama" veya "sıfırdan 5,5" yuvarlama kullanan işlevinden kaynaklanır . Daha fazla bilgi ve test burada bulunabilir .


İçin 6 bayt ,

1t3$Yo

hem Octave'de hem de Matlab'da çalışıyor. Tüm test senaryolarını doğrulayın .


1
"Banker yuvarlama" hemen hemen Jelly cevabımı silmeme neden oldu. > _ <
Outgolfer Erik

@EriktheOutgolfer Evet, bunun da sebebi olduğunu anladım. Matlab'ın bunu yapmadığı için şanslıyım :-D
Luis Mendo


9

Javascript, 19 bayt

x=>x.toPrecision(1)

Bu 0veya üzerindeki özellikleri karşılamıyor 25.
Anders Kaseorg

İlginç. Spesifikasyonu 0bana mantıklı gelmiyor. Ama 0.35şey ... görünüşe göre Javascript yuvarlamadaki önyargıdan kaçınmaya çalışıyor, ama spec önyargı istiyor.
Steve Bennett

Hey, Yorumunuzu değişti - yazdığın 0.35değil 25önce. Ben 25 için spec tatmin olduğunu düşünüyorum - bana doğru görünüyor "3e + 1" döndürür.
Steve Bennett

Maalesef, değiştirdim 0.35çünkü 0.35tam bir kayan nokta temsili yok. Davranış tarayıcıya bağlı olmalıdır; Elde 252e+1Firefox'ta.
Anders Kaseorg

Evet, Chrome ve Firefox'ta bu iki farklı sonucu elde ediyorum. Vay.
Steve Bennett

4

Retina , 63 62 bayt

1`[1-9]
$*#
#\.?[5-9]
#$&
T`d`0`#[\d.]+
0(\.?)#{10}
1$1
#+
$.0

Çevrimiçi deneyin!


Görünüşe göre, sondaki sıfırları endişe etmenize gerek yok, böylece son aşamayı tamamen kaldırabilirsiniz (bundan etkilenmeme rağmen, her gün dört karakterlik alanda üç soru işareti görmüyorsunuz).
Neil

Ne yazık ki bu cevap başarısız gibi görünüyor 0.99.
Neil

Ayrıca başarısız 0.099vb. Bir düzeltme girişimim: Çevrimiçi deneyin!
Neil

Ayrıca başarısız için 99.99, 100.001...
Neil

Hala yanlış 0.099, özür dilerim. Parlak tarafta , üçüncü satırdaki +sonrasını kaldırabileceğinizi düşünüyorum ;.
Neil

2

PHP , 45 bayt

<?=round($x=$argv[1],-floor(log10(abs($x))));

Çevrimiçi deneyin!

Python 2 cevabımla aynı yöntem.

Ayrıca doğru şekilde işlemek gibi görünüyor 0.35, bu da JS cevabının üzerine bir peg koyar: D


İlginç bir şekilde, silinen Python 3 cevabınızın Python 2'de çalışabileceğini düşünüyorum
Anders Kaseorg

Test edildi ve öyle! Şimdi python cevabını
düzenledi ve sildi

2

T-SQL, 27 bayt

SELECT FORMAT(i,'G1')FROM t

Carlos Alejo'nun C # cevabı ile aynı .Net formatlama kodunu kullanarak . Girdi ila şamandıra kolon i önceden var olan Tablo içinde t , bizim ES standartlarına göre

Test senaryoları:

Input         Output
------------ --------
1             1
10            1E+01
17            2E+01
99            1E+02
54321         5E+04
56789         6E+04
-123         -1E+02
-789         -8E+02
0.23          0.2
0.25          0.3
-0.25        -0.3
4.56E+23      5E+23
4.56E-23      5E-23

(Giriş tablosunu tüm bu değerlerle önceden yükleyebilir ve bir kerede çalıştırabilirim.


1

Python 2 , 62 bayt

lambda x:round(x,-int(floor(log10(abs(x)))))
from math import*

Çevrimiçi deneyin!

Python golf için kullanılmaz, ancak bu çalışır.

0.35Kayan nokta yanlışlıkları nedeniyle başarısız olur .

Bunun Python 2'de doğru çalıştığını belirten Anders Kaseorg'a teşekkürler


İçin çıktı 0.25olması gerekiyordu 0.3.
Anders Kaseorg

@AndersKaseorg Neden olduğundan emin değilim, ancak bunun Javascript yanıtıyla aynı kayan nokta yanlışlıkları nedeniyle olduğunu varsayabilirim.
Skidsdev

Hmm bekle 25'in de aynı sorunu var ... tuhaf.
Skidsdev

Merak eden herkes için, Python 2 roundsıfırdan uzaklaşırken, Python 3 hatta yuvarlar, bu yüzden bu Py2'de çalışır ancak 3 değil.
flornquake

log(x,10)bunun yerine kullanarak birkaç bayt golf yapabilirsiniz log10(abs(x)).
Alix Eisenhardt


1

Excel, 14 bayt

=ROUNDUP(A1,1)

Siteye Hoşgeldiniz! Bu güzel bir ilk cevap, bu test edilebilir bir yere, tercihen çevrimiçi, herhangi bir bağlantı var mı, böylece diğer kullanıcıların Excel indirmek zorunda değil misiniz?
caird coinheringaahing

Ne yazık ki, lisanslama nedeniyle herhangi bir ücretsiz Microsoft sitesi olduğunu sanmıyorum, üzgünüm. Code Golf'te diğer Excel yanıtlarını gördüm, ancak yeni olduğumdan beri bunların nasıl doğrulandığından emin değilim!
rew

Bu test vakalarının çoğu için geçerli değildir. "Onuncu" konuma yuvarlanıyor. En önemli konum ne olursa olsun yuvarlanmalı (yukarı değil).
E-Yiyecek



0

İleri (gforth) , 24 bayt

: f 1 set-precision f. ;

Çevrimiçi deneyin!

Kayan nokta yığınında giriş bekleniyor. Çıktı stdout olacak

Kayan nokta çıktı işlevlerinin küresel (bu örnek için) hassasiyetinde değişiklik yapmaktan hoşlanmıyorum, ancak sonunda önceki değeri geri yüklemek zorunda kalmamak için çok fazla bayt kaydediyor. Girdi ne olursa olsun mühendislik veya bilimsel gösterimde çıktı oluşturmaz.

Not: Herhangi bir nedenle, bölüm tercüman dönüştürür için 0.25için 0.2benim yerel kurulum dönüştürür ederken, 0.25hiç 0.3. Bunun neden olduğundan tam olarak emin değilim, ancak yerel olarak doğru sonucu aldığım için cevabımı olduğu gibi bırakıyorum

: f                   \ start a new word definition
  1 set-precision     \ set the floating point output words to use 1 significant digit
  f.                  \ output the top of the floating point stack
;                     \ end the word definition
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.