Mod Floats!


19

Oprogramowanie do modelowania 3D wykorzystuje głównie mapowanie UV do mapowania tekstur na obiekcie 3D. Prawidłowe wartości zarówno dla U, jak i V znajdują się zwykle w [0..1]zakresie obejmującym .

Wyzwanie

Kupiłeś nowe oprogramowanie do modelowania 3D, które jest bardzo łatwe w użyciu. Jest jednak jeden problem: dodaje lub odejmuje losową liczbę całkowitą od wartości UV. Twoim zadaniem jest utworzenie programu lub funkcji, która modyfikuje wartość wejściową, aby uzyskać wartość zmiennoprzecinkową w [0..1]zakresie obejmującym .

Wynikowa liczba zmiennoprzecinkowa powinna mieć tę samą część ułamkową co oryginał i znajdować się jak najbliżej oryginału. Ponieważ oba 0i 1są w zakresie mocy, wszystkie liczby całkowite 0 lub mniej należy zmienić na 0, a wszystkie liczby całkowite 1 lub więcej należy zmienić na 1.

Przykładowy algorytm w JavaScript:

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

Zasady

  • Dane wejściowe to jedna liczba całkowita lub zmiennoprzecinkowa. Dowolny rozsądny format jest dozwolony, o ile jest określony w odpowiedzi.
  • Dane wyjściowe powinny być dziesiętną reprezentacją wartości zmiennoprzecinkowej.
  • Dokładność wyjściowa powinna wynosić co najmniej te same miejsca dziesiętne co dane wejściowe.
  • Zera końcowe są dozwolone.
  • Upewnij się, że kod poprawnie wybiera, który z 0 lub 1 ma być wyprowadzany dla liczb całkowitych.

Przypadki testowe

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

To jest , więc wygrywa najkrótszy kod w bajtach!


4
Czy chcesz, aby 1 zamapował na 1? Zwykle stosuje się półotwarty zakres. Na podstawie twojego pseudokodu, czy powinienem zrozumieć wszystkie liczby całkowite> 1 przejdź do 1, a wszystkie liczby całkowite <0 przejdź do 0>
xnor

4
Wszystkie rozwiązania% 1 zawodzą, jeśli wejście wynosi 1!
seshoumara

9
Właściwie to podoba mi się funkcja 1-> 1, dzięki czemu problem nie jest trywialny dla wielu języków.
xnor

2
Czy mogę do tego użyć sed? Nie ma żadnych typów danych w sed, dane wejściowe musiałyby być strumieniem tekstu.
seshoumara

1
@seshoumara any reasonable input format is allowed, więc powiedziałbym „dlaczego nie?”.
lolbas

Odpowiedzi:


1

Galaretka , 6 bajtów

%1o>0$

Wypróbuj online!

Kisiel nie ma Trueani False, ale używa 1i 0na swoim miejscu.

%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 bajtów

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

Wypróbuj online!

Bierze moduł wejściowy 1, a następnie obsługuje przypadek brzegowy, przekształcając wartości wyjściowe od 0 do 1 dla sygnałów dodatnich. Dane wyjściowe bool pozwoliłyby zaoszczędzić dwa bajty.

lambda x:x%1or x>0

Myślę, że 1orłamie zakreślacz składni. (Zakładam, że jest to interpretowane jako 1 or)
maja 21

@ 12Me21 Tak, i nie widziałem żadnego zakreślacza, który obsługiwałby go poprawnie.
xnor


6

Brachylog , 14 11 bajtów

Dzięki Fatalize za grę w golfa 3 bajty.

∧≜:?+.≥0∧1≥

Dla odmiany, ta odpowiedź nie używa modu :)

Wypróbuj online!

Wyjaśnienie

∧≜                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

To wyjście 0 dla dodatnich liczb całkowitych, gdy próbowałem go online.
Neil

1
@Neil poprawił, dziękuję. Nie wiem, dlaczego mi tego brakowało
Leo

2
Można zapisać 3 bajty jako takie: ∧≜:?+.≥0∧1≥.
Fatalize

4

JavaScript (ES6), 19 bajtów

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

