Yüzen Mod!


19

3D modelleme yazılımı, dokuları bir 3D nesneye eşlemek için esas olarak UV Eşleme kullanır . Hem U hem de V için geçerli değerler genellikle bir kapsayıcıda bulunur[0..1] aralıkta bulunur.

Meydan okuma

Kullanımı son derece kolay olan yeni bir 3D modelleme yazılımı satın aldınız. Ancak bununla ilgili bir sorun var: UV değerlerinden rastgele bir tam sayı ekler veya çıkarır. Göreviniz, kapsayıcı bir [0..1]aralıkta kayan değer elde etmek için bir giriş değerini değiştiren bir program veya işlev oluşturmaktır .

Ortaya çıkan şamandıra, orijinal ile aynı fraksiyonel kısma sahip olmalı ve orijinaline mümkün olduğunca yakın olmalıdır. Her ikisi de 0ve 1çıkış aralığında olduğundan, 0 veya daha küçük tamsayılar 0 ve daha büyük olan 1 veya daha büyük tamsayılar 1 olmalıdır.

JavaScript'te örnek bir algoritma:

function modFloat(input) {
    while (input < 0 || input > 1) {
        if (input < 0) input += 1;
        if (input > 1) input -= 1;
    }
    return input;
}

kurallar

  • Giriş tek bir tam sayı veya kayan değerdir. Cevabınızda belirtildiği sürece makul biçimlere izin verilir.
  • Çıktı, bir kayan nokta değerinin ondalık bir temsili olmalıdır.
  • Çıkış hassasiyeti, girişle en az ondalık basamak olmalıdır.
  • Sondaki sıfırlara izin verilir.
  • Kodunuzun, tamsayı girişleri için 0 veya 1'den hangisinin çıktısını seçtiğinden emin olun.

Test senaryoları

Input       | Output
------------+---------
         -4 | 0
         -1 | 0
          0 | 0
          1 | 1
          2 | 1
     1.0001 | 0.000100
 678.123456 | 0.123456
-678.123456 | 0.876544
        4.5 | 0.5

Bu , bu yüzden bayt içindeki en kısa kod kazanır!


4
1'in 1 ile eşleşmesini istiyor musunuz? Genellikle yarı açık bir aralık kullanılır. Sahte kodunuza dayanarak,> 1'den 1'e kadar tüm tamsayıları ve <0'dan 0'a kadar olan tüm tamsayıları anlamalı mıyım?
xnor

4
Giriş 1 ise tüm% 1 çözümleri başarısız olur!
seshoumara

9
Aslında, 1-> 1 şeyini seviyorum, sorunun birçok dil için önemsiz bir yerleşik olmasını engelliyor.
xnor

2
Bunun için sed kullanabilir miyim? Sed'de veri türü yoktur, girdinin bir metin akışı olması gerekir.
seshoumara

1
@seshoumara any reasonable input format is allowed, bu yüzden "Neden olmasın?"
lolbas

Yanıtlar:


1

Jöle , 6 bayt

%1o>0$

Çevrimiçi deneyin!

Jelly'in var Trueya da yoktur False, ama onun yerine 1ve kullanır 0.

%1o>0$ - Main link: float v
%1     - v mod 1
     $ - last two links as a monad
   >0  -     v greater than zero?
  o    - or - replace the 0 result of the mod with 1 when v is greater than 0.

9

Python , 20 bayt

lambda x:x%1or+(x>0)

Çevrimiçi deneyin!

Giriş modülü 1'i alır, ardından pozitif girişler için 0'dan 1'e çıkışları dönüştürerek sınır durumunu işler. Bir bool çıkışı iki bayt tasarruf eder.

lambda x:x%1or x>0

Bence 1orsözdizimi vurgulayıcı kırılıyor. (Ben yorumlandığı varsayılmaktadır 1 or)
12Me21

@ 12Me21 Evet, doğru şekilde işleyen bir vurgulayıcı görmedim.
xnor


