Zahlen, die eigentlich Buchstaben sind

42

Schreiben Sie bei einer nicht negativen Ganzzahleingabe ein Programm, das die Zahl in Hexadezimal umwandelt und einen Wahrheitswert zurückgibt, wenn die Hexadezimalform der Zahl nur die Adurchgehenden Zeichen Fund ansonsten einen False-Wert enthält.


Testfälle

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)

Bonus: -40 Byte, wenn Ihr Programm Only lettersfür die oben beschriebene Herausforderung druckt , Only numberswenn die hexadezimale Version der Nummer nur die Ziffern enthält 0-9und Mixwenn die hexadezimale Nummer mindestens eine Ziffer und mindestens einen Buchstaben enthält.


Das ist Code Golf. Es gelten Standardregeln. Kürzester Code in Bytes gewinnt. Es sind entweder Funktionen oder vollständige Programme zulässig.

Arcturus
quelle
2
Derzeit wird eine Antwort in Golfical verfasst.
SuperJedi224,
Meine aktuelle Idee: NaN
Verstecke
@Cyoce Das kann funktionieren, abhängig von Ihrer Sprachauswahl
SuperJedi224
3
Unrealistischer Bonus (noch einmal): Nur die Zeichenfolge MixOnlynumberslettersist 21 Zeichen
edc65
3
Sie sagen "positive Ganzzahleingabe", aber 0 ist ein Testfall.
Donnerstag,

Antworten:

22

Pyth, 43 - 40 = 3 Bytes

?&[email protected]"Mix"%"Only %sers"?K"lett""numb

Testsuite

Damit ist der Bonus erreicht. Only numbersund unterscheiden sich Only lettersglücklicherweise nur um 4 buchstaben. printf-Formatierung wird mit verwendet %.

Das Auswahlsystem wird durchgeführt, indem sowohl der Schnittpunkt des Hex mit Gdem Alphabet genommen als auch subtrahiert wird G. Wenn beides nicht falsch ist, handelt es sich um eine Mischung. Wenn die Schnittmenge falsch ist, sind es Zahlen und wenn die Subtraktion falsch ist, sind es Buchstaben.

isaacg
quelle
1
Verdammt, dieser Pyth ist komisch. Wäre sehr cool, wenn Sie eine negative Punktzahl bekommen könnten.
KaareZ
15

Pyth, 6 Bytes

!-.HQG

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

Teste es hier

Adnan
quelle
12

Gelee , 6 Bytes

b16>9P

Probieren Sie es online!

Wie es funktioniert

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.
Dennis
quelle
Gibt es nicht ein eingebautes für 16 oder ist das nicht eine Sache?
CalculatorFeline
1
Da ist jetzt. Dies war eine der ersten Antworten von Jelly ...
Dennis
11

TeaScript , 11 Bytes 13 15 16

xT(16)O(Sz)

Ziemlich einfach. Dies verwendet TeaScript 2.0. Sie können diese Version vom Github erhalten

Erläuterung

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

Probieren Sie es online aus (leicht modifizierte Version, die im Web funktioniert)

Downgoat
quelle
3
Ist die Abwahl, weil das lang ist? Stimmt etwas mit dieser Antwort nicht, das mir nicht bekannt ist? Oder mag jemand diese Antwort einfach nicht persönlich?
Downgoat
2
Ich würde nicht sagen, dass 16 oder 13 Bytes lang sind!
Luis Mendo
23
Sie müssen zugeben, dass das Herunterschalten Ihrer Posts ziemlich verlockend ist.
Dennis
10

Python, 24 Bytes

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

Konvertiert die Eingabe in einen Hex-String (ohne 0xPräfix) mit '%x'%n. Überprüft, ob alle Zeichen größer sind als '9'(welche Buchstaben sind), indem überprüft wird, ob das minoben steht '9'.

xnor
quelle
Ich weiß nicht, wie Python mit Zeichen / Zahlen umgeht, aber der ASCII-Code '9'ist 54. Wenn Sie also schreiben ...>54können, können Sie ein Byte speichern.
CompuChip
@CompuChip Python behandelt Zeichen oder Strings nicht als Zahlen. Tatsächlich betrachtet Python 2 sie als größer als alle Zahlen.
15.
8

