Числа, которые на самом деле являются буквами


42

Если задан неотрицательный целочисленный ввод, напишите программу, которая преобразует число в шестнадцатеричное и возвращает истинное значение, если шестнадцатеричная форма числа содержит только до Aконца символы, Fа в противном случае - значение Falsey.


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

10
==> True (A in hexadecimal)

100
==> False (64 in hexadecimal)

161
==> False (A1 in hexadecimal)

11259375
==> True (ABCDEF in hexadecimal)

0
==> False (0 in hexadecimal)

Бонус: -40 байт, если ваша программа печатает Only lettersдля задачи, описанной выше, Only numbersесли шестнадцатеричная версия номера содержит только цифры 0-9и Mixесли шестнадцатеричное число содержит хотя бы одно число и хотя бы одну букву.


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


2
В данный момент готовлю ответ в Golfical.
SuperJedi224

Моя текущая идея: преобразовать в строку base 16, а затем посмотреть, пытается ли разобрать эту строку как возвращение числа base 10NaN
Cyoce 12.12.15

@Cyoce Это может работать, в зависимости от вашего выбора языка
SuperJedi224

3
Нереалистичный бонус (еще раз): всего MixOnlynumbersletters21 строка символов
edc65

3
Вы говорите «положительный целочисленный ввод», но 0 - это контрольный пример.
xnor

Ответы:


22

Pyth, 43 - 40 = 3 байта

?&K@J.HQG-JG"Mix"%"Only %sers"?K"lett""numb

Тестирование

Это достигает бонуса. Only numbersи, Only lettersк счастью, отличаются только на 4 буквы. форматирование в стиле printf используется с %.

Система выбора осуществляется как путем пересечения гекса с Gалфавитом, так и путем вычитания G. Если ни один из них не заканчивается ложно, это микс, а если пересечение ложное, это числа, а если вычитание ложное, это буквы.


1
Черт, этот Пиф странный. Было бы очень здорово, если бы вы могли получить отрицательную оценку, хотя.
KaareZ

15

Pyth, 6 байт

!-.HQG

  .HQ   # Converts the input to hexadecimal
 -   G  # Deletes all letters
!       # If empty, output True, else False

Проверьте это здесь


12

Желе , 6 байт

b16>9P

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

Как это работает

b16>9P  Input: z

b16     Convert the input to base 16.
   >9   Compare each resulting digit with 9; return 1 iff greater.
     P  Take the product of the resulting Booleans.

Разве нет встроенного на 16 или это не вещь?
CalculatorFeline

1
Есть сейчас. Это был один из первых ответов Желе ...
Деннис

11

TeaScript , 11 байт 13 15 16

xT(16)O(Sz)

Довольно просто Это использует TeaScript 2.0. Вы можете получить эту версию от Github

объяснение

        // Implicit: x = input, Sz = alphabet
xT(16)  // input -> hex
O(Sz)   // Only letters?

Попробуйте онлайн (слегка измененная версия, которая работает в сети)


3
Является ли голосование против, потому что это долго? Что-то еще не так с этим ответом, о котором я не знаю? Или кому-то просто не нравится этот ответ?
Downgoat

2
Я бы не сказал, что 16 или 13 байтов длинны!
Луис Мендо

23
Вы должны признать, что отрицательное отношение к вашим постам довольно заманчиво.
Деннис

10

Python, 24 байта

lambda n:min('%x'%n)>'9'

Преобразует входные данные в шестнадцатеричную строку (без 0xпрефикса) с помощью '%x'%n. Видит, если все его символы больше, чем '9'(какие буквы), видя, если minвыше '9'.


Я не знаю, как Python обрабатывает символы / цифры, но ASCII-код '9'равен 54. Поэтому, если вы можете написать, ...>54вы можете сохранить байт.
CompuChip

@CompuChip Python не обрабатывает символы или строки как числа. Фактически, Python 2 считает их больше всех чисел.
xnor

8

МАТЛ , 10

i16YA1Y2mA

Примеры

>> matl i16YA1Y2mA
> 240
0
>> matl i16YA1Y2mA
> 255
1

объяснение

i       % input                         
16YA    % convert to string representation in base 16
1Y2     % predefined literal: 'A':'Z'
m       % true for set member             
A       % all