6

Brachylog , 14 11 bayt

3 bayt golf için Fatalize teşekkürler.

∧≜:?+.≥0∧1≥

Bir değişiklik için bu cevap mod kullanmaz :)

Çevrimiçi deneyin!

açıklama

∧≜                Label an integer variable. This will start trying different
                  values for this variable, the ones closest to 0 first.
   :?+.           This variable summed to the input is equal to the output
      .≥0∧1≥      which is >= 0 and <= 1

Çevrimiçi olarak denediğimde bu pozitif 0 tamsayı için çıktı.
Neil

1
@Neil düzeltildi, teşekkürler. Neden özlediğimi bilmiyorum
Leo

2
Aşağıdaki gibi 3 bayt kaydedebilirsiniz: ∧≜:?+.≥0∧1≥.
17'de

4

JavaScript (ES6), 19 bayt

n=>(n%1+1)%1||n>0|0

JavaScript'inizde n%xeğer negatif bir sayı döndürür npozitif kalıntı elde etmek istiyorsak, eklemelisiniz, yani negatif xise nnegatiftir. (n%x+x)%xtüm vakaları kapsar:

n     n%1   n%1+1 (n%1+1)%1
0     0     1     0
1     0     1     0
2.4   0.4   1.4   0.4
-1    0     1     0
-2.4  -0.4  0.6   0.6

20 baytta, biraz daha fazla desen gösteren başka bir çalışma çözümü:

n=>n%1+(n%1?n<0:n>0)

3

MATL , 9 bayt

1&\0>yg>+

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

açıklama

Girişli örnek 678.123456

1      % Push 1
       % STACK: 1
&\     % Implicit input. Divmod with 1
       % STACK: 0.123456, 678
0>     % Is it positive?
       % STACK: 0.123456, 1
y      % Duplicate from below
       % STACK: 0.123456, 1, 0.123456
g      % Convert to logical: nonzero becomes 1
       % STACK: 0.123456, 1, 1
>      % Greater than? This is true if fractional part of input was zero
       % and non-fractional part was positive
       % STACK: 0.123456, 0
+      % Add. Implicitly display
       % STACK: 0.123456

3

Javascript, 28 bayt

m=f=>f<0?m(f+1):f>1?m(f-1):f

Sonuç [0,1] elde edilene kadar değerleri tekrar tekrar azaltır / artırır 1


PPCG'ye hoş geldiniz ve güzel cevap!
ETHproductions

2

Japt , 8 bayt

u1 ªUbV1

Çevrimiçi test edin!

Sanırım ilk defa kullanıyorum b...

açıklama

 u1 ªUbV1  // Implicit: U = input, V = 0
Uu1        // Take U%1, but add 1 if U is negative. This is equivalent to %1 in Python.
    ª      // If the result is falsy (0), instead take
     UbV1  //   U bound between 0 and 1.
           // This converts positive integers to 1, zero/negative integers to 0.
           // Implicit: output result of last expression

2

Mathematica, 20 bayt

#~Mod~1/. 0/;#>0->1&

açıklama

Bu, /;daha çok benzediğim yerde oldukça sıra dışı bir kullanımdır, &&çünkü bundan sonraki durumun eşleştiği desenle ilgisi yoktur.

#~Mod~1...

Compute x % 1pozitif tamsayılar dışındaki tüm durumlar için doğrudur.

.../. 0/;...

Önceki ifadedeki sıfırları şu durumda değiştirin:

...#>0...

... giriş pozitif ...

...->1...

ile 1.


2

PHP, 37 bayt

<?=($m=fmod($argn,1))+(!!$m^$argn>0);

İle çalıştırın echo <number> | php -R '<code>'.

Bunu yapmanın pek çok yolu var ... PHP'nin en kısalarından biri olmalı.

