Alphabet Position Finder

10

Inspiriert von der Codewars Kata .

Ihr Ziel ist es, eine Eingabezeichenfolge wie diese zu verwenden:

"'Twas a dark and stormy night..."

und geben Sie eine Zeichenfolge zurück, die die Position jedes Zeichens im Alphabet enthält, durch Leerzeichen getrennt ist und nicht alphabetische Zeichen wie folgt ignoriert:

"20 23 1 19 1 4 1 18 11 1 14 4 19 20 15 18 13 25 14 9 7 8 20"

Für eine zusätzliche Herausforderung können Sie alle numerischen Zeichen in der ursprünglichen Zeichenfolge durch sich selbst + 27 ersetzen. Zum Beispiel "25"würde werden "29, 32". Dies ist völlig optional.

Sie müssen 1-Indizierung (verwenden 'a'==1, 'b'==2usw.)

Zusätzliche Regeln:

  • Sie müssen eine Zeichenfolge zurückgeben, kein Array.

  • Nachgestellte Leerzeichen sind in Ordnung.

Der Gewinner hat die niedrigste Byteanzahl.

Viel Glück!

Theo C.
quelle
eng verwandt
Giuseppe
5
@ TheoC Warum? Der allgemeine Konsens ist, dass Antworten in jedem vernünftigen Format ausgegeben werden können sollten, da dies zu viel Aufblähen und Ungerechtigkeit gegenüber Sprachen verursachen kann, die sich durch Leerzeichen auf kürzere Weise verbinden können.
Okx
1
@TheoC Warum erlaubst du nicht einfach beides?
Okx
3
Willkommen bei PPCG! Dies ist insgesamt eine anständige Herausforderung, aber wenn Sie das nächste Mal eine Herausforderung veröffentlichen, sollten Sie Folgendes beachten. 1) Diese Herausforderung ist ziemlich einfach. Ich denke, es wäre interessanter, wenn der optionale Teil obligatorisch wäre (beachten Sie, ändern Sie diesen Teil jetzt nicht, es ist zu spät). 2) Sie sind in Bezug auf einige willkürliche Teile ziemlich restriktiv. Warum nicht ein Array zulassen? Es ist unsere Standards als ein Array von Zeichen ist eine Zeichenfolge . Ich würde empfehlen, diesen Thread für Ideen durchzulesen.
James
2
Zukünftige Hinweise: Die Indizierung 1 und 0 ist normalerweise ein und dasselbe, und beide sind normalerweise zulässig. Auch das Einschränken von Ausgabeformaten ist verpönt. Wenn es sich um eine Werteliste handelt, muss die Sprache das Format festlegen. Die Herausforderung besteht weder in der Formatierung der Ausgabe noch in der Verschiebung von Indizes. Daher sollte es keine Einschränkung sein, wenn Sie Sprachen nur erlauben könnten, das zu tun, was sie auf natürliche Weise tun würden, und sich auf die Herausforderungsabsicht konzentrieren könnten.
Magic Octopus Urn

Antworten:

5

05AB1E , (5?) 7 Bytes

Ganz rechts zwei Bytes sind Ausgabeformatierungen

áÇ32%ðý

Ein Port meiner Jelly-Antwort , aber O5AB1E ist knapper für die Alphabetfilterung.

Probieren Sie es online aus!

Wie?

áÇ32%ðý - take input implicitly
á       - filter keep alphabetical characters
 Ç      - to ordinals
  32    - thirty-two
    %   - modulo (vectorises)
     ð  - push a space character
      ý - join
Jonathan Allan
quelle
Da OP möchte, dass es durch Leerzeichen geteilt gedruckt wird, kann ein nachfolgendes ðýZeichen hinzugefügt werden. Aber da die Hälfte der Antwortausgabelisten, lasse ich es wohl erst einmal.
Kevin Cruijssen
Ah. Ich habe es in meinen Antworten verpasst ...
Jonathan Allan
5