Бонусное испытание: 53-40 = 13

i16YA1Y2mXKA?'Only letters'}Ka?'Mix'}'Only numbers']]

Примеры

>> matl
 > i16YA1Y2mXKA?'Only letters'}Ka?'Mix'}'Only numbers']]
 > 
> 255
Only letters

>> matl
 > i16YA1Y2mXKA?'Only letters'}Ka?'Mix'}'Only numbers']]
 > 
> 100
Only numbers

>> matl
 > i16YA1Y2mXKA?'Only letters'}Ka?'Mix'}'Only numbers']]
 > 
> 240
Mix

объяснение

i                       % input                                                 
16YA                    % convert integer to string representation in base 16
1Y2                     % predefined literal: 'A':'Z'
m                       % true for set member       
XK                      % copy to clipboard K                 
A                       % all                                   
?                       % if (top of the stack)                 
  'Only letters'        % string literal                                        
}                       % else                 
  K                     % paste from clipboard K      
  a                     % any                
  ?                     % if (top of the stack)      
    'Mix'               % string literal    
  }                     % else                                                  
    'Only numbers'      % string literal           
  ]                     % end             
]                       % end          

2
хм что это? Похоже, что Matlab получил немного энергии сейчас!
Abr001am

@ Agawa001 Хахаха. Вроде
Луис Мендо


8

C 46 43 37 байт

Теперь с большей рекурсией! (Спасибо Денис)

F(x){return(x%16>9)*(x<16?:F(x/16));}

Бонус: еще короче (33 байта), но не для x = 0:

F(x){return!x?:(x%16>9)*F(x/16);}

b;F(x){for(b=x;x;x/=16)b*=x%16>9;return b;}

F()принимает intи возвращает 0(false) или ненулевое (true).

Я даже не пытался получить бонус, занимал "MixOnly lettersnumbers"только 23 байта, отслеживание нового условия потребовало бы 9 дополнительных байтов, printf()это 8 байтов, что в сумме составляет 40, сводя на нет усилия.

Основной тест:

#include <stdio.h>

int main() {
  int testdata[] = {10, 100, 161, 11259375, 0};
  for (int i = 0; i < 5; ++i) {
    int d = testdata[i];
    printf("%d (0x%x) -> %s\n", d, d, F(d)?"yep":"nope");
  }
}

Что ?:? Я должен был заменить это, ||чтобы заставить это скомпилировать. Кроме того, можете ли вы сохранить байт, заменив *символ &таким образом, чтобы избежать ()s слева (хотя тогда вам нужно добавить пробел)?
Нил

@Neil a?:bявляется расширение ГНУ , которое вычисляется , aесли aэто значение truthy, в противном случае b. Подходит для обработки нулевых указателей, как send(message ?: "(no message)");. Я знаю, что это не переносимо, но переносимость кода никогда не вызывает проблем в коде гольф :)
Стефано Санфилиппо

@StefanoSanfilippo вы можете сделать это до 33байтов, выполнив это: F(x){x=(x%16>9)*(x<16?:F(x/16));}это приводит к ошибке (GCC), при которой, если в функции нет возвращаемой переменной и был задан основной аргумент, в некоторых случаях будет автоматически возвращаться главный аргумент ( основываясь на том, что логика была сделана), и это, случается, один из тех случаев! Попробуйте онлайн: bit.ly/2pR52UH
Альберт Реншоу


7

Perl 6 , 18 байт

{.base(16)!~~/\d/} # 18 bytes

использование:

# give it a name
my &code = {.base(16)!~~/\d/}

for 10, 100, 161, 11259375, 0 {
  printf "%8s %6s %s\n", $_, .base(16), .&code
}

      10      A True
     100     64 False
     161     A1 False
11259375 ABCDEF True
       0      0 False

7

Mathematica, 32 байта