fmodSonuç negatif yüzen için ve negatif 0pozitif tamsayılar için; ayarlanmaya ihtiyaç duyanlar: !!$mşamandıralar için doğrudur, $n>0pozitif şamandıra ve negatif int için yanlış sonuçlarla xoring , negatif şamandıra ve pozitif int için doğrudur; +bunu yapar 1veya yapar 0.


2

C 57 56 73 bayt

b;f(float n){b=n;printf("%f",((!(n-b)&&n<=0)?0:n<0?1.+n-b:(n-b)?n-b:1));}

@ pinkfloydx33 İşaret ettiğiniz için teşekkürler!

Ungolfed sürümü:

f(float n)
{
  int b=n;
  printf("%f",( (!(n-b)&&n<=0)?0:n<0?1.+n-b:(n-b)?n-b:1) );
}

Çevrimiçi deneyin!


1.Bunun yerine yapabilir misin 1.0?
Kritixi Lithos

@KritixiLithos Bu gösterime aşina değilim ama işe yaramış gibiydi.
Abel Tom

Her şeyi aramak gerekir f? 😂 Ayrıca ben parantez içinde sanmıyorum (f<0)gereklidir.
kennytm

Bu basitleştirilebilir Ben çıkarma çıkarma çoğaltmak düşünüyorum. Ama her iki durumda da işe yaramaz f(1)(ki 1 döndürmelidir)
pinkfloydx33

@ pinkfloydx33 işaret ettiğin için çok teşekkürler, bu kod tamamlanmaktan çok uzaktı. :) Düzeltildi, şimdi iyi çalışmalı!
Abel Tom

1

SmileBASIC, 28 bayt

INPUT N?N-FLOOR(N)+(N<<0==N)

1

JavaScript (ES6), 19 bayt

n=>(n>0==!(n%=1))+n

Açıklama: %1her durumda doğru sonuçları vermez:

input       %1          output
-ve int     -0
-ve frac    -ve frac    +ve frac
0           0
+ve frac    +ve frac
+ve int     0           1

Yanlış, tamsayı olmayan ve pozitif bir tamsayı olan durumlarda fazladan 1 eklenmelidir. İfadenin (n>0==!(n%1))hesapladığı şey budur .


Bunun başka düzenlemeleri de var, ancak henüz daha kısa bir tane bulamadım ...
ETHproductions

1

> <> , 26 bayt

:1%:?vr1(?v1n;
     >n;n0<

Çevrimiçi deneyin!

İyi golf dillerindeki çözümler neredeyse her zaman anında verildiği için işleri karıştırmaya karar verdim. İlk <> <cevap!

açıklama

:1%:?vr1(?v1n;    Assume input i in stack
     >n;n0<

:                 Duplicate i (need it if i%1 != 0)
 1                Push 1
  %               Pop i and 1, push i%1
   :              Duplicate top of stack because  we need one for the if     
    ?v            If i%1 != 0 ------------------------,
      r           Reverse stack so that i is TOS      | 
       1(?v       If i > 0 (not < 1)                  |
           1n;      Print 1 and Exit                  |
                  Else                                |                   
        n0<         Print 0 and --,                   |
     >n           Print n <-------|-------------------'
       ;          Exit <----------'

Eğlenceli gerçek: açıklama geçerli bir <> <program!


0

Javascript, 41 28 bayt

n=>n-Math.floor(n)+(n<<0==n)

Math.floor() çok uzun ...


n|0daha kısa Math.floor(bence işe yarıyor)
Kritixi Lithos

|0, floor()negatif sayılardan farklıdır .
12

0

Pyth, 7 bayt

|%Q1s<0

açıklama

|%Q1s<0
|%Q1s<0Q      Implicitly add input
 %Q1          Input mod 1
|             Short-circuting or
    s<0Q      1 if input is positive, 0 otherwise

True ve False'ı 1 ve 0 olarak kullanmanın bir sakıncası yoksa s6 bayt bırakabilirsiniz .


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.