Java 8, 82 78 72 69 62 Bytes

s->{for(int c:s)System.out.print(c>64&~-c%32<26?c%32+" ":"");}

-13 Bytes dank @ OlivierGrégoire .

Probieren Sie es online aus.

Erläuterung:

s->                    // Method with character-array parameter and no return-type
  for(int c:s)         //  Loop over its characters as integers
    System.out.print(  //   Print:
     c>64&~-c%32<26?   //    If the current character is a letter:
      c%32+" "         //     Print the position in the alphabet with a trailing space
     :                 //    Else:
      "");}            //     Print nothing
Kevin Cruijssen
quelle
1
s->s.chars().forEach(c->{if(c>64&~-c%32<26)System.out.print(c%32+" ");})(72 Bytes).
Olivier Grégoire
1
@ OlivierGrégoire Danke! Und -3 weitere Bytes durch Ändern in ein ternäres if. :)
Kevin Cruijssen
s->{for(int c:s)System.out.print(c>64&~-c%32<26?c%32+" ":"");}(62 Bytes) Verwenden von a char[]als Eingabe anstelle von a String.
Olivier Grégoire
4

R , 55 50 Bytes

cat(utf8ToInt(gsub("[^A-Za-z]","",scan(,"")))%%32)

Probieren Sie es online aus!

Liest Eingaben von stdin, konvertiert in Großbuchstaben, entfernt nicht in Großbuchstaben geschriebene alphabetische Buchstaben, konvertiert in Codepunkte, subtrahiert in 64 Mods von 32 und druckt in stdout, getrennt durch Leerzeichen.

Vielen Dank an Kevin Cruijssen für den Golf!

Giuseppe
quelle
50 Bytes
Kevin Cruijssen
@ KevinCruijssen * facepalm * duh
Giuseppe
Ich habe der Frage zwei Kommentare (Fragen) hinzugefügt - je nach Antwort besteht die Möglichkeit, dies auf 46 oder sogar 39 Zeichen zu reduzieren.
JayCe
1
Sie können 47 mit[^A-z]
MickyT
4

APL (Dyalog Unicode) , 24, 20, 14, 13 Bytes

-4 Bytes danke an Zacharý (und Mr. Xcoder)!

-6 Bytes dank Adám!

-1 Byte dank ngn!

A⍳⎕A∩⍨≡819⌶⊢

Probieren Sie es online aus!

Erläuterung:

        819⌶⊢  - to uppercase
   A∩⍨         - intersect with the letters A-Z (args swapped to preserve the order)
                 - index in
A               - the A-Z letters list

Meine anfängliche Lösung:

APL (Dyalog Unicode) , 24 bis 20 Byte

{⍵/⍨27>⍵}⎕A1(819⌶)⊢

Probieren Sie es online aus!

Erläuterung:

                        indices of     
              1(819⌶)⊢  the right argument (⊢) changed to uppercase
          A            in the list of uppercase letters
{⍵/⍨     }              copy (filter) those items from the list of indeces
     27>⍵               which are smaller than 27 (all non A-Z chars will have index 27)

Lach mich nicht aus, ich bin neu bei APL :)

Galen Ivanov
quelle
1
Das ist eigentlich bemerkenswert gut für jemanden, der neu bei APL ist! Sie brauchen die Klammern nicht, sie werden angenommen. Auch {1(819⌶)⍵}kann 1(819⌶)⊢. Ansonsten tolle Arbeit! Ich hoffe, Sie genießen APL in der Zukunft!
Zacharý
@ Zacharý Danke! Ich hoffe es (ich habe einige Kenntnisse in J, ich bin nicht ganz neu in Array-Sprachen)
Galen Ivanov
1
Wie Zachary bemerkte, werden die Klammern angenommen , sodass Sie sie nicht in die Byteanzahl aufnehmen müssen, was zu 20 Bytes führt.
Herr Xcoder
1
@ Jonah Ich habe eine Erklärung hinzugefügt. Sie haben Recht, Großschreibung und das Alphabet selbst kosten viel mehr in J.
Galen Ivanov
1
Gute Arbeit! Sie können ein Byte speichern, indem Sie das 1in the zusammensetzen, 819⌶und fünf speichern, indem Sie 27s direkt entfernen : 27~⍨⎕A⍳819⌶⍨∘1; oder nehmen Sie die Kreuzung mit dem Alphabet:⎕A⍳⎕A∩⍨819⌶⍨∘1
Adám
3

