Sıfırdan uzağa yuvarla


24

Sıfırdan uzağa yuvarla

Yuvarlak sıfıra doğru esinlenerek .

Herhangi bir makul yöntemle bir sayı girişi verildiğinde, "sıfırdan uzağa" sayısının yuvarlanması - artı sayılar yukarı ve negatif sayılar aşağı yuvarlayın.

Girdiyi bir dizge olarak almak istiyorsanız (örneğin STDIN aracılığıyla), sayıları ondalık basamağı olan veya olmayan olarak kullanabilmelisiniz. Sayı olarak alırsanız, en azından kayan nokta hassasiyetini (çift hassasiyet gerekli değildir) veya rasyonel sayıları kullanabilmelidir.

İsterseniz ondalık noktayla (ör. 42.0) bir kayan noktalı sayı çıkarabilirsiniz. (Ya da cevabınızı kısaltırsa, bazı test durumlarında kayan nokta ve bazı çıktı tam sayılarına sahip olmalısınız.)

Standart boşluklara vb. İzin verilmez.

Test durumları

-99.9 => -100
-33.5 => -34
-7    => -7
-1.1  => -2
0     => 0
2.3   => 3
8     => 8
99.9  => 100
42.0  => 42
-39.0 => -39

Sandbox Bağlantısı


STDIN gibi bir string bağlamında sayıları alıyorsak .0, test senaryolarının önerdiği gibi desteklememiz gerekir mi?
Jo King,

@JoKing evet-- netleştirmek için soruyu güncelleyeceğim. Bu aslında orijinal böyleydi, ama sonra sanal alanındaki insanlar çok ah, işte her ikisi ile olan olmayan ondalık test durumları ekleyerek, üzgün önerdi
Değer Mürekkep

İlham verici olmak iyi hissettiriyor :)
connectyourcharger

Tam sayı girişi ve tam sayı çıktısı alarak bir önceki sorunda çok iyi sonuç veren tüm dillerin çok iyi çalışmaması komiktir, çünkü -0.1ve arasındaki farkı söyleyemezler0.1
Jo King

Yanıtlar:


15

Excel, 13 bayt

=ROUNDUP(A1,)

Alternatif

=EVEN(A1*2)/2

4
EVEN, ne garip bir işlev ..
tsh

13
@ Tsh Ben "garip işlev" demek istiyorsun.
negatif yedi

2
@negativeseven Kullanıcı adı kontrol etti. :-P
Veky


8

Jöle , 4 bayt

ĊṠ¡Ḟ

Bir tamsayı veren bir sayıyı kabul eden bir monadik Link.

Çevrimiçi deneyin!Veya bir test odasına bakın .

Nasıl?

ĊṠ¡Ḟ - Link: number, N
  ¡  - repeat...
 Ṡ   - ...number of times: sign of N (repeating -1 is the same as 0 times)
Ċ    - ...action: ceiling
   Ḟ - floor (that)

Peki ¡negatif sayılar için tam olarak nasıl çalışır?
Belgeli

1
Jelly'in wiki'sinde belgelenmemiş, ancak ¡tekrarlayan niteliği for index in range(repetitions)koddaki bir döngü ile uygulanmaktadır . range([stop=]-1)çünkü boş startiçin varsayılan 0ve stepvarsayılan 1ve "olumlu bir adım için, bir dizi içeriği r, aşağıdaki formül ile belirlenir ve ". docsr[i] = start + step*ii >= 0r[i] < stop
Jonathan Allan

¡davranışı Python'ın davranışına dayanır rangeve range(-1).__iter__().__next__()hemen fırlar StopIteration.
İlişkisiz Dize

6

Python 3 , 23 bayt

lambda i:i-i%(1|-(i>0))

Çevrimiçi deneyin!

Xnor sayesinde -1 bayt


1
(1|-(i>0))Bir bayt kapalı kaydetmek için yapabilirsiniz (1,-1)[i>0].
xnor

@xnor Güzel bul, teşekkürler!
Jitse

Aferin. Ben 62 byte vardı ಥ_ಥ:g=lambda r:0if r==0 else(int(r)+r/abs(r)if r/int(r)!=1 else r)
user14492

'|' Nedir önce '-'?
William

1
@jaaq Ben de bu çözümü seviyorum! Benim ilk yaklaşımım da 24 bayttı.
Jitse

5

Jöle , 5 4 bayt

AĊ×Ṡ

Çevrimiçi deneyin!

Bu portlar, Stax'ın Jelly'e cevabını tekrarladı , bu yüzden bir açıklama için bu cevabı kontrol et.

Nick Kennedy sayesinde -1 bayt

Jöle , 6 5 bayt

ĊḞ>?0

Çevrimiçi deneyin!

Jonathan Allan sayesinde -1 bayt

Bu nasıl çalışır?

