Mod Mengapung!

19

Perangkat lunak pemodelan 3D terutama menggunakan Pemetaan UV untuk memetakan tekstur ke objek 3D. Nilai yang valid untuk U dan V biasanya terletak dalam [0..1]rentang inklusif .

Tantangan

Anda membeli perangkat lunak pemodelan 3D baru yang super mudah digunakan. Namun ada satu masalah dengan itu: ia menambah atau mengurangi bilangan bulat acak dari nilai UV. Tugas Anda adalah membuat program atau fungsi yang mengubah nilai input untuk mendapatkan nilai float dalam [0..1]rentang inklusif .

Float yang dihasilkan harus memiliki bagian fraksional yang sama seperti aslinya, dan sedekat mungkin dengan aslinya. Karena keduanya 0dan 1berada dalam kisaran output, bilangan bulat 0 atau kurang harus berubah menjadi 0, dan bilangan bulat 1 atau lebih besar harus berubah menjadi 1.

Contoh algoritma dalam JavaScript:

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

Aturan

  • Input adalah bilangan bulat tunggal atau nilai float. Format wajar apa pun diizinkan selama ditentukan dalam jawaban Anda.
  • Output harus berupa representasi desimal dari nilai float.
  • Ketepatan output harus paling tidak sama dengan desimal sebagai input.
  • Angka nol di belakang diperbolehkan.
  • Pastikan kode Anda memilih yang mana dari 0 atau 1 yang akan dikeluarkan untuk input integer.

Uji kasus

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

Ini adalah , jadi kode terpendek dalam byte menang!

lolbas
sumber
4
Apakah Anda bermaksud 1 untuk memetakan ke 1? Biasanya rentang setengah terbuka digunakan. Berdasarkan pseudocode Anda, haruskah saya memahami semua bilangan bulat> 1 menuju 1, dan semua bilangan bulat <0 pergi ke 0>
xnor
4
Semua solusi% 1 gagal jika inputnya 1!
seshoumara
9
Sebenarnya, saya suka 1-> 1 hal, itu mencegah masalah menjadi built-in sepele untuk banyak bahasa.
xnor
2
Bisakah saya menggunakan sed untuk ini? Tidak ada tipe data dalam sed, input harus berupa aliran teks.
seshoumara
1
@seshoumara any reasonable input format is allowed, jadi saya akan mengatakan "Kenapa tidak?".
lolbas

Jawaban:

1

Jelly , 6 byte

%1o>0$

Cobalah online!

Jelly tidak memiliki Trueatau False, tetapi menggunakan 1dan 0di tempatnya.

%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.
Jonathan Allan
sumber
9

Python , 20 byte

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

Cobalah online!

Mengambil inputo modulo 1, kemudian menangani kasus batas dengan mengubah output 0 ke 1 untuk input positif. Output bool akan menghemat dua byte.

lambda x:x%1or x>0
Tidak
sumber
Saya pikir 1ormelanggar stabilo sintaks. (Saya menganggap itu ditafsirkan sebagai 1 or)
12Me21
@ 12Me21 Ya, dan saya belum melihat stabilo yang menanganinya dengan benar.
xnor
Milik saya
12Me21
6

Brachylog , 14 11 byte

Berkat Fatalize untuk bermain golf 3 byte.

∧≜:?+.≥0∧1≥

Untuk perubahan, jawaban ini tidak menggunakan mod :)

Cobalah online!

Penjelasan

∧≜                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
Leo
sumber
Output ini 0 untuk bilangan bulat positif ketika saya mencobanya secara online.
Neil
1
@Neil dikoreksi, terima kasih. Saya tidak tahu mengapa saya melewatkannya
Leo
2
Anda dapat menyimpan 3 byte seperti: ∧≜:?+.≥0∧1≥.
Fatalkan
4

JavaScript (ES6), 19 byte

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

Dalam JavaScript, n%xmengembalikan angka negatif jika nnegatif, artinya jika kita ingin mendapatkan residu positif, kita harus menambahkan xjika nnegatif. (n%x+x)%xmencakup semua kasus:

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

Solusi lain yang bekerja pada 20 byte, yang menunjukkan sedikit lebih banyak pola:

