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.


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

?&K@J.HQG-JG"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.


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


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.

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)


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


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          

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

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.


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

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.

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)

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.


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>


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


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.


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

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

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"

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

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


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


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!


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

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"

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.

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.