ĊḞ>?0 - Monadic link. Takes a float, x, as argument

   ?  - If:
  > 0 -   x > 0
      - Then:
Ċ     -   ceil(x)
      - Else:
 Ḟ    -   floor(x)

ĊḞ>?06'nız gibi çalışır.
Jonathan Allan

1
AĊ×Ṡ4 ve işlevsel olarak ilk cevabınızla aynı.
Nick Kennedy

@NickKennedy ve Jonathan, öneri için teşekkürler, onlar düzenlenebilir oldum
coinheringaahing Caird

5

Java (JDK) , 18 bayt

d->d.setScale(0,0)

Çevrimiçi deneyin!

açıklamalar

Bir BigDecimalgiriş ve çıkış olarak kullanır . sayının ölçeğini ayarlayan BigDecimalbir yöntemi setScalevardır. İlk parametre nokta ayırıcıdan sonraki hane sayısı, ikincisi de yuvarlama modudur. ROUND_UP"sıfırdan uzakta" yuvarlamadır ve bir değeri vardır, 0bu yüzden bu değeri kodlarım.


5

Vim, 36 bayt / tuş vuruşları

:s/-/-<Space>
:g/\..*[1-9]/norm <C-v><C-a>lD
:s/<Space><cr>

Çevrimiçi deneyin! veya Tüm Test Durumlarını Doğrulayın!

Açıklama:

:s/             " Replace...
   -            "   A dash
    /-<Space>   "   With a dash and a space

:g/                             " On Every line matching this regex...
   \.                           "   A dot
     .*                         "   Followed By anything
       [1-9]                    "   Followed by a digit other than 0
            /norm               " Run the following keystrokes...
                  <C-v><C-a>    "   Increment the number by 1
                                "   This also conveniently places our cursor just before the dot
                            l   "   Move one character right
                             D  "   Delete everything after the cursor

:s/             " Replace...
   <Space>      "   A space
                "   (With nothing)

Kullanılması $F-a <esc>yerine ilk satırda ve bir makro /yerine koşullu olarak :gve :normbyte 29 verir tio.run/##HczBCoJAFEZhWva/QpuLCNbizoxalBXRInqJMpjGCYVwmkx7/...
Kritixi Lithos


4

C # (Visual C # Derleyici) , 41 bayt 27 bayt 24 bayt

s=>(int)s+Math.Sign(s%1)

Çevrimiçi deneyin!

Burada ilk yazı, onunla eğlendim, umarım beğenirsiniz. Tür burada C # yerinin boş olduğunu düşünüyor

-14 tnx
ila @ süresi dolmuş veri -3 tnx ila @ gece2


1
Siteye Hoşgeldiniz ve güzel ilk cevap! Kod Golf beğeneceğinizi umuyoruz!
caird coinheringaahing

27 bayt ... Muhtemelen hala tasarruf etmek için çok az
Süresi Dolmuş Veriler

@Paired, evet güzel, bu tür kodlama ilk bakışta çok garipti, tüm kitaplık olayını unuttum, bir cevap olarak göndermeyi unutmayın
hessam hedieh

1
@ Night2, yorum için tnx, bütün cevabını yazmadım, Code golf submissionişlevselliği kullandım , Sonuna kendi kelimelerimi biraz ekledim, ama düzenleme için sadece bu kod satırını değiştirdim ve orada ur ur, unuttum Bizi ilk adıma geri
döndüren

1
TIO linkinizi 24 byte versiyonunda düzenlediniz, ancak kod satırının kendisi hala 27 byte versiyonudur.
Value Ink,

4

Runik Büyüleri , 18 16 bayt

1µ-i:'-A{*+'.A@

Çevrimiçi deneyin!

"Ekler" (sıfırdan uzak) 0.999999 ve sonucu kaplar. µdilin işleçlerinde sonsuzluğa en yakın şey budur. Düzgün işleyen bir Trunc(x)komutla, cevap şimdi 0girdi olarak desteklemektedir .


1
@JoKing Oof. İyi yakalama. Bu divide by input, giriş değerinin "işareti" ni almak için giriş yapıyor . Elbette giriş 0 olduğunda 0'a bölünür. Şu an bunun etrafında (iyi) bir yol yoktur. İlk önce bu taahhüde ihtiyaç duyacak . Dennis'i düzeltirim (yan fayda, cevap kısalır).
Draco18s

1
@JoKing Cevap şimdi 0doğru şekilde işler .
Draco18,



2

Retina 0.8.2 , 38 bayt

\.0+
.
\b9+\..
0$&
T`9d`d`.9*\..
\..*

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama:

\.0+
.

Sayının tam sayı olmadığından emin olmak için ondalık noktasından sonra sıfırları silin; Ondalık noktadan sonra haneler yoksa sonraki iki eşleşme başarısız olur.

\b9+\..
0$&

Tamsayı kısmının tümü 9s ise, 0artışın taşmasına izin vermek için a öneki .

T`9d`d`.9*\..

