Liczby, które są w rzeczywistości literami


42

Biorąc nieujemną liczbą całkowitą wejściowe, napisać program, który konwertuje numer szesnastkowy i zwraca wartość truthy jeśli forma szesnastkowy numer zawiera tylko znaki Apoprzez Fa wartość falsey inaczej.


Przypadki testowe

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)

Premia: -40 bajtów, jeśli program drukuje Only lettersdla opisanego powyżej wyzwania, Only numbersjeśli wersja szesnastkowa liczby zawiera tylko cyfry 0-9i Mixjeśli liczba szesnastkowa zawiera co najmniej jedną liczbę i co najmniej jedną literę.


To jest kod golfowy. Obowiązują standardowe zasady. Najkrótszy kod w bajtach wygrywa. Dozwolone są zarówno funkcje, jak i pełne programy.


2
Obecnie opracowuję odpowiedź w Golfical.
SuperJedi224,

Mój obecny pomysł: ukryty do ciągu podstawowego 16, a następnie Sprawdź, czy próba parsowania tego ciągu jako podstawowego zwraca liczbę 10NaN
Cyoce

@Cyoce To może działać, w zależności od wyboru języka
SuperJedi224,

3
Nierealistyczna premia (jeszcze raz): tylko ciąg MixOnlynumberslettersma 21 znaków
edc65

3
Mówisz „dodatnia liczba całkowita”, ale 0 to przypadek testowy.
xnor

Odpowiedzi:


22

Pyth, 43 - 40 = 3 bajty

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

Zestaw testowy

To osiąga bonus. Only numbersi na Only lettersszczęście różnią się tylko 4 literami. Formatowanie w stylu printf jest używane z %.

System selekcji odbywa się zarówno przez przecięcie heksa z G, alfabetu, jak i odjęcie G. Jeśli żadne z nich nie zakończy się fałszem, będzie to mieszanka, natomiast jeśli skrzyżowanie jest fałszem, to są liczby, a jeśli odejmowanie jest fałszem, to są litery.


1
Cholera, ten Pyth jest dziwny. Byłoby bardzo fajnie, gdybyś mógł uzyskać wynik ujemny.
KaareZ

15

Pyth, 6 bajtów

!-.HQG

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

Sprawdź to tutaj


12

Galaretka , 6 bajtów

b16>9P

Wypróbuj online!

Jak to działa

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.

Czy nie ma wbudowanego na 16, czy to nie jest coś?
CalculatorFeline

1
Jest teraz. To była jedna z pierwszych odpowiedzi na galaretki ...
Dennis,

11

TeaScript , 11 bajtów 13 15 16

xT(16)O(Sz)

Dość proste. Używa to TeaScript 2.0. Możesz pobrać tę wersję z Github

Wyjaśnienie

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

Wypróbuj online (nieco zmodyfikowana wersja, która działa w sieci)


3
Czy głos jest negatywny, ponieważ jest on długi? Czy w tej odpowiedzi jest coś jeszcze nie tak? A może ktoś po prostu nie lubi tej odpowiedzi?
Downgoat,

2
Nie powiedziałbym, że 16 lub 13 bajtów jest długich!
Luis Mendo,

23
Musisz przyznać, że poniżanie swoich postów jest dość kuszące.
Dennis,

10

Python, 24 bajty

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

Konwertuje wejściowy ciąg szesnastkowy (bez 0xprefiksu) za pomocą '%x'%n. Sprawdza, czy wszystkie znaki są większe niż '9'(które litery), sprawdzając, czy minjest powyżej '9'.


Nie wiem, jak Python obsługuje znaki / liczby, ale kod ASCII '9'to 54. Więc jeśli potrafisz pisać ...>54, możesz zapisać bajt.
CompuChip,

@CompuChip Python nie traktuje znaków ani ciągów znaków jak liczb. W rzeczywistości Python 2 uważa, że ​​są większe niż wszystkie liczby.
xnor

8

MATL , 10

i16YA1Y2mA

Przykłady

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

Wyjaśnienie

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

Bonusowe wyzwanie: 53−40 = 13

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

Przykłady

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

Wyjaśnienie

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
hmmm co to jest? wygląda na to, że Matlab ma teraz trochę mocy nuklearnej!
Abr001am,

@ Agawa001 Hahaha. W
pewnym sensie


8

C, 46 43 37 bajtów

Teraz z większą rekurencją! (Dzięki Dennis):

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

Premia: jeszcze krótsza (33 bajty), ale zawodzi w przypadku 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()przyjmuje inti zwraca albo 0(fałsz) albo niezerową (prawda).