MATL , 10

i16YA1Y2mA

Beispiele

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

Erläuterung

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

Bonus Herausforderung: 53 - 40 = 13

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

Beispiele

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

Erläuterung

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          
Luis Mendo
quelle
2
hmmm was ist das Es scheint, als hätte Matlab jetzt etwas Nuk-Power!
12.
@ Agawa001 Hahaha. Art von
Luis Mendo
8

C 46 43 37 Bytes

Jetzt mit mehr Rekursion! (Danke Dennis):

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

Bonus: Noch kürzer (33 Bytes), scheitert aber an 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()Nimmt ein intund gibt entweder 0(false) oder einen Wert ungleich Null (true) zurück.

Ich habe nicht einmal versucht, den Bonus zu erreichen, "MixOnly lettersnumbers"nimmt 23 Bytes allein, die Verfolgung der neuen Bedingung hätte 9 zusätzliche Bytes erforderlich gemacht, printf()ist 8 Bytes, was sich auf 40 summiert, was den Aufwand zunichte macht.

Testleitung:

#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");
  }
}
Stefano Sanfilippo
quelle
Was ist ?:? Ich musste es durch ersetzen ||, um es kompilieren zu können. Können Sie auch ein Byte speichern, indem Sie das *durch ein ersetzen und &so das ()s auf der linken Seite vermeiden (obwohl Sie dann ein Leerzeichen hinzufügen müssen)?
Neil
@Neil a?:bist eine GNU-Erweiterung, die auswertet, aob aes sich um einen Wahrheitswert handelt, andernfalls um b. Es ist praktisch, mit Null-Zeigern umzugehen send(message ?: "(no message)");. Ich weiß, es ist nicht tragbar, aber Code-Portabilität ist nie ein Problem in Code Golf :)
Stefano Sanfilippo
@StefanoSanfilippo Sie können dies auf 33Bytes reduzieren, indem Sie dies tun: F(x){x=(x%16>9)*(x<16?:F(x/16));}Dies missbraucht einen (GCC) Fehler, bei dem, wenn es keine Rückgabevariable in einer Funktion gibt und das Hauptargument gesetzt wurde, das Hauptargument in einigen Fällen automatisch zurückgegeben wird ( basierend darauf, welche Logik gemacht wurde), und dies ist zufällig einer dieser Fälle! Versuchen Sie es online: bit.ly/2pR52UH
Albert Renshaw
8

Python 3, 30 29 Bytes

1 Byte entfernt dank sysreq und Python 3.

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

Einfach lambdaund in Scheiben schneiden.

LeeNeverGup
quelle
7

Perl 6 , 18 Bytes

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

Verwendungszweck:

# 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
Brad Gilbert b2gills
quelle
7

Mathematica, 32 Bytes

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

Erläuterung:

                               &   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.
LegionMammal978
quelle
7

Javascript, ES6, kein regulärer Ausdruck, 28 Bytes

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

Es gibt auch diese 27-Byte-Version, die jedoch den inversen Wert zurückgibt.

F=n=>n%16<10||n>15&&F(n>>4)
zockig
quelle
Nett! Sie können es auch so für 23 Bytes neu F=n=>!n||n%16>9&F(n>>4)
anordnen
@ user81655 - Leider gibt diese Version für 0 den Wert true zurück, sodass sie nicht korrekt ist.
Zocky
Ach ja, F=n=>n%16>9&&n<16|F(n>>4)dann wäre wohl die kürzeste Zeit.
User81655
@ user81655 Ich bin mir ziemlich sicher, dass Sie das kurzschließen müssen ||, aber ich denke, Sie könnten damit durchkommen, &anstatt es &&in diesem Fall zu verwenden.
Neil
@Neil Warum das? Hast du es getestet?
user81655
7

Julia, 18 Bytes

n->isalpha(hex(n))

