Modifique os carros alegóricos!


19

O software de modelagem 3D usa principalmente o Mapeamento UV para mapear texturas em um objeto 3D. Os valores válidos para U e V geralmente estão localizados em um [0..1]intervalo inclusivo .

Desafio

Você comprou um novo software de modelagem 3D que é super fácil de usar. No entanto, há um problema: ele adiciona ou subtrai um número inteiro aleatório dos valores UV. Sua tarefa é criar um programa ou uma função que modifique um valor de entrada para obter um valor flutuante em um [0..1]intervalo inclusivo .

O flutuador resultante deve ter a mesma parte fracionária do original e estar o mais próximo possível do original. Como ambos 0e 1estão no intervalo de saída, qualquer número inteiro 0 ou menos deve ser alterado para 0 e qualquer número inteiro 1 ou maior deve ser alterado para 1.

Um exemplo de algoritmo em JavaScript:

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

Regras

  • A entrada é um único número inteiro ou valor flutuante. Qualquer formato razoável é permitido desde que seja especificado em sua resposta.
  • A saída deve ser uma representação decimal de um valor flutuante.
  • A precisão da saída deve ter pelo menos as mesmas casas decimais da entrada.
  • Zeros à direita são permitidos.
  • Certifique-se de que seu código escolha corretamente qual dos 0 ou 1 deve ser gerado para entradas inteiras.

Casos de teste

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

Isso é , então o código mais curto em bytes vence!


4
Você pretende que 1 seja mapeado para 1? Geralmente, é usado um intervalo semi-aberto. Com base no seu pseudocódigo, devo entender todos os inteiros> 1 Ir a 1, e todos os inteiros <0 Vai para o 0>
xnor

4
Todas as soluções% 1 falham se a entrada for 1!
seshoumara

9
Na verdade, eu gosto da coisa 1-> 1, ela evita que o problema seja trivial para muitos idiomas.
xnor 24/02

2
Posso usar o sed para isso? Não há tipos de dados no sed, a entrada teria que ser um fluxo de texto.
seshoumara

11
@Shoumara any reasonable input format is allowed, então eu diria "Por que não?".
24517 lolols

Respostas:


1

Gelatina , 6 bytes

%1o>0$

Experimente online!

A geléia não tem Trueou False, mas usa 1e 0em seu lugar.

%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 bytes

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

Experimente online!

Toma o módulo de entrada 1 e, em seguida, lida com o caso de limite, convertendo saídas de 0 para 1 para entradas positivas. Uma saída booleana salvaria dois bytes.

lambda x:x%1or x>0

Eu acho que 1orestá quebrando o marcador de sintaxe. (Suponho que seja interpretado como 1 or) #
1221 12Me21

@ 12Me21 Sim, e eu não vi nenhum marcador que lide com isso corretamente.
xnor 24/02


6

Braquilog , 14 11 bytes

Agradecimentos a Fatalize por jogar 3 bytes.

∧≜:?+.≥0∧1≥

Para variar, esta resposta não usa mod :)

Experimente online!

Explicação

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

Esta saída 0 para números inteiros positivos quando eu tentei online.
Neil

11
@ Neil corrigido, obrigado. Eu não sei por que eu perdi isso #
2626 Leo

2
Você pode salvar 3 bytes como tal: ∧≜:?+.≥0∧1≥.
Fatalize 27/02

4

JavaScript (ES6), 19 bytes

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

Em JavaScript, n%xretorna um número negativo se nfor negativo, o que significa que, se queremos obter o resíduo positivo, devemos adicionar xse nfor negativo. (n%x+x)%xabrange todos os casos:

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

Outra solução funcional de 20 bytes, que mostra um padrão um pouco mais:

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

3

MATL , 9 bytes

1&\0>yg>+

Experimente online! Ou verifique todos os casos de teste .

Explicação

Exemplo com entrada 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 bytes

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

Diminui / aumenta recursivamente os valores em 1 até que o resultado esteja em [0,1]


Bem-vindo ao PPCG, e boa resposta!
ETHproductions

2

Japonês , 8 bytes

u1 ªUbV1

Teste online!

Acho que é a primeira vez que usei b...

Explicação

 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 bytes

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

Explicação

Este é um uso bastante incomum de /;onde eu estou usando mais como um &&porque a condição depois dela não tem nada a ver com o padrão correspondente.

#~Mod~1...

Cálculo x % 1, que é correto para todos os casos, exceto números inteiros positivos.

.../. 0/;...

Substitua zeros na expressão anterior se ...

...#>0...

... a entrada é positiva ...

...->1...

com 1.


2

PHP, 37 bytes

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

Corra com echo <number> | php -R '<code>'.

Existem muitas maneiras de fazer isso ... essa deve ser uma das mais curtas do PHP.

O fmodresultado é negativo para flutuadores negativos e 0para números inteiros positivos; aqueles que precisam de ajuste: !!$mé verdadeiro para flutuadores, xoring com $n>0resultados em falso para flutuador positivo e int negativo, verdadeiro para flutuador negativo e int positivo; +lança isso para - 1ou 0- feito.


2

C 57 56 73 bytes

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

@ pinkfloydx33 Obrigado por apontar!

Versão não destruída:

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

Experimente online!


Você pode fazer em 1.vez de 1.0?
Kritixi Lithos

@KritixiLithos Não estou familiarizado com essa notação, mas parecia funcionar.
Abel Tom

Você deve ligar para tudo f? 😂 Também não acho que o parêntese (f<0)seja necessário.
Kennytm

Isso pode ser simplificado, acho que não replicar a subtração. Mas de qualquer forma ele não funciona para f(1)(que deve retornar 1)
pinkfloydx33

@ pinkfloydx33 muito obrigado por apontá-lo, esse código estava longe de estar pronto :) :) Corrigido, deve funcionar bem agora!
Abel Tom

1

SmileBASIC, 28 bytes

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

1

JavaScript (ES6), 19 bytes

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

Explicação: %1não fornece os resultados corretos em todos os casos:

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

Um 1 extra precisa ser adicionado nos casos incorretos, que são os de um não inteiro negativo e um inteiro positivo. É isso que a expressão (n>0==!(n%1))calcula.


Existem vários outros arranjos disso, mas ainda não encontrei um que seja mais curto ...
ETHproductions

1

> <> , 26 bytes

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

Experimente online!

Como as soluções em boas linguagens de golfe são quase sempre apresentadas instantaneamente, decidi misturar as coisas. Primeira <> <resposta!

Explicação

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

Curiosidade: a explicação é um programa <> <válido!


0

Javascript, 41 28 bytes

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

Math.floor() é tão longo ...


n|0é menor do que Math.floor(eu acho que ele funciona)
Kritixi Lithos

|0é diferente do que floor()para números negativos.
12Me21

0

Pitão, 7 bytes

|%Q1s<0

Explicação

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

Se você não se importa em usar Verdadeiro e Falso como 1 e 0, pode soltar o spor 6 bytes.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.