Это целое число?


26

Число является целым, если оно является неотрицательным целым числом без десятичной части. Так что 0и так 8и 233494.0есть, а 1.1и так 0.001и 233494.999нет.


вход

Число с плавающей точкой в ​​базе по умолчанию / кодировка вашего языка.

Например, целочисленное представление по умолчанию для двоичного лямбда-исчисления будет представлять собой церковные цифры . Но целочисленное представление по умолчанию для Python - это десятичное основание 10 , а не Unary .

Выход

Truthy значение , если вход целое, falsy значение , если это не так .

Обратите внимание, что если ваш язык поддерживает только десятичную точность, скажем, до 8 знаков, 1.000000002можно считать целым.

Ввод и вывод могут быть выполнены с помощью любых стандартных методов ввода / вывода .


Контрольные примеры

Input        -> Output
332          -> true
33.2         -> false
128239847    -> true
0.128239847  -> false
0            -> true
0.000000000  -> true
1.111111111  -> false
-3.1415926   -> false
-3           -> false

счет

Как и в случае с , выигрывает самое короткое представление. Удачи!


2
@StephenLeppik Это не проще, чем ванильный тест на четность, или Hello World, или Машина Правды. (На самом деле, это сложнее, чем у большинства из них.)
MD XF

Можем ли мы принять входные данные в виде двух чисел, представляющих дробь?
LyricLy

@LyricLy Нет, для некоторых языков это будет намного проще, а для других - не нужно.
MD XF

Обратите внимание, что целые числа являются неотрицательными целыми числами. Пожалуйста, обновите ваше первое предложение, чтобы отразить это. И вы можете добавить тестовые случаи отрицательных чисел, если вы хотите показать, как целые числа не являются отрицательными, и ложные выходные данные для отрицательных чисел действительны.
Томас Уорд

1
@ThomasWard, эта статья в Википедии, кажется, не полностью согласна с вами: «Тексты, которые исключают ноль из натуральных чисел, иногда ссылаются на натуральные числа вместе с нулем как на целые числа, но в других работах этот термин используется вместо целых чисел (включая отрицательные целые числа) ". Я читаю заголовок как спрашивающий о целых числах.
ilkkachu

Ответы:


13

APL (Дьялог) , 3 байта

⌊≡|

Попробуйте онлайн!

Обратите внимание, что f←это было добавлено в ссылку TIO из-за технических ограничений, но обычно это не требуется.


Это элегантно! Я не знаю, почему я добавил ненужный потолок в свой ответ ....
Гален Иванов

4
@GalenIvanov Это просто floor(n) == abs(n).
Эрик Outgolfer




6

Шелуха , 3 байта

£ΘN

Попробуйте онлайн! Третий тестовый случай истекает в TIO, поэтому я отрубил пару цифр. Я попытался запустить его локально, но убил его через пару минут, так как он использовал более 6 ГБ памяти и мой компьютер начал заикаться. Это должно теоретически закончиться в какой-то момент ...

объяснение

Это соответствует описанию задачи довольно прямо.