Nawet nie próbowałem osiągnąć premii, "MixOnly lettersnumbers"sam pobieram 23 bajty, śledzenie nowego warunku wymagałoby 9 dodatkowych bajtów, printf()to 8 bajtów, co daje 40, co niweluje wysiłek.

Test główny:

#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");
  }
}

Co jest ?:? Musiałem go zastąpić, ||aby go skompilować. Ponadto, można zapisać bajt wymieniając *ze związkiem &w ten sposób unikając ()s po lewej stronie (choć wtedy trzeba dodać spację)?
Neil,

@ Neil a?:bjest rozszerzeniem GNU, które ocenia, aczy ajest prawdziwą wartością, w przeciwnym razie b. Przydaje się do obsługi wskaźników zerowych, takich jak send(message ?: "(no message)");. Wiem, że nie jest przenośny, ale przenośność kodu nigdy nie stanowi problemu w golfie kodowym :)
Stefano Sanfilippo

@StefanoSanfilippo możesz sprowadzić to do 33bajtów, robiąc to: F(x){x=(x%16>9)*(x<16?:F(x/16));}powoduje to nadużycie błędu (GCC), w którym jeśli w funkcji nie ma zmiennej zwrotnej i ustawiony jest główny argument, w niektórych przypadkach automatycznie zwróci główny argument ( na podstawie tego, co zostało zrobione), a to jeden z tych przypadków! Wypróbuj online: bit.ly/2pR52UH
Albert Renshaw

8

Python 3, 30 29 bajtów

1 bajt pozbawiony dzięki sysreq i Python 3.

lambda n:hex(n)[2:].isalpha()

Prosty lambdai krojący.


7

Perl 6 , 18 bajtów

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

stosowanie:

# 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 bajty

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

Wyjaśnienie:

                               &   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, bez wyrażenia regularnego, 28 bajtów

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

Jest też ta 27-bajtowa wersja, ale zwraca wartość odwrotną.

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

Miły! Możesz również zmienić to w ten sposób na 23 bajty:F=n=>!n||n%16>9&F(n>>4)
user81655

@ user81655 - Niestety, ta wersja zwraca true dla 0, więc jest niepoprawna.
zocky

No tak, chyba najkrótszy byłby F=n=>n%16>9&&n<16|F(n>>4)wtedy.
user81655,

@ user81655 Jestem pewien, że musisz zewrzeć obwód ||, ale myślę, że możesz uciec od używania &zamiast &&w tym przypadku.
Neil,

@Neil Dlaczego to jest? Testowałeś to?
user81655,

7

Julia, 18 bajtów

n->isalpha(hex(n))

Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca wartość logiczną. Aby to nazwać, nadaj mu nazwę, np f=n->....

Dane wejściowe są konwertowane na ciąg szesnastkowy za pomocą hex, a następnie sprawdzamy, czy w całości składa się ze znaków alfabetycznych isalpha.


6

JavaScript ES6, 29

Bez premii

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

Przy nowej wartości -40 premia jest już bliżej ... ale za mało. Wynik bonusowy 70 71 - 40 => 30 31

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

Testowy fragment kodu (wpisz liczbę w polu wprowadzania)

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


-n-1= ~nprawda?
CalculatorFeline

@CatsAreFluffy, jeśli n nie jest liczbowy jak „A” (to jest sedno tego wyzwania), ~n == -1podczas gdy-n-1 == NaN
edc65

4

GS2 , 6 bajtów

V↔i/◙s

Kod źródłowy używa kodowania CP437. Wypróbuj online!

Jak to działa

V       Evaluate the input.
 ↔      Push 16.
  i     Perform base conversion.
   /    Sort.
    ◙   Push [10].
     s  Perform greater-or-equal comparison.


4

Java, 46 44 38 bajtów

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

Dość prosty jednowierszowy, który konwertuje liczbę całkowitą na ciąg szesnastkowy i używa wyrażenia regularnego, aby ustalić, czy wszystkie znaki są literami.

-2 bajty dzięki @ Eng.Fouad.


"[a-f]+"zaoszczędzi 2 bajty.
Eng.Fouad

Nie powiedzie się za 516 ..
CalculatorFeline

@CatsAreFluffy Nie, nie ma.
TNT

No teraz to określa, czy ciąg zawiera do nas hex, więc wyjmij +-To marnotrawstwo bajt.
CalculatorFeline