Dies ist eine anonyme Funktion, die eine Ganzzahl akzeptiert und einen Booleschen Wert zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z f=n->....

Die Eingabe wird mithilfe von in eine hexadezimale Zeichenfolge konvertiert. hexAnschließend wird mithilfe von überprüft, ob die Eingabe vollständig aus alphabetischen Zeichen besteht isalpha.

Alex A.
quelle
6

JavaScript ES6, 29

Kein Bonus

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

Mit dem neuen Wert von -40 ist der Bonus jetzt näher ... aber nicht genug. Bonuspunktzahl 70 71 - 40 => 30 31

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

Test-Snippet (geben Sie eine Zahl in das Eingabefeld ein)

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

edc65
quelle
-n-1= ~n, richtig?
CalculatorFeline
@CatsAreFluffy wenn n nicht wie 'A' numerisch ist (das ist der ~n == -1-n-1 == NaN
springende
4

GS2 , 6 Bytes

V↔i/◙s

Der Quellcode verwendet die CP437-Codierung. Probieren Sie es online!

Wie es funktioniert

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

Oktave, 22 Bytes

@(n)all(dec2hex(n)>64)
Alephalpha
quelle
4

Java, 46 44 38 Bytes

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

Ziemlich einfacher Einzeiler, der die Ganzzahl in eine hexadezimale Zeichenfolge umwandelt und mithilfe von Regex feststellt, ob alle Zeichen Buchstaben sind.

-2 Bytes dank @ Eng.Fouad.

TNT
quelle
"[a-f]+"würde 2 Bytes sparen.
Eng.Fouad
Schlägt fehl für 516 ..
CalculatorFeline
@CatsAreFluffy Nein, tut es nicht.
TNT
Nun wird bestimmt, ob die Zeichenfolge einen Hex-Buchstaben enthält. Entfernen Sie also das +- es ist eine Verschwendung von Byte.
CalculatorFeline
@CatsAreFluffy No. matches gibt true zurück, wenn die gesamte Zeichenfolge mit der angegebenen Regex übereinstimmen kann. [a-f]ohne das Pluszeichen ist falsch, da es nicht mit der gesamten Zeichenfolge übereinstimmt , da es mehr als ein Zeichen enthält; es wäre genau dann, wenn ein gültiges Zeichen vorhanden ist.
TNT
3

CJam ( 9 8 Bytes)

{GbA,&!}

Online-Demo

Peter Taylor
quelle
2
Ebenso kurz:{Gb$N<!}
Dennis
3

Ruby, 19 Bytes

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

Ungolfed:

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

Verwendungszweck:

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

Mit Bonus 70 - 40 = 30 Bytes

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

Verwendungszweck:

f=->n{'%x'%n=~/^(\d+)|(\D+)$/;$1?'Only numbers':$2?'Only letters':'Mix'}
f[10]
=> Only letters
f[100]
=> Only numbers
f[161]
=> Mix
Vasu Adari
quelle
Spät, aber es '%x'%n!~/\d/ist eine kürzere Prüfung für die erste Lösung, und die zweite Lösung hat eine unformatierte Byteanzahl von 70, nicht von 75.
Value Ink
3

Perl, 69 - 40 = 29 Bytes

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

Ceylon, 55 Bytes

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

Ganz einfach ... Wir formatieren nals Hexadezimalzahl (die eine Zeichenfolge erzeugt), rufen für jedes Zeichen dieser Zeichenfolge die .digitZahl auf (die true zurückgibt, wenn es sich um eine Ziffer handelt), prüfen dann, ob eine davon true ist, und negieren diese.

Die Version mit Bonus hat eine viel höhere Punktzahl von 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"));

Ich bin mir nicht sicher, wie jemand eine Bonusversion so kurz machen könnte, dass sie besser ist als die ohne Bonus, auch wenn diese Saiten alleine eine Länge von 28 haben. Vielleicht eine Sprache, die es wirklich schwer macht, einen Wahrheitswert zu produzieren.

Hier ist eine formatierte Version:

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

Rust, 70 Bytes

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

Weil, weißt du, Java Rust.

Eigentlich ist es aber ziemlich elegant:

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
  )