n=>n%1+(n%1?n<0:n>0)
Produksi ETH
sumber
3

MATL , 9 byte

1&\0>yg>+

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Contoh dengan input 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
Luis Mendo
sumber
3

Javascript, 28 byte

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

Mengurangi / meningkatkan nilai secara rekursif 1 hingga hasilnya dalam [0,1]

aul12
sumber
Selamat datang di PPCG, dan jawaban yang bagus!
ETHproduksi
2

Japt , 8 byte

u1 ªUbV1

Uji secara online!

Saya pikir ini adalah pertama kalinya saya pernah menggunakan b...

Penjelasan

 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
Produksi ETH
sumber
2

Mathematica, 20 byte

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

Penjelasan

Ini adalah penggunaan yang agak tidak biasa di /;mana saya menggunakannya lebih seperti &&karena kondisi setelah itu tidak ada hubungannya dengan pola yang cocok.

#~Mod~1...

Hitung x % 1, yang benar untuk semua kasus kecuali bilangan bulat positif.

.../. 0/;...

Ganti nol dalam ekspresi sebelumnya jika ...

...#>0...

... inputnya positif ...

...->1...

dengan 1.

Martin Ender
sumber
2

PHP, 37 byte

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

Jalankan dengan echo <number> | php -R '<code>'.

Ada begitu banyak cara untuk melakukan ini ... ini harus menjadi salah satu yang terpendek dalam PHP.

The fmodHasilnya adalah negatif untuk mengapung negatif dan 0untuk bilangan bulat positif; mereka perlu penyesuaian: !!$mbenar untuk float, xoring dengan $n>0hasil false untuk float positif dan int negatif, berlaku untuk float negatif dan int positif; +melemparkan itu ke 1atau 0- dilakukan.

Titus
sumber
2

C 57 56 73 byte

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

@ pinkfloydx33 Terima kasih telah menunjukkan!

Versi tidak disatukan:

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

Cobalah online!

Abel Tom
sumber
Dapat Anda lakukan 1.bukan 1.0?
Kritixi Lithos
@ KritixiLithos Saya tidak terbiasa dengan notasi itu tetapi sepertinya berhasil.
Abel Tom
Haruskah Anda memanggil semuanya f? 😂 Juga saya pikir kurung (f<0)tidak diperlukan.
kennytm
Itu bisa disederhanakan, saya pikir tidak mereplikasi pengurangan. Tapi bagaimanapun juga itu tidak berhasil f(1)(yang seharusnya mengembalikan 1)
pinkfloydx33
@ pinkfloydx33 terima kasih banyak untuk menunjukkannya, kode itu jauh dari selesai. :) Memperbaikinya, harus berjalan dengan baik sekarang!
Abel Tom
1

SmileBASIC, 28 byte

INPUT N?N-FLOOR(N)+(N<<0==N)
12Me21
sumber
1

JavaScript (ES6), 19 byte

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

Penjelasan: %1tidak memberikan hasil yang benar dalam semua kasus:

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

Tambahan 1 perlu ditambahkan dalam kasus-kasus yang salah, yaitu kasus non-integer negatif dan integer positif. Inilah yang (n>0==!(n%1))dihitung ekspresi .

Neil
sumber
Ada beberapa pengaturan lain dari ini, tapi saya belum menemukan yang lebih pendek ...
ETHproduksi
1

> <> , 26 byte

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

Cobalah online!

Karena solusi dalam bahasa golf yang baik hampir selalu diberikan secara instan, saya memutuskan untuk mencampuradukkan semuanya. Pertama <> <jawaban!

Penjelasan

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

Fakta menyenangkan: penjelasannya adalah program <> <yang valid!

PidgeyDigunakanGust
sumber
0

Javascript, 41 28 byte

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

Math.floor() begitu lama ...

12Me21
sumber
n|0lebih pendek dari Math.floor(saya pikir itu berfungsi)
Kritixi Lithos
|0berbeda dari floor()angka negatif.
12Me21
0

Pyth, 7 byte

|%Q1s<0

Penjelasan

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

Jika Anda tidak keberatan menggunakan True dan False sebagai 1 dan 0, Anda dapat menjatuhkan suntuk 6 byte.


sumber