Tr@DigitCount[#,16,0~Range~9]<1&

Объяснение:

                               &   A function returning whether
Tr@                                 the sum of elements of
   DigitCount[ ,  ,         ]        the numbers of
                   0~Range~9          zeros, ones, ..., nines in
                16                    the hexadecimal expansion of
              #                       the first argument
                             <1     is less than one.

7

Javascript, ES6, без регулярных выражений, 28 байт

F=n=>n%16>9&&(n<16||F(n>>4))

Есть также эта 27-байтовая версия, но она возвращает обратное значение.

F=n=>n%16<10||n>15&&F(n>>4)

Ницца! Вы также можете переставить его следующим образом для 23 байтов:F=n=>!n||n%16>9&F(n>>4)
user81655

@ user81655 - К сожалению, эта версия возвращает true для 0, поэтому она неверна.
Zocky

Ах да, наверное, самое короткое было бы F=n=>n%16>9&&n<16|F(n>>4)тогда.
user81655 14.12.15

@ user81655 Я уверен, что вам нужно замкнуть накоротко ||, но я думаю, что вы могли бы избежать использования &вместо &&этого.
Нил

@ Нил Почему это? Вы проверяли это?
user81655 16.12.15

7

Юлия, 18 байт

n->isalpha(hex(n))

Это анонимная функция, которая принимает целое число и возвращает логическое значение. Чтобы назвать его, дайте ему имя, например f=n->....

Входные данные преобразуются в шестнадцатеричную строку с помощью hex, затем мы проверяем, состоит ли она целиком из буквенных символов isalpha.


6

JavaScript ES6, 29

Нет бонуса

n=>!/\d/.test(n.toString(16))

С новым значением -40 бонус теперь ближе ... но не достаточно. Бонусный балл 70 71 - 40 => 30 31

n=>/\d/.test(n=n.toString(16))?1/n?'Only numbers':'Mix':'Only letters'

Тестовый фрагмент (введите число в поле ввода)

#I { width:50%}
<input id=I oninput="test()"/><br>
Hex <span id=H></span><br>
Result <span id=R></span>


-n-1= ~n, верно?
CalculatorFeline

@CatsAreFluffy, если n не является числовым, как «A» (вот и весь смысл этой задачи), ~n == -1а-n-1 == NaN
edc65



4

Java, 46 44 38 байт

i->i.toHexString(i).matches("[a-f]+");

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

-2 байта благодаря @ Eng.Fouad.


"[a-f]+"сэкономит 2 байта.
Eng.Fouad

Сбой для 516 ..
CalculatorFeline


Ну теперь он определяет , если строка содержит в шестигранной букве, поэтому удалите +-IT трату байта.
CalculatorFeline

@CatsAreFluffy No. matches возвращает true, если вся строка может быть сопоставлена ​​заданным регулярным выражением. [a-f]неверный знак «плюс» неверен, поскольку не соответствует всей строке, поскольку в нем содержится более одного символа; это будет, если и только если присутствует один действительный символ.
TNT


3

Рубин, 19 байт

->n{!('%x'%n)[/\d/]}

Ungolfed:

-> n {
  !('%x'%n)[/\d/]
}

Использование:

f=->n{!('%x'%n)[/\d/]} # Assigning it to a variable
f[0]
=> false
f[10]
=> true
f[100]
=> false
f[161]
=> false
f[11259375]
=> true

С бонусом 70 - 40 = 30 байт

->n{'%x'%n=~/^(\d+)|(\D+)$/;$1?'Only numbers':$2?'Only letters':'Mix'}

Использование:

f=->n{'%x'%n=~/^(\d+)|(\D+)$/;$1?'Only numbers':$2?'Only letters':'Mix'}
f[10]
=> Only letters
f[100]
=> Only numbers
f[161]
=> Mix

Позднее, но '%x'%n!~/\d/это более короткая проверка для первого решения, а во
Value Ink


2

Цейлон, 55 байт

Boolean l(Integer n)=>!any(formatInteger(n,16)*.digit);

Просто ... мы форматируем nшестнадцатеричное число (которое создает строку), вызываем для каждого символа этой строки .digitчисло (которое возвращает true, если это цифра), затем проверяем, является ли какой-либо из них истиной, и затем отменяем это.

Версия с бонусом имеет гораздо больший счет 119 - 25 = 94 :

String c(Integer n)=>let(s=formatInteger(n),d=s*.digit)(every(d)then"Only numbers"else(any(d)then"Mix"else"Only letters"));

Я не уверен, как кто-нибудь мог сделать бонусную версию достаточно короткой, чтобы быть лучше, чем без бонусная версия, даже у этих строк только длина 28. Может быть, язык, который действительно затрудняет создание истинного / ложного значения.

Вот отформатированная версия:

String c(Integer n) =>
        let (d = formatInteger(n,16)*.digit)
    (every(d) then "Only numbers"
                else (any(d) then "Mix"
                    else "Only letters"));

2

Ржавчина, 70 байт

fn f(n:i32)->bool{format!("{:x}",n).chars().all(|c|c.is_alphabetic())}

Потому что, знаете, Java Rust.

Это на самом деле довольно элегантно, хотя:

format!("{:x}", n)         // format n as hex (:x)
  .chars()                 // get an Iter over the characters
  .all(                    // do all Iter elements satisfy the closure?
    |c| c.is_alphabetic()  // self-explanatory
  )

Но обидно, что шаблон определения функции так долго ....: P


У меня есть мысль. Больше закрытий!
CalculatorFeline


2

Серьезно, 12 байт

4ª,¡OkúOkd-Y

Шестнадцатеричный дамп:

34a62cad4f6b
a34f6b642d59

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

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

РЕДАКТИРОВАТЬ: Серьезно теперь поддерживает вычитание строки, и теперь работает следующее 7-байтовое решение:

ú4╙,¡-Y

Шестнадцатеричный дамп:

a334d32cad2d59

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


1
11: 4╙,¡#S;ú∩S=(или или , много способов записать :16:в два байта: P)
Мего

Я не знал, что я думаю.
Quintopia

2

05AB1E , 2 байта (не конкурирующие)

Код:

ha

Ха! Это два байта! К сожалению, не конкурирует, потому что этот язык устарел :(

Объяснение:

h   # Convert input to hexadecimal
 a  # is_alpha, checks if the value only contains letters

Попробуйте онлайн! или проверьте все контрольные примеры!


1
hdÔ©1åi•4?ŸâτΛ•}®0åi•4?ŸàpÕTà•}®g2Qi•²•} 36B` для бонуса, в результате чего ... еще 6! Wooooo бонусы!
Волшебная Урна Осьминога



2

SmileBASIC 3.2.1, 78 байт

INPUT V FOR I=0 TO 9
IF INSTR(HEX$(V),STR$(I))>-1 THEN ?"FALSE"END
NEXT?"TRUE"

Я не вижу здесь никаких не-ASCII символов (если их нет); этот счетчик является окончательным решающим фактором, и он говорит 81.
кот

1
Неважно, что реализация использует UTF-16 внутри; для остального мира они также могут быть символами UTF-8 в диапазоне 0-127, таким образом, ваш счетчик байтов равен 81.
кот

Спасибо за отзыв, не был уверен, что "байты" означают, что я должен считать 2 на символ. 81 это.
snail_

На самом деле, текущий консенсус + 10 / -0 (с которым, кстати, я сейчас не согласен) заключается в том, что мы всегда должны использовать кодировку, которую использует интерпретатор. Если вы не согласны, пожалуйста, оставьте особое мнение по этому вопросу.
lirtosiast

@ThomasKwa Пффф, ладно, упс, теперь я знаю лучше. Я не осознавал, что по этому поводу был достигнут консенсус, и потратил немало времени на мета.
кот

1

Japt, 12 байт

!UsG r"[a-f]

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

Как это работает

!UsG r"[a-f] // Implicit: U = input integer, G = 16
 UsG         // Convert U to a base-16 string.
     r"[a-f] // Replace all lowercase letters with an empty string.
!            // Take the logical NOT of the result.
             // This returns true for an empty string; false for anything else.

Я думаю, что !!UsG r"\\dможет работать и сохранить байт
Downgoat

@Downgoat Хорошее наблюдение, но оно возвращает true для любого числа, содержащего букву.
ETHproductions

1

Гема, 41 персонаж

*=@c{@radix{10;16;*}}
c:<D>=f@end;?=;\Z=t

В Gema нет логического значения, поэтому он просто выводит «t» или «f».

Образец прогона:

bash-4.3$ echo -n '11259375' | gema '*=@c{@radix{10;16;*}};c:<D>=f@end;?=;\Z=t'
t
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.