Python 2 , (45?) 55 Bytes

11 Bytes hinzugefügt, um die Ausgabe zu formatieren, was dies auch mit Python inkompatibel macht 3)

lambda s:' '.join(`ord(c)%32`for c in s if c.isalpha())

Ein weiterer Port meiner Jelly-Antwort.

Probieren Sie es online aus!


Nicht formatierte Version (Rückgabe einer Liste von Ganzzahlen):

lambda s:[ord(c)%32for c in s if c.isalpha()]
Jonathan Allan
quelle
1
Es sieht so aus, als ob OP auf einer durch Leerzeichen getrennten String-Ausgabe besteht
Sok
1
Ja - das habe ich bei all meinen Antworten verpasst - man gewöhnt sich so sehr an die Normen der Seite!
Jonathan Allan
3

JavaScript (Node.js) , 69 55 54 Byte

t=>t.match(/[a-z]/gi).map(i=>parseInt(i,36)-9).join` `

Probieren Sie es online aus!

Erklärung:

t =>                       // lambda function accepting a string as input
    t.match(/a-z/gi).      // returns all parts of string that match as an array 
        map(i=>            // map over that array with argument i 
            parseInt(i,36) // convert to base 36 
                - 9        // and subtract 9 from it
        ).                 // end map
        join` `            // convert to space separated string

11 Bytes dank @Kevin gespeichert

Noch 1 Byte dank @Neil


Sie können Unterstützung für Zahlen für einige zusätzliche Bytes hinzufügen (dank @neil).

JavaScript (Node.js) , 62 Byte

t=>t.match(/[^_\W]/g).map(i=>(parseInt(i,36)+26)%36+1).join` `

Probieren Sie es online aus!

Muhammad Salman
quelle
-11 Bytes durch Ändern a-zzu A-Za-zund i.toLowerCase().charCodeAt()-96zui.charCodeAt()%32
Kevin Cruijssen
1
parseInt(i,36)-9speichert ein weiteres Byte.
Neil
.match(/[^_\W]/g).map(i=>(parseInt(i,36)+26)%36+1)Sie können Zahlen unterstützen, sind sich aber nicht sicher, ob dies der beste Weg ist.
Neil
2

Gelee , (7?) 8 Bytes

Das Byte ganz rechts ist die Ausgabeformatierung

fØẠO%32K

Ein vollständiges Programm, das eine Zeichenfolge im Python-Format akzeptiert, die das Ergebnis an STDOUT druckt

Probieren Sie es online aus!

Wie?

fØẠO%32K - Main Link: list of characters (created from the string input)
 ØẠ      - yield the alphabet = ['A','B',...,'Z','a','b',...,'z']
