Цифри, які насправді букви


42

З урахуванням невід'ємного цілого введення, напишіть програму, яка перетворює число в шістнадцятковий і повертає триєдине значення, якщо шістнадцяткова форма числа містить лише символи Aчерез, Fа значення фальси - в іншому випадку.


Тестові справи

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

Моя поточна ідея: приховати до бази 16 рядка, а потім подивитись, чи намагається проаналізувати цей рядок як базове число 10 повертаєтьсяNaN
Cyoce

@Cyoce Це може спрацювати, залежно від вашого вибору мови
SuperJedi224

3
Нереалістичний бонус (ще раз): всього лише рядок MixOnlynumbersletters- 21 символи
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

Тестуйте це тут



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
Чи є голосування проти, бо це тривалий час? Чи є щось інше не в цій відповіді, про яку я не знаю? Або комусь просто не подобається ця відповідь?
Пуховик

2
Я б не сказав, що 16 чи 13 байт - це довго!
Луїс Мендо

23
Ви повинні визнати, що ваші публікації вниз - досить спокусливі.
Денніс

10

Пітон, 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

MATL , 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(хибний), або ненульовий (справжній).

Я навіть не намагався досягти бонусу, "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- це розширення GNU, яке оцінює, aчи aє істинним значенням, інакше до 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

Математика, 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 - На жаль, ця версія повертає істину для 0, тому вона неправильна.
zocky

О так, я думаю, найкоротшим було б F=n=>n%16>9&&n<16|F(n>>4)тоді.
користувач81655

@ user81655 Я впевнений, що вам потрібно коротке замикання ||, але я думаю, ви могли б піти з використання &замість &&цього.
Ніл

@Neil Чому це? Ви тестували це?
користувач81655

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 Ні. matches Повертає істину, якщо весь рядок може бути узгоджений заданим регулярним виразом. [a-f]без знака плюс невірно, оскільки він не відповідає всій рядку, враховуючи, що він містить більше одного символу; це було б тоді і лише за умови наявності одного дійсного символу.
ТНТ


3

Рубін, 19 байт

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

Безголівки:

-> 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/це коротша перевірка на рішення першого, а для другого рішення - кількість байтів у кількості 70, а не 75.
Чорнило значення


2

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

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

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

Версія з бонусом має набагато вищу оцінку 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 разом. Можливо, мова, яка робить насправді складно створити значення truthy / falsey.

Ось відформатована версія:

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 байт, якщо серйозно підтримується віднімання рядків.

EDIT: Серйозно тепер підтримується віднімання рядків, і наступне 7-байтове рішення працює:

ú4╙,¡-Y

Шестнадцятковий дамп:

a334d32cad2d59

Спробуйте в Інтернеті


1
11: 4╙,¡#S;ú∩S=(або чи , багато способів пишеться :16:в двох байтах: P)
Mego

Я не знав, що SI думаю.
Кінтопія

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 це.
равлик_

Власне, поточний консенсус + 10 / -0 (з яким я, до речі, зараз не згоден), полягає в тому, що ми завжди повинні використовувати кодування, яке використовує інтерпретатор. Якщо ви не погоджуєтесь, будь ласка, опублікуйте незгодну думку з цього питання.
ліртосіаст

@ThomasKwa pfft, добре, ой, тепер я знаю краще. Я не розумів, що з цього приводу існує консенсус, і витрачаю досить багато часу на мета.
кіт

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 Добре спостереження, але це повертає істину для будь-якого числа, що містить літеру.
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.