Aber es ist eine Schande, dass die Funktionsdefinition Boilerplate so lang ist ...: P

Türknauf
quelle
Ich habe eine Idee. Noch mehr Verschlüsse!
CalculatorFeline
2

Im Ernst, 12 Bytes

4ª,¡OkúOkd-Y

Hex Dump:

34a62cad4f6b
a34f6b642d59

Probieren Sie es online

Es ist das gleiche wie bei den anderen Antworten in der Stapelsprache. Es wären nur 7 Bytes, wenn die Zeichenfolgensubtraktion noch ernsthaft unterstützt würde.

BEARBEITEN: Unterstützt nun ernsthaft die Zeichenfolgensubtraktion und die folgende 7-Byte-Lösung funktioniert jetzt:

ú4╙,¡-Y

Hex Dump:

a334d32cad2d59

Probieren Sie es online

Quintopie
quelle
1
11: 4╙,¡#S;ú∩S=(oder oder , viele Möglichkeiten, :16:in zwei Bytes zu buchstabieren : P)
Mego
Ich wusste nicht, dass ich denke.
Quintopia
2

05AB1E , 2 Bytes (nicht konkurrierend)

Code:

ha

Ha! Das sind zwei Bytes! Leider nicht konkurrierend, da diese Sprache die Herausforderung datiert :(

Erläuterung:

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

Probieren Sie es online! oder Überprüfen Sie alle Testfälle!

Adnan
quelle
1
hdÔ©1åi•4?ŸâτΛ•}®0åi•4?ŸàpÕTà•}®g2Qi•²•} 36B` für den Bonus, der ... 6 mehr ergibt! Wooooo Boni!
Magic Octopus Urn
2

Python 3, 28 Bytes

lambda x:min(hex(x)[1:])>'@'
0WJYxW9FMN
quelle
2

SmileBASIC 3.2.1, 78 Bytes

INPUT V FOR I=0 TO 9
IF INSTR(HEX$(V),STR$(I))>-1 THEN ?"FALSE"END
NEXT?"TRUE"
Schnecke_
quelle
Ich sehe hier keine Nicht-ASCII-Zeichen (es sei denn, es gibt einige). Dieser Zähler ist der endgültige Entscheider und es heißt 81.
Katze
1
Es spielt keine Rolle, dass die Implementierung intern UTF-16 verwendet. Für den Rest der Welt können sie auch UTF-8-Zeichen im Bereich sein 0-127, daher beträgt Ihre Byteanzahl 81.
Katze
Vielen Dank für die Rückmeldung, war nicht sicher, ob "Bytes" bedeutete, dass ich 2 pro Zeichen zählen sollte. 81 es ist.
snail_
Tatsächlich ist der aktuelle + 10 / -0- Konsens (mit dem ich übrigens jetzt nicht einverstanden bin), dass wir immer die Codierung verwenden müssen, die ein Interpreter verwendet. Wenn Sie nicht einverstanden sind, schreiben Sie bitte eine abweichende Meinung zu dieser Frage.
Lirtosiast
@ThomasKwa pfft, okay, hoppla, jetzt weiß ich es besser. Ich wusste nicht, dass es einen Konsens darüber gibt, und ich verbringe ein bisschen Zeit mit Meta.
Katze
1

Japt, 12 Bytes

!UsG r"[a-f]

Probieren Sie es online!

Wie es funktioniert

!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.
ETHproductions
quelle
Ich denke, !!UsG r"\\dkönnte funktionieren und ein Byte speichern
Downgoat
@Downgoat Gute Beobachtung, aber das ergibt true für jede Zahl, die einen Buchstaben enthält.
ETHproductions
1

Gema, 41 Zeichen

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

In Gema gibt es keinen Booleschen Wert, daher wird einfach "t" oder "f" ausgegeben.

Probelauf:

bash-4.3$ echo -n '11259375' | gema '*=@c{@radix{10;16;*}};c:<D>=f@end;?=;\Z=t'
t
Mann bei der Arbeit
quelle