@CatsAreFluffy Nie. matches Zwraca true, jeśli cały ciąg może być dopasowany podanym wyrażeniem regularnym. [a-f]bez znaku plus jest niepoprawny, ponieważ nie pasuje do całego łańcucha, ponieważ zawiera więcej niż jeden znak; zrobiłby to wtedy i tylko wtedy, gdy obecny jest jeden prawidłowy znak.
TNT


3

Ruby, 19 bajtów

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

Nie golfowany:

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

Stosowanie:

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

Z premią 70–40 = 30 bajtów

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

Stosowanie:

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

Późno, ale '%x'%n!~/\d/jest krótsza kontrola dla pierwszego rozwiązania, a drugie rozwiązanie ma nieprzetworzoną liczbę bajtów wynoszącą 70, a nie 75.
Wartość tuszu

3

Perl, 69–40 = 29 bajtów

$_=sprintf"%X",<>;print s/\d//?$_?"Mix":"Only numbers":"Only letters"

2

Cejlon, 55 bajtów

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

Prosto ... formatujemy njako liczbę szesnastkową (która tworzy ciąg), wywołujemy każdy znak tego ciągu .digit(który zwraca wartość true, jeśli jest cyfrą), następnie sprawdzamy, czy którykolwiek z nich jest prawdziwy, a następnie negujemy.

Wersja z bonusem ma znacznie wyższy wynik 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"));

Nie jestem pewien, jak ktokolwiek mógłby zrobić wersję bonusową wystarczająco krótką, aby była lepsza niż wersja bez premii, nawet same ciągi mają razem długość 28. Może język, który sprawia, że ​​naprawdę trudno jest uzyskać wartość true / falsey.

Oto sformatowana wersja:

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

2

Rdza, 70 bajtów

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

Ponieważ, wiesz, Java Rust.

W rzeczywistości jest dość elegancki:

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
  )

Szkoda, że ​​płyta funkcyjna definicji funkcji jest tak długa ....: P.


Mam pomysł. Więcej zamknięć!
CalculatorFeline


2

Poważnie, 12 bajtów

4ª,¡OkúOkd-Y

Hex Dump:

34a62cad4f6b
a34f6b642d59

Wypróbuj online

Jest taki sam, jak inne odpowiedzi w języku stosu. Będzie to tylko 7 bajtów, jeśli jeszcze poważnie obsługiwane jest odejmowanie łańcucha.

EDYCJA: Poważnie obsługuje teraz odejmowanie ciągów i działa teraz następujące 7-bajtowe rozwiązanie:

ú4╙,¡-Y

Hex Dump:

a334d32cad2d59

Wypróbuj online


1
11: 4╙,¡#S;ú∩S=(lub, lub , wiele sposobów na przeliterowanie :16:w dwóch bajtach: P)
Mego

Nie wiedziałem, że SI myśli.
kwintopia




2

SmileBASIC 3.2.1, 78 bajtów

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

Nie widzę tu żadnych znaków spoza ASCII (chyba że są jakieś); ten licznik jest ostatecznym decydentem i mówi 81.
kot

1
Nie ma znaczenia, że ​​implementacja używa UTF-16 wewnętrznie; dla reszty świata mogą równie dobrze być znakami UTF-8 w tym zakresie 0-127, więc twoja liczba bajtów wynosi 81.
kot

Dzięki za opinie, nie byłem pewien, czy „bajty” oznaczają, że powinienem liczyć 2 na znak. 81 to jest.
snail_

W rzeczywistości obecny konsensus +10 / -0 (z tym, co zresztą teraz się nie zgadzam) jest taki, że zawsze musimy korzystać z kodowania używanego przez tłumacza. Jeśli się nie zgadzasz, proszę zamieścić zdanie odrębne w tej sprawie.
lirtosiast

@ThomasKwa pfft, dobrze, ups, teraz wiem lepiej. Nie zdawałem sobie sprawy, że istnieje konsensus w tej sprawie i spędzam sporo czasu na meta.
kot

1

Japt, 12 bajtów

!UsG r"[a-f]

Wypróbuj online!

Jak to działa

!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.

Myślę, że !!UsG r"\\dmoże zadziałać i zaoszczędzić bajt
Downgoat

@Downgoat Dobra obserwacja, ale zwraca wartość true dla dowolnej liczby zawierającej literę.
ETHprodukcje

1

Gema, 41 znaków

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

Gema nie ma wartości logicznej, więc po prostu wyprowadza „t” lub „f”.

Przykładowy przebieg:

bash-4.3$ echo -n '11259375' | gema '*=@c{@radix{10;16;*}};c:<D>=f@end;?=;\Z=t'
t
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.