f        - filter keep (discard non alphabet characters)
   O     - ordinals          ('A':65, 'Z':90, 'a':97, 'z':122, etc.)
     32  - literal thirty-two
    %    - modulo            (65:1,   90':26,  97:1,  122:26,  etc.)
       K - join with spaces (makes a list of characters and integers)
         - implicit print
Jonathan Allan
quelle
2

Japt v2.0a0 -S, 12 10 Bytes

r\L ¨c uH

Versuch es


Erläuterung

r              :Remove
 \L            :  Non-letter characters
    ¬          :Split to array
     ®         :Map
      c        :  Character code
        u      :  Modulo
         H     :  32
               :Implicitly join with spaces and output
Zottelig
quelle
2

x86-Opcode, 35 Byte

0080h: AC 3C 24 75 04 88 45 FF C3 0C 20 2C 60 76 F1 D4
0090h: 0A 0D 30 30 86 E0 3C 30 74 01 AA 86 E0 AA B0 20
00a0h: AA EB DD                                       

f:  lodsb
    cmp al, '$'
    jnz @f
        mov [di-1], al
        ret
    @@:
    or al, 32
    sub al, 96
    jbe f
    aam
    or ax, 3030H
    xchg ah, al
    cmp al, 48
    jz @f
        stosb
    @@:
    xchg ah, al
    stosb
    mov al, 32
    stosb
    jmp f

Angenommen, das Ergebnis enthält mindestens einen Buchstaben und nein {|}~

40 Bytes, die alle ASCII-Zeichen zulassen

0080h: AC 3C 24 75 04 88 45 FF C3 0C 20 2C 60 76 F1 3C
0090h: 1A 77 ED D4 0A 0D 30 30 86 E0 3C 30 74 01 AA 86
00a0h: E0 AA B0 20 AA EB D9                           
14 m2
quelle
Was ist "x86-Opcode"? Ist dies nur eine Übermittlung des x86-Maschinencodes?
Jakob
@ Jakob wahr. Ich sage hier nicht ".COM", weil es eine Funktion ist und verlasse mich nicht auf das ".COM" -Format
l4m2
Hmm. Ja, ich denke, es wird davon ausgegangen, dass Maschinencodelösungen keine vollständigen ausführbaren Dateien sein müssen. Könnte tatsächlich besser sein, es einfach als "x86-Maschinencode" zu bezeichnen
Jakob
2

Stax , 9 10 9 Bytes

üpÉÿ%}},√

Führen Sie es aus und debuggen Sie es

-1 Byte dank @recursive

Erläuterung:

v{VaIvm0-J Full program, unpacked, implicit input
v          Lowercase
 {    m    Map:
  VaI        Index in lowercase alphabet (0-based, -1 for not found)
     ^       Increment
       0-  Remove zeroes
         J Join by space
           Implicit output

Stax , 7 Bytes

É▌Xl»↔"

Führen Sie es aus und debuggen Sie es

Dieser gibt Newline-getrennt aus. Ausgepackt : vmVaI^|c. Ähnlich, aber mit Map, die implizit mit nachgestellten Zeilenumbrüchen ausgegeben wird.

wastl
quelle
Hm. Es scheint ein Problem beim Packen von Programmen zu geben, die im Weltraum enden
rekursiv am
@recursive Oh, habe das nicht bemerkt (normalerweise probiere ich die Links aus, aber anscheinend habe ich es hier vergessen). Ich habe eine Problemumgehung hinzugefügt.
Wastl
Ich habe diesen Fehler auch nie bemerkt. Ich werde es in der nächsten Version von Stax beheben. Bestehende gepackte Programme bleiben unverändert.
rekursiv
Hier ist eine 9 zurück für deine Probleme.
rekursiv
2

Leerzeichen , 152 117 Bytes

-35 Bytes dank @Lynn .

[N
S S N
_Create_Label_LOOP][S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   S _Read_STDIN_as_character][T   T   T   _Retrieve][S N
S _Duplicate_input][S S S T S S S S S N
_Push_32][T S T T   _Modulo][S N
T   _Swap_top_two][S S S T  T   T   T   T   T   N
_Push_63][T S T S _Integer_divide][T    S S N
_Multiply][S N
S _Duplicate][S S S T   T   S T T   N
_Push_27][S T   S S T   N
_Copy_1st][S S S T  N
_Push_1][T  S S S _Add][T   S T S _Integer_divide][T    S S N
_Mulitply][N
T   S N
_If_0_Jump_to_Label_LOOP][T N
S T _Print_as_number][S S S T   S S S S S N
_Push_32_space][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

Buchstaben S(Leerzeichen), T(Tabulator) und N(neue Zeile) werden nur als Hervorhebung hinzugefügt.
[..._some_action]nur als Erklärung hinzugefügt.

Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und neuen Zeilen).

Erklärung im Pseudocode:

Start LOOP:
  Character c = STDIN as character
  Integer n = (c modulo-32) * (c integer-divided by 63)
  Integer m = 27 integer-divided by (n + 1) * n;
  If(m == 0):
    Go to next iteration of LOOP
  Else:
    Print n as integer to STDOUT
    Print a space to STDOUT
    Go to next iteration of LOOP
Kevin Cruijssen
quelle
1
Ich habe nicht die Zeit, die in Whitespaces zu schreiben, aber vielleicht könnte man so etwas schreiben diese
Lynn
1
Sieht so aus, als wären das 117 Bytes ! (* Ich habe 64 in 63 im Code geändert, da es äquivalent, aber kürzer ist, in Whitespace darzustellen) :)
Lynn
@Lynn Nicht schlecht, -35 Bytes genau dort. Vielen Dank. :)
Kevin Cruijssen
1