Sayının tamsayı kısmını artırın.

\..*

Sayının kesirli bölümünü silin.



2

JavaScript (ES6), 20 bayt

n=>n%1?n<0?~-n:-~n:n

Çevrimiçi deneyin!

Yorumlananlar

n =>        // n = input
  n % 1 ?   // if n is not an integer:
    n < 0 ? //   if n is negative:
      ~-n   //     return -(floor(-n) + 1) = -floor(-n) - 1
    :       //   else:
      -~n   //     return -(-(floor(n) + 1)) = floor(n) + 1
  :         // else:
    n       //   return n unchanged

Kodumun n=>(~~n-n%1)%1+n-1 ile 1 arasındaki sayılar için işe yaramadığını öğreninceye kadar 16 baytlık cevabım için bir cevap yazıyordum ( ). ayrıldı!
Gust van de Wal


2

MathGolf , 5 bayt

‼σ±ü*

Çevrimiçi deneyin!

açıklama

Operatör için kullanım bulmak güzel .

‼       apply next two operators to (implicit) input
 σ      sign (-1, 0, or 1)
  ±     absolute value
   ü    ceiling of that absolute value
    *   multiply the rounded absolute value with the sign

2

PHP , 30 bayt

<?=0^$argn-=0<=>fmod($argn,1);

Çevrimiçi deneyin!

Sayı tamsayı değilse, -1 (negatif ondalık değerler için) işaretine göre veya 1 (pozitif ondalık değerler için) buna eklenir ve ardından yeni sayının tam sayı kısmı yazdırılır.


PHP , 32 bayt

<?=[ceil,floor][$argn<0]($argn);

Çevrimiçi deneyin!

Temel olarak floor, 0'dan küçükse ceil, bunun dışında girdilerin çıkışı .


PHP , 34 bayt

<?=($argn>0?:-1)*ceil(abs($argn));

Çevrimiçi deneyin!





1

APL (Dyalog Unicode) , 15 bayt

{⍎'⌈⌊'[0>⍵],⍕⍵}

Çevrimiçi deneyin!

Basit dfn. Kullanır ⎕IO←0.

Nasıl:

{⍎'⌈⌊'[0>⍵],⍕⍵}  Main function, argument ⍵.
            ⍕⍵   Stringified argument
           ,     Appended to
      [0>⍵]      This item... (0 if  is positive or 0, else 1)
  '⌈⌊'           of this string (which are the functions Ceiling and Floor, respectively)
                Executed as APL code.

1

sed için, 131 bayt + -rbayrak için 2 bayt

/^-?[^.]*(\.0*)?$/bQ
s/^(-?)9/\109/
s/([0-8]9*)\..*$/_\1/
h
s/.*_//
y/0123456789/1234567890/
G
s/(.*)\n(.*)_(.*)/\2\1/
:Q
s/\..*$//

Ungolfed

#!/bin/sed -rf

# identify integers
/^-?[^.]*(\.0*)?$/ b isInt

# add a leading 0 if we'll need it later
s/^(-?)9/\109/

# convert to format: -?[0-9]_[0-8]9*
s/([0-8]9*)\..*$/_\1/

# move the part that will remain constant into the hold buffer
h
s/.*_//

# [0-8]9* can be incremented via character substitution
y/0123456789/1234567890/

# reassemble parts
G
s/(.*)\n(.*)_(.*)/\2\1/

:isInt
# Get rid of anything after the decimal point
s/\..*$//


1

JavaScript (node.js), 30 23 21 bayt

s=>~~s+Math.sign(s%1)

C # cevabından esinlenmiştir.

-Value Ink ve @Gust van de Wal'e -7 bayt için teşekkürler!

Tekrar teşekkürler, başka bir -2 bayt için @Gust van de Wal!


Neden kullanılmalıdır +=zaman +bu durumda hile yapacak? -1 byte
Value Ink

Yerine parseInt(), sadece kullanmayı tercih ediyorum ~~başlangıcında ya da benzeri başka bir bitsel operatör de |0ya ^0bayt başka öbek kurtarmak için sonunda
Gust van de Wal

@ValueInk vay, neden yazdığımı bilmiyorum +=, işaret etmek için teşekkürler
Yay

Dış parantezleri yine de bırakabilirsiniz
Gust van de Wal

@GustvandeWal oh, bunu bilmiyordum! teşekkürler
Yay

0

Perl 6 , 19 bayt

{$_+|0+.sign*?/\./}

Çevrimiçi deneyin!

En kısa çözüm değil, ama üzerinde çalışıyorum. Temel olarak bu sayıyı kısaltır, ardından sayı tam olarak başlamazsa sıfırdan bir tanesini ekler.





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.