Мод Поплавки!


19

Программное обеспечение для 3D-моделирования в основном использует UV Mapping для наложения текстур на 3D-объект. Допустимые значения для U и V обычно находятся в включающем [0..1]диапазоне.

Вызов

Вы купили новое программное обеспечение для 3D-моделирования, которое очень просто в использовании. Однако есть одна проблема: он добавляет или вычитает случайное целое число из значений UV. Ваша задача - создать программу или функцию, которая изменяет входное значение, чтобы получить значение с плавающей запятой в инклюзивном [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!
Сешумара

9
На самом деле, мне нравится 1-> 1, это предотвращает тривиальную проблему для многих языков.
xnor

2
Могу ли я использовать sed для этого? В sed нет типов данных, входными данными должен быть текстовый поток.
сешумара

1
@seshoumara any reasonable input format is allowed, так что я бы сказал: «Почему бы и нет?».
Lolbas

Ответы:



9

Python , 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
@ Нил поправил, спасибо. Я не знаю, почему я пропустил это
Лев

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

Mathematica, 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результатами ложно для положительных чисел с плавающей запятой и отрицательных значений 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 Я не знаком с этим обозначением, но, похоже, оно работает.
Абель Том

Должны ли вы назвать все f? 😂 Кроме того, я не думаю, что скобки в (f<0)это необходимо.
Kennytm

Это может быть упрощено, я думаю, чтобы не копировать вычитание. Но так или иначе это не работает для f(1)(который должен возвратить 1)
pinkfloydx33

@ pinkfloydx33 большое спасибо за указание на то, что код был далеко не готов. :) Исправлено, теперь должно работать нормально!
Абель Том


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, вы можете сбросить их sна 6 байтов.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.