W JavaScript n%xzwraca liczbę ujemną, jeśli njest ujemna, co oznacza, że ​​jeśli chcemy uzyskać dodatnią pozostałość, musimy dodać, xjeśli njest ujemna. (n%x+x)%xobejmuje wszystkie przypadki:

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

Kolejne działające rozwiązanie przy 20 bajtach, które pokazuje nieco więcej wzoru:

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

3

MATL , 9 bajtów

1&\0>yg>+

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Przykład z wejściem 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 bajtów

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

Rekurencyjnie zmniejsza / zwiększa wartości o 1, dopóki wynik nie osiągnie [0,1]


Witamy w PPCG i fajna odpowiedź!
ETHprodukcje

2

Japt , 8 bajtów

u1 ªUbV1

Przetestuj online!

Myślę, że po raz pierwszy użyłem b ...

Wyjaśnienie

 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 bajtów

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

Wyjaśnienie

Jest to raczej niezwykłe zastosowanie, /;gdy używam go bardziej, &&ponieważ warunek po nim nie ma nic wspólnego z pasującym wzorcem.

#~Mod~1...

Oblicz x % 1, co jest poprawne we wszystkich przypadkach oprócz dodatnich liczb całkowitych.

.../. 0/;...

Zamień zera w poprzednim wyrażeniu, jeśli ...

...#>0...

... wkład jest pozytywny ...

...->1...

z 1.


2

PHP, 37 bajtów

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

Biegnij z echo <number> | php -R '<code>' .

Jest na to wiele sposobów ... powinien to być jeden z najkrótszych w PHP.

fmodWynik jest negatywny dla pływaków i negatywnych 0dla dodatnich liczb całkowitych; te wymagają korekty: !!$mjest prawdziwe dla liczb zmiennoprzecinkowych, xoring z $n>0wynikiem false dla dodatnich liczb zmiennoprzecinkowych i ujemnych liczb całkowitych, prawdą dla liczb zmiennoprzecinkowych i dodatnich liczb całkowitych ; +przekazuje to do 1lub 0- gotowe.


2

C 57 56 73 bajtów

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

@ pinkfloydx33 Dzięki za wskazanie!

Wersja bez golfa:

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

Wypróbuj online!


Czy możesz to zrobić 1.zamiast 1.0?
Kritixi Lithos

@KritixiLithos Nie znam tego zapisu, ale wydawało się, że działa.
Abel Tom

Czy musisz nazywać wszystko f? 😂 Nie sądzę też, aby nawiasy były (f<0)konieczne.
kennytm

Można to uprościć, jak sądzę, aby nie powielać odejmowania. Ale tak czy inaczej to nie działa f(1)(co powinno zwrócić 1)
pinkfloydx33

@ pinkfloydx33 bardzo dziękuję za wskazanie tego, że kod był daleki od końca. :) Naprawiono, powinien działać teraz dobrze!
Abel Tom


1

JavaScript (ES6), 19 bajtów

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

Objaśnienie: %1nie daje poprawnych wyników we wszystkich przypadkach:

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

W przypadkach, które są błędne, należy dodać dodatkowe 1, które są ujemnymi liczbami całkowitymi ujemnymi i dodatnimi liczbami całkowitymi. To (n>0==!(n%1))oblicza wyrażenie .


Istnieje kilka innych rozwiązań tego, ale nie znalazłem jeszcze takiego, który jest krótszy ...
ETHprodukcje

1

> <> , 26 bajtów

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

Wypróbuj online!

Ponieważ dobre rozwiązania językach golfowych są prawie zawsze podawane od razu, postanowiłem coś pomieszać. Najpierw <> <odpowiedź!

Wyjaśnienie

: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 <----------'

Ciekawostka: wyjaśnienie jest poprawnym programem <> <!


0

JavaScript, 41 28 bajtów

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

Math.floor() jest tak długo ...


n|0jest krótszy niż Math.floor(myślę, że to działa)
Kritixi Lithos

|0jest inny niż floor()dla liczb ujemnych.
12Me21

0

Pyth, 7 bajtów

|%Q1s<0

Wyjaśnienie

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

Jeśli nie masz nic przeciwko użyciu wartości Prawda i Fałsz jako 1 i 0, możesz upuścić s6 bajtów.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.