Holzkohle , 21 Bytes

≔⁺β⭆χιβF↧S¿№βι«I⊕⌕βι→

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:

≔⁺β⭆χιβ

Hängen Sie die Ziffern an die vordefinierte Variable für Kleinbuchstaben an.

F↧S

Schleife über den unteren Eingang.

¿№βι«

Wenn das aktuelle Zeichen ein Buchstabe oder eine Ziffer ist,

I⊕⌕βι

Drucken Sie den 1-indizierten Index aus.

und lassen Sie ein Leerzeichen für den nächsten Wert.

Neil
quelle
1

Rot , 93 Bytes

func[s][a: charset[#"a"-#"z"]parse lowercase s[any[copy c a(prin[-96 + to-char c""])| skip]]]

Probieren Sie es online aus!

Galen Ivanov
quelle
Ich weiß nicht genug über Rot, kann #"a"-#"z"aber sowohl in Klein- als auch in Großbuchstaben geändert werden. und dann lowercasekann das entfernt werden; und -96 + to-char ckann Modulo-32 sein? Ich bin mir nicht sicher, ob das überhaupt Bytes in Rot spart.
Kevin Cruijssen
@ Kevin Cruijssen Danke, ich werde es später versuchen
Galen Ivanov
Die @ KevinCruijssen- parseFunktion sammelt Zeichenfolgen, auch wenn die Übereinstimmung ein einzelnes Zeichen ist. Deshalb brauche ich immer die to-char. Für die Großbuchstaben müsste ich dem Zeichensatz # "A" - # "Z" hinzufügen, was den Gewinn (falls vorhanden) durch das Eliminieren beeinträchtigt lowercase.
Galen Ivanov
Ja, ich hatte ein bisschen Angst, dass ich #"A"-#"Z"im Vergleich zu nicht viel gewinnen könnte lowercase, da es nur 1 Byte kürzer ist. Und ich wusste, dass Sie das brauchen würden to-char, war mir nur nicht sicher, ob -96 + und Modulo-32 ähnlich groß sein würde.
Kevin Cruijssen
1

Perl 5 , 47 Bytes

Mit der zusätzlichen Herausforderung, Ziffern zu analysieren:

print map{(ord(uc)-64)%43," "}<>=~/([A-Z\d])/gi

Probieren Sie es online aus!

Durch Ignorieren von Ziffern auf 38 Byte reduziert

print map{ord()%32," "}<>=~/([A-Z])/gi
fockjef
quelle
1

PHP , 70 Bytes

for(;$c=$argv[1][$i++];)if(($c=ord($c))>64&($c%=32)>0&$c<27)echo"$c ";

Probieren Sie es online aus!

-5 Bytes dank Kevin

user2803033
quelle
Snippets sind hier nicht als Einreichungen zulässig, aber Sie können sie zu einer Funktion oder einem vollständigen Programm machen.
Nissa
Entschuldigung, jetzt verwendet es das erste Argument als Eingabe
user2803033
Hallo, willkommen bei PPCG! Wenn Sie dies noch nicht getan haben, sind Tipps zum Golfen in PHP und Tipps zum Golfen in <allen Sprachen> möglicherweise interessant. Was Teile betrifft, kann man Golf spielen: &&kann sein &und ord(strtolower($c))-96kann sein ord($c)%32. Ich denke auch, dass Sie das ~vorher entfernen können $c, aber ich bin nicht sicher. Ich habe in PHP nicht viel programmiert und weiß ~sowieso nicht genau, wofür das hier verwendet wird.
Kevin Cruijssen
Danke für deinen Beitrag. Mod 32 ist eine gute Idee. Es spart einige Bytes, erfordert jedoch eine zusätzliche Überprüfung, um sicherzustellen, dass ord ($ c) größer als 64 ist.
user2803033
1

Perl 5 -p , 35 Bytes

$_="@{[map{(-64+ord uc)%43}/\w/g]}"

Probieren Sie es online aus!

Enthält den zusätzlichen Teil über die Ziffern.

Xcali
quelle
1
/\w/beinhaltet_
Brad Gilbert b2gills
Viel kleiner als das, womit ich gespielt hatte! Sie können ein Byte speichern und den erwähnten Fehler @ BradGilbertb2gills beheben, indem Sie Folgendes verwenden -F/[^0-9\pL]|/: Probieren Sie es online aus!
Dom Hastings
1

Japt 2.0 -S, 9 Bytes

f\l ®c %H

Führen Sie es online aus

Erläuterung:

f\l ®c %H                                    Input: "Hello..."
f            Match:
 \l             [A-Za-z]                     ["H","e","l","l","o"]
    ®        Map Z over the results:
     c         char-code of Z                [72,101,108,108,111]
       %H      mod 32                        [8,5,12,12,15]
-S           Join the chars with a space     8 5 12 12 15
Oliver
quelle
1

Perl 6 , 32 Bytes (Alpha), 41 Bytes (Alpha + Ziffer)

{~(.uc.comb(/<:L>/)».ord X-64)}

Probieren Sie es aus (32 Bytes Alpha)

{~((.uc.comb(/<:L+:N>/)».ord X-64)X%43)}

Probieren Sie es aus (41 Bytes Alpha + Ziffer)

Erweitert:

32 Bytes Alpha

{  # bare block lambda with implicit parameter $_

  ~( # coerce to string (space separated)

      .uc                      # uppercase
      .comb( / <:L > / )\      # get letters as a sequence
      ».ord                    # get the ordinal of each
      X- 64                    # subtract 64 from each
  )
}

41 Bytes Alpha + Ziffer

{  # bare block lambda with implicit parameter $_

  ~( # coerce to string (space separated)
    (
      .uc                      # uppercase
      .comb( / <:L + :N > / )\ # get letters and numbers as a sequence
      ».ord                    # get the ordinal of each
      X- 64                    # subtract 64 from each
    ) X% 43                    # modulus 43 for each
  )
}
Brad Gilbert b2gills
quelle
Dies entspricht auch Nicht-ASCII-Zeichen wie Э, aber ich habe das OP um Klärung gebeten, ob die Eingabe nur ASCII ist oder nicht.
Jo King
1

Tcl , 93 Bytes

puts [lmap c [split $argv ""] {if [string is alp $c] {expr ([scan $c %c]-64)%32} {continue}}]

Probieren Sie es online aus!

Sergiol
quelle
1

PHP 108 105 Bytes

Probieren Sie es online aus (108 Bytes)

Tri it online (105 Bytes)

-3 Bytes, danke an @manassehkatz (Ändere die Stufe von strtolower und entferne AZ aus dem regulären Ausdruck)

Code, versucht, eine Schleife zu vermeiden

<?=strtr(implode(" ",str_split(preg_replace(
"/[^a-z]/",'',strtolower($argv)))),array_flip(range("`",z)));

Erläuterung

$string = preg_replace("/[^a-z]/",'',strtolower($argv))  
//the string only contains letters

$string = implode(" ",str_split($string)); 
//the string has a space after every letter

$string = strtr($string, array_flip(range("`",z)));  
//replace every letter   acording to the array

$replacementArray = array_flip(range("`",z));
//this array contains the ansi characters from "`" to the "z"
//array_flip to change the keys with the values
//final array ["`"=>0,"a"=>1, "b"=>2...."z"=>26]
Francisco Hahn
quelle
Um dies ohne Warnungen ausführen zu können, musste ich (a) $ argv in $ argv [1] ändern und (b) "um das letzte z hinzufügen". Aber mit oder ohne diese Änderungen (die möglicherweise versionabhängig sind - I. Wenn Sie 5.6 verwenden, können Sie 3 Bytes sparen, indem Sie strtolower () in einem Level verschieben strtolower($argv)und Kapital A-Zaus dem
regulären Ausdruck
Auf PHP 7 wird eine Warnung ausgegeben, ich werde die Antwort jetzt ändern. Es tut mir leid, aber ich hatte keine Zeit zu überprüfen :-D
Francisco Hahn
1
@manassehkatz Hat Ihren Vorschlag angenommen und 3 Bytes gespart, vielen Dank.
Francisco Hahn
Sollte das nicht sein $argv[1]oder $argnstatt $argv? joinist 3 Bytes kürzer als implode.
Titus
0

Python 2, 110 Bytes 104 Bytes , mit Benutzereingabe

a="abcdefghijklmnopqrstuvwxyz";print" ".join(str(a.index(l)+1)for l in list(input().lower())if l in a)

Probieren Sie es online aus!


Python 2, 105 Bytes 104 Bytes 96 Bytes , wobei tvordefiniert ist:

a="abcdefghijklmnopqrstuvwxyz";print" ".join(str(a.index(l)+1)for l in list(t.lower())if l in a)

Probieren Sie es online aus!

Lassen Sie es uns mit einer besser lesbaren Version aufschlüsseln:

alphabet = "abcdefghijklmnopqrstuvwxyz"
foo = [str(alphabet.index(letter) + 1) for letter in list(t.lower()) if letter in alphabet]
print " ".join(foo)

Zunächst definieren wir alphabetdas Alphabet.

Als nächstes verwenden wir das Listenverständnis, um:

  1. Erstellen Sie eine Liste, in der jedes Element aus Kleinbuchstaben besteht t
  2. Wenn jeder Buchstabe nicht im Alphabet enthalten ist, verwerfen Sie ihn.
  3. Wenn ja, finden Sie den Index im Alphabet.
  4. füge eins hinzu (weil wir bei 1 anfangen zu zählen)
  5. und mache daraus eine Schnur.

Schließlich fügen wir alles zusammen und drucken es aus.


Bearbeiten: Geändert in print(und verlor die Portabilität), um Bytes zu speichern und es außerhalb einer Funktion funktionieren zu lassen

Bearbeiten 2: Es wurde eine Version mit input()anstelle von vordefinierten Variablen hinzugefügt

Edit 3: 8 Bytes in Lösung 1 und 2 dank Jo King entfernt

Theo C.
quelle
Sie haben 6 fremde Leerzeichen in Ihrem Code
Jo King
@JoKing Ich habe drei gefunden (nach Semikolon, Umgebung +), wo sind die anderen?
Theo C
Vor if, forund" "
Jo König
Sie können auch die []injoin
Jo King
Nochmals herzlich willkommen bei PPCG! Zu Ihrer Information (dh wenn in der Frage nicht explizit überschrieben) können Antwortübermittlungen Funktionen oder Vollprogramme sein (wie Ihre 104-Byte-Version), aber keine Snippets (wie Ihre 96-Byte-Version). Hier könnten Sie eine Version einreichen, die eine Funktion erstellt, die die Zeichenfolge für 100 Bytes zurückgibt :)
Jonathan Allan
0

PowerShell , 63 Byte

"$(([char[]]"$args".ToUpper()|%{$_-($_,64)[$_-in65..90]})-ne0)"

Probieren Sie es online aus!

(Scheint lang ...)

Nimmt Eingaben auf $args, konvertiert sie in .ToUpperGroß- und Kleinschreibung , wandelt sie in ein charArray um und führt sie in eine for eachSchleife ein. Innerhalb der Schleife, subtrahieren wir entweder selbst oder 64 von der (ASCII int) Wert, basierend auf , ob der aktuelle Wert ist -inder Bereich 65an 90(dh es ist ein ASCII - Großbuchstaben). Diese Werte verbleiben in der Pipeline, und wir verwenden ein -not- eQual, um die Nicht-Buchstaben-Werte zu entfernen (da sie alle Null sind). Diese Zahlen sind in einer Zeichenfolge gekapselt, da die Standardzeichenfolge eines Arrays darin besteht, es durch Leerzeichen zu trennen, sodass wir das ziemlich billig bekommen. Diese Zeichenfolge verbleibt in der Pipeline und die Ausgabe ist implizit.

AdmBorkBork
quelle
0

MS-SQL, 133 Bytes

SELECT STRING_AGG(ASCII(substring(upper(s),number+1,1))-64,' ')FROM
spt_values,t WHERE type='P'AND substring(s,number+1,1)LIKE'[a-z]'

Gemäß unseren IO-Regeln erfolgt die Eingabe über eine bereits vorhandene Tabelle t mit varchar-Feldern s .

SQL 2017 oder höher ist erforderlich. Muss auch in der masterDatenbank ausgeführt werden, da ich eine Systemtabelle namens nutze spt_values, die (gefiltert nach type='P') Zählzahlen von 0 bis 2047 enthält.

Grundsätzlich verbinde ich eine Zahlentabelle mit der Eingabezeichenfolge SUBSTRING(), die für jedes einzelne Zeichen eine separate Zeile zurückgibt. Dies wird nur für Buchstaben mit gefiltert LIKE'[a-z]', dann erhalten wir ihren ASCII-Wert und subtrahieren 64. Diese Zahlen werden mit der Funktion (neu in SQL 2017) wieder zu einer Zeichenfolge zusammengefügt STRING_AGG.

BradC
quelle
0

Pyth , 10 Bytes

jdfTmhxGr0

Ich bin mir ziemlich sicher, dass dies ein bisschen Golf gespielt werden kann ... -2 Bytes, wenn ich als Liste ausgeben kann, scheinen einige Antworten zu sein, aber es ist nicht in der Spezifikation

Probieren Sie es online aus!

Dave
quelle
Sie können die letzten d( jdfTmhGr0, 10 Bytes) entfernen .
Herr Xcoder
0

C (gcc) , 67 Bytes

c;f(char*s){for(;*s;)(c=tolower(*s++)-96)>0&c<27&&printf("%d ",c);}

Probieren Sie es online aus!

Konvertiert jedes Zeichen in Kleinbuchstaben, versetzt seinen Code um -96 und druckt den Versatzcode, wenn er in den Bereich des 1-indizierten Alphabets fällt

vazt
quelle
0

jq , 45 Bytes

[gsub("\\W";"")|explode[]%32|@text]|join(" ")

 gsub("\\W";"")                                # remove non-alpha characters
               |explode[]                      # get decimal values of characters
                         %32                   # get positions in alphabet
                            |@text             # convert back to string
[                                 ]|join(" ")  # join with a space

Probieren Sie es online aus

Naïm Favier
quelle