Мод Поплавці!


19

Програмне забезпечення для 3D-моделювання в основному використовує УФ-карти для відображення текстур на 3D-об'єкт. Дійсні значення як для U, так і для V зазвичай знаходяться в інклюзивному [0..1]діапазоні.

Виклик

Ви придбали нове програмне забезпечення для 3D-моделювання, яке дуже просте у використанні. Однак з цим є одна проблема: вона додає або віднімає випадкове ціле число від УФ-значень. Ваше завдання - створити програму або функцію, яка модифікує вхідне значення, щоб отримати значення поплавця в інклюзивному [0..1]діапазоні.

Отриманий поплавок повинен мати ту ж дробову частину, що й оригінал, і бути максимально наближеним до оригіналу. Оскільки обидва 0і 1знаходяться у вихідному діапазоні, будь-які цілі числа 0 або менше повинні змінюватися на 0, а будь-які цілі числа 1 або більше повинні змінюватися на 1.

Приклад алгоритму в JavaScript:

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

Правила

  • Введення - це одне ціле ціле чи поплавкове значення. Будь-який розумний формат дозволений до тих пір, поки це вказано у вашій відповіді.
  • Вихід повинен бути десятковим поданням значення поплавця.
  • Точність виходу повинна бути як мінімум тими ж десятковими знаками, що і вхідні.
  • Дозволені нулі дозволені.
  • Переконайтесь, що ваш код правильно обрав, який з 0 або 1 вивести для цілих входів.

Тестові справи

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

Це , тому найкоротший код у байтах виграє!


4
Ви маєте намір 1 на карті на 1? Зазвичай використовується напіввідкритий діапазон. На основі вашого псевдокоду, чи повинен я розуміти всі цілі числа> 1 перейти до 1, а всі цілі числа <0 перейти до 0>
xnor

4
Усі рішення% 1 виходять з ладу, якщо вхід 1!
seshoumara

9
Насправді, мені подобається річ 1-> 1, вона стримує проблему не бути тривіальною вбудованою для багатьох мов.
xnor

2
Чи можу я використовувати для цього sed? У sed немає типів даних, вхідним сигналом повинен бути текстовий потік.
seshoumara

1
@seshoumara any reasonable input format is allowed, тому я б сказав "Чому ні?".
lolbas

Відповіді:



9

Пітон , 20 байт

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

Спробуйте в Інтернеті!

Бере вхідний модуль 1, потім обробляє крайовий випадок, перетворюючи виходи 0 в 1 для позитивних входів. Вихід bool дозволить заощадити два байти.

lambda x:x%1or x>0

Я думаю 1or, що зламати синтаксис підсвічувачем. (Я припускаю, що це трактується як 1 or)
12Me21

@ 12Me21 Так, і я не бачив жодного маркера, який би керував ним правильно.
xnor

Моє робить :) 12Me21.github.io/syntax/link#1or
12Me21

6

Брахілог , 14 11 байт

Завдяки Fatalize за гольф у 3 байти.

∧≜:?+.≥0∧1≥

Для зміни в цій відповіді мод не використовується :)

Спробуйте в Інтернеті!

Пояснення

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

Це вихід 0 для натуральних чисел, коли я спробував це в Інтернеті.
Ніл

1
@Neil виправив, дякую. Я не знаю, чому я пропустив це
Лев,

2
Ви можете зберегти 3 байта , як , наприклад: ∧≜:?+.≥0∧1≥.
Фаталізувати

4

JavaScript (ES6), 19 байт

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

У JavaScript n%xповертає негативне число, якщо nнегативне, тобто, якщо ми хочемо отримати позитивний залишок, ми мусимо додати, xякщо nнегативне. (n%x+x)%xохоплює всі випадки:

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 байт, яке показує трохи більше шаблону:

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

3

MATL , 9 байт

1&\0>yg>+

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

Приклад із введенням 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 байт

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

Рекурсивно зменшує / збільшує значення на 1, поки результат не виявиться [0,1]


Ласкаво просимо до PPCG, і приємна відповідь!
ETHproductions

2

Japt , 8 байт

u1 ªUbV1

Перевірте це в Інтернеті!

Я думаю, що це перший раз, коли я коли-небудь використовував b...

Пояснення

 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

Математика, 20 байт

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

Пояснення

Це досить незвичне використання, /;де я використовую його більше, як те, &&тому що стан після нього не має нічого спільного з тією схемою, яку він відповідає.

#~Mod~1...

Обчислити x % 1, що є правильним для всіх випадків, за винятком натуральних чисел.

.../. 0/;...

Замініть нулі в попередньому виразі, якщо ...

...#>0...

... вхід позитивний ...

...->1...

з 1.


2

PHP, 37 байт

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

Бігайте з echo <number> | php -R '<code>'.

Є так багато способів зробити це ... це має бути одним із найкоротших у PHP.

fmodРезультат негативний для негативних поплавців і 0для позитивних цілих чисел; тим, хто потребує коригування: !!$mвірно для поплавків, xoring з $n>0результатами у false для позитивного поплавця та негативного int, вірно для негативного поплавця та додатного int; +кидає, що 1чи 0- зроблено.


2

C 57 56 73 байт

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

@ pinkfloydx33 Дякую за вказівку!

Негольована версія:

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

Спробуйте в Інтернеті!


Ви можете зробити 1.замість цього 1.0?
Kritixi Lithos

@KritixiLithos Я не знайомий з цим позначенням, але, здавалося, він працює.
Abel Tom

Потрібно зателефонувати все f? 😂 Також я не вважаю, що дужки (f<0)потрібні.
kennytm

Це може бути спрощено. Я думаю, щоб не повторювати віднімання. Але в будь-якому випадку це не працює f(1)(що має повернути 1)
pinkfloydx33

@ pinkfloydx33 дуже дякую, що вказали на це, що код був далеко не зроблений. :) Виправлено це, має працювати зараз добре!
Abel Tom


1

JavaScript (ES6), 19 байт

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

Пояснення: %1не дає правильних результатів у всіх випадках:

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

У помилках випадків потрібно додати додатковий 1, який є негативним не цілим числом і додатним цілим числом. Ось що (n>0==!(n%1))обчислює вираз .


Є кілька інших домовленостей щодо цього, але я ще не знайшов такого, який коротший ...
ETHproductions

1

> <> , 26 байт

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

Спробуйте в Інтернеті!

Тому що рішення в хорошому мов для гри гольф майже завжди даються миттєво, я вирішив все переплутати. Перша <> <відповідь!

Пояснення

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

Веселий факт: пояснення є дійсною <> <програмою!


0

Javascript, 41 28 байт

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

Math.floor() так довго ...


n|0коротше, ніж Math.floor(я думаю, це працює)
Kritixi Lithos

|0відрізняється, ніж floor()для від’ємних чисел.
12Me21

0

Pyth, 7 байт

|%Q1s<0

Пояснення

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

Якщо ви не заперечуєте, щоб використовувати True та False як 1 і 0, ви можете скинути ці s6 байт.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.