£ΘN  Implicit input: a number.
  N  The infinite list [1,2,3,4...
 Θ   Prepend 0: [0,1,2,3,4...
£    Is the input an element of this list?

Как бы λx → floor(x) == abs(x)выглядело в шелухе?
Линн

@ Линн Это было бы §=⌊aтак на один байт длиннее.
Згарб


5

/// , 94 байта, ввод жестко запрограммирован

/=/\/x://:/\/\///-0/-:.0/.:.|/|:-|/|:0=1=2=3=4=5=6=7=8=9=|x/|:||/true:x:/-:/.:/|/+:++/false/||

Попробуйте онлайн!

Ввод между двумя завершающими вертикальными линиями ( ||)

Обрезает -00...0и .00...0, преобразует все оставшиеся цифры в xs, затем проверяет, имеет ли оставшееся число еще xs после .или после него -не следует ..

Может сэкономить до 7 байт в зависимости от того , что считается truthy и falsey , так как этот язык не имеет собственных значений truthy / falsey, в настоящее время выводит trueи , falseно может измениться, например, Tи Fдля 87 байт , если это разрешено.


5

Октава , 15 байт

@(x)any(x==0:x)

Попробуйте онлайн!

Этот основан на подходе, использованном в ответе @ flawr на Haskell .

Хотя это уменьшает количество байтов до 15, это постыдно неэффективно (без обид), создавая список всех целых чисел от и 0до xи проверяя, xсодержится ли оно внутри.


Октава , 18 байт

@(x)fix(x)==abs(x)

Попробуйте онлайн!

Принимает ввод как число двойной точности. Возвращает true, если целое.

Проверяет, является ли входное значение при округлении равным величине входного значения. Это будет только тот случай, когда число будет положительным и целым.


Октава , 18 байт

@(x)~mod(x,+(x>0))

Попробуйте онлайн!

Альтернативное решение для 18 байтов. К сожалению, modфункция в Octave не будет неявно преобразовывать a boolв a double, так что +( )нужно больше, чем сравнение. В противном случае это решение было бы короче.


Октава , 18 байт

@(x)x>=0&~mod(x,1)

Попробуйте онлайн!

И еще один ... Я не могу получить меньше 18 байт . Все из-за необходимости допустить, чтобы 0 было истинным, >=а не просто >.



4

Ацето , 6 байт

rfdi±=p
г захватывает ввод
е превращает его в число с плавающей точкой
D и я дублирую его и преобразует его в целое число
± толкает абсолютное значение (b / c не может быть отрицательным)
= проверяет, равны ли они
р распечатывает результат

Попробуйте онлайн!



4

QBIC , 17 байт

?(:=int(a))*(a>0)

объяснение

?             PRINT
 (:=int(a))     if the input (: assigns the cmd line param to 'a') equals itself 
                cast to int, -1 else 0
 *              times
 (a>0)          if the input > 0, -1 else 0

Если любая из проверок завершается неудачно, возвращается 0. Если оба значения верны, возвращается -1 x -1 = 1.



4

C (gcc), 27 28 27 25 байтов

-2 благодаря PrincePolka

#define g(f)!fmod(f,f>=0)

Попробуйте онлайн!

Определяет макрос «функция», gкоторый принимает параметр f(любого типа). Затем проверяет, является ли приведение к f mod 1нулю, и если fоно не отрицательно.


Я думаю, что вы обязаны включить размер includeдирективы в ваш счетчик байтов, так как fmod определен в math.h: смотрите там
HatsuPointerKun

@HatsuPointerKun Это работает и без него
Mr. Xcoder

2
Я не думаю, что вам нужен -lm в дистрибутивах C на базе Windows (работает на моей машине)
Conor O'Brien

25, # определить g (f)! Fmod (f, f> = 0)
PrincePolka

4

C #, Java: 43 байта

-1 байт благодаря Zacharý
-1 байт благодаря TheLetalCoder

int w(float n){return(n==(int)n&&n>=0)?1:0;}

C # имеет специальную 33-байтовую оптимизацию, которую вы не можете сделать в Java:

bool w(float n){return(int)n==n;}

Для тестирования

Код C #:

class Program {
    int w(float n){return(n==(int)n&&n>=0)?1:0;}

    static void Main(string[] args)
    {
        var p = new Program();
        float[] fTab = new float[]{
            332,33.2f,128239847,0.128239847f,0,0.0000f,1.1111111111f,-3.1415926f,-3
        };
        foreach (float f in fTab) {
            Console.WriteLine(string.Format("{0} = {1}", f, (p.w(f) != 0).ToString()));
        }
        Console.ReadKey();
    }
}

Java-код:

public class MainApp {
    int w(float n){return(n==(int)n&&n>=0)?1:0;}

    public static void main(String[]a) {
        MainApp m = new MainApp();
        float testArr[] = new float[]{
                332,33.2f,128239847,0.128239847f,0,0.0000f,1.1111111111f,-3.1415926f,-3
        };

        for (float v : testArr) {
            System.out.println(v + " = " + String.valueOf(m.w(v)!=0));
        }
    }
}

Я думаю, что вы можете удалить пробел между returnи (.
Zacharý

вернуть boolи нет необходимости в троичной.
TheLethalCoder

@TheLethalCoder boolне существует в Java
HatsuPointerKun

Я не очень хорошо знаю Java / C #, но вы можете сделать это return(int)n==n? Или это приведёт n==nк int, а не просто n?
Захари

1
Вы можете уменьшить ответ Java 7 на 3 байта, отменив проверку и изменив логический оператор на побитовый: int w(float n){return(int)n!=n|n<0?0:1;}( 40 байтов ). В Java 8 лямбда-код еще короче: n->(int)n==n&n>=0( 17 байт ) , и то же самое относится к ответу на C # как лямбда: n=>(int)n==n&n>=0(также 17 байт ) .
Кевин Круйссен

4

Google Sheets, 10 байт

Функция анонимного рабочего листа, которая A1сообщает входные данные из ячейки и выводит их в вызывающую ячейку.

=A1=Int(A1


3

Ly , 35 47 байт

ir"-"=[0u;]pr[["0"=![psp>l"."=[ppr!u;]p<2$]pp]]

Попробуйте онлайн!

Ly имеет поддержку float, но единственный способ создать float - это выполнить деление. Нет никакого способа принять float в качестве входных данных, поэтому мне пришлось вместо этого вручную проверять строку.

Потерял 13 байт, добавив поддержку отрицательных чисел.


3

JavaScript, 14

n=>!(n<0||n%1)

13 байтов:n=>!(n-(n|0))
Исмаэль Мигель

@IsmaelMiguel. Это не работает для отрицательных чисел.

@ThePirateBay Какой точный номер? Я пробовал с 5, 5.1, -5, -5.1, 0, 0.1 и -0.1.
Исмаэль Мигель

@IsmaelMiguel. (n=>!(n-(n|0)))(-3)возвращается true, но должен вернуться false. Смотрите последний контрольный пример.

О, вы правы в этом: / Я неправильно прочитал вопрос: /
Исмаэль Мигель




3

C #, 40 37 29 байт

bool z(float x)=>x%1==0&x>=0;

Благодаря @Dennis_E сэкономлено 8 байт!

Старый ответ (37 байт)

bool z(float x){return x%1==0&&x>=0;}

Старый старый ответ (40 байт):

bool z(float x){return (int)x==x&&x>=0;}

2
30 байтов: bool z(float x)=>x%1==0&&x>=0;и вы можете использовать один &для 29 байтов
Dennis_E

@Dennis_E Спасибо!
yummypasta

x=>x%1==0&x>=0короче и скомпилироватьFunc<float, bool>
TheLethalCoder

3

JavaScript, 17 15 байт

_=>_<0?0:_==~~_

_=>_<0?0:_==(_|0)

Спасибо edc65 за обнаружение моих ошибок.


3

Нерасширенный Sinclair ZX81, 20 байтов

 1 INPUT A
 2 PRINT ABS A=INT A

20 байтов, потому что BASIC является токенизированным.

Просто выдаст 1 (true), если число положительное, а значение введенного числа равно его целочисленному значению. Выходы 0 ни одного из этих условий не выполнены.


1
Это токенизированный язык? Если это так, вы должны указать это в своем ответе.
Тейлор Скотт

1
Извините, да, это tokenized, т. Е. INPUT - это 1 байт оперативной памяти, как и PRINT и даже> = из-за
необычной

1
В частности, номер каждой строки составляет 5 байтов + 1 newline( \r\nэквивалент в языке ZX81), пробелы не считаются байтами, поскольку они уже включены в ключевые слова, как правило, из-за системы ввода Sinclair «нажатием одной клавиши». При запуске это займет больше байтов, так как это поместит значение Aв var stack; Я думаю, что каждое числовое значение всегда 5 байтов памяти.
Шон Бебберс

1
и ZX Spectrum тоже
edc65

1
Насколько я знаю, режим токенизации точно такой же (у Spectrum больше кодов). И любое буквальное число составляет 6 байтов: байт «числовой тег», за которым следует значение, закодированное в 5-
байтовом

3

C, C ++: 38 37 байт

-1 байт благодаря Zacharý

-1 байт благодаря возрастанию

int w(float n){return(int)n==n&n>=0;}

Для тестирования

C: попробуйте онлайн

Код C:

#include <stdio.h>
int main() {
    float f[] = { 332,33.2f,128239847,0.128239847f,0,0.0000f,1.1111111111f,-3.1415926f,-3 };
    int t;
    for ( t = 0; t < 9; ++t) {
        printf("%f = %s\n", f[t], w(f[t])?"true":"false");
    }
    return 0;
}

Код C ++:

#include <iostream>
int main() {
    std::initializer_list <std::pair<float,bool>> test{
        {332.f,true}, {33.2f,false}, {128239847.f,true}, {0.128239847f,false}, {0.f,true}, {0.000000f,true}, {1.111111f,false}, {-3.1415926f,false}, {-3.f,false}
    };

    for (const auto& a : test) {
        if (w(a.first) != a.second) {
            std::cout << "Error with " << a.first << '\n';
        }
    }
    return 0;
}

1
Это будет работать только до INT_MAX. (Мне действительно все равно, но некоторым это нравится.)
MD XF

Будет ли изменить его на return(int)n==n...работу?
Захари

Вы можете сбрить один байт, используя unsigned int вместо подписанного (поскольку тогда вам не нужен >=0тест): return(unsigned)n==n; а в C вы можете опустить возвращаемый тип еще на 4 байта.
Тоби Спейт

Вы можете сэкономить еще 8 байтов:w(float n){n=n==(int)n&&n>=0;}
Johan du Toit




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