ค้นหาตำแหน่งตัวอักษร


10

แรงบันดาลใจจากCodewars กะตะ

เป้าหมายของคุณคือใช้สตริงอินพุตเช่นอันนี้:

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

และส่งคืนสตริงที่มีตำแหน่งของอักขระแต่ละตัวในตัวอักษรคั่นด้วยช่องว่างและละเว้นอักขระที่ไม่ใช่ตัวอักษรเช่นนี้

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

สำหรับความท้าทายเพิ่มเติมคุณสามารถแทนที่ตัวอักษรตัวเลขใด ๆ ในสายเดิมด้วยตัวเอง + 27. ตัวอย่างเช่นจะกลายเป็น"25" "29, 32"นี่เป็นทางเลือกที่สมบูรณ์

คุณต้องใช้ 1 การจัดทำดัชนี ( 'a'==1, 'b'==2ฯลฯ )

กฎเพิ่มเติม:

  • คุณต้องส่งคืนสตริงไม่ใช่อาร์เรย์

  • ช่องว่างต่อท้ายคือตกลง

ผู้ชนะมีจำนวนไบต์ต่ำสุด

โชคดี!



5
@TheoC ทำไม ฉันทามติทั่วไปคือคำตอบที่ควรจะสามารถส่งออกในรูปแบบที่เหมาะสมใด ๆ เพราะมันอาจเพิ่มมากเกินไปและทำให้มันไม่เป็นธรรมกับภาษาที่สามารถเข้าร่วมโดยช่องว่างในทางที่สั้นลง
Okx

1
@TheoC ทำไมคุณไม่อนุญาตทั้งสองอย่าง
Okx

3
ยินดีต้อนรับสู่ PPCG! นี่เป็นความท้าทายที่ดีโดยรวม แต่สำหรับครั้งต่อไปที่คุณโพสต์ความท้าทายนี่คือสิ่งที่คุณควรคำนึงถึง 1) ความท้าทายนี้ค่อนข้างง่าย ฉันคิดว่ามันน่าสนใจกว่าถ้าชิ้นส่วนเสริมเป็นข้อบังคับ (หมายเหตุอย่าเปลี่ยนส่วนนั้นในตอนนี้มันสายเกินไป) 2) คุณค่อนข้างเข้มงวดกับบางส่วนโดยพลการ ทำไมไม่อนุญาตอาร์เรย์ มันเป็นมาตรฐานของเรากว่าอาร์เรย์ของตัวละครเป็นสตริง ฉันจะแนะนำการอ่านผ่านหัวข้อนี้สำหรับความคิด
James

2
หมายเหตุในอนาคต: การจัดทำดัชนี 1 และ 0 มักเป็นหนึ่งและเหมือนกันและมักจะได้รับอนุญาต นอกจากนี้ยังมีการ จำกัด รูปแบบเอาต์พุตที่ขมวดคิ้ว หากเป็นรายการค่าให้ภาษาตัดสินรูปแบบ ความท้าทายไม่ได้เกี่ยวกับการจัดรูปแบบเอาต์พุตหรือเป็นเรื่องเกี่ยวกับการเลื่อนดัชนี ดังนั้นจึงไม่ควรมีข้อ จำกัด เมื่อคุณสามารถอนุญาตให้ภาษาทำสิ่งที่พวกเขาทำอย่างเป็นธรรมชาติและมุ่งเน้นไปที่เจตนาท้าทาย
Magic Octopus Urn

คำตอบ:


5

05AB1E , (5?) 7 ไบต์

สองไบต์ขวาสุดกำลังจัดรูปแบบเอาต์พุต

áÇ32%ðý

พอร์ตของคำตอบ Jelly ของฉันแต่ O5AB1E นั้นสั้นกว่าสำหรับการกรองตัวอักษร

ลองออนไลน์!

อย่างไร?

áÇ32%ðý - take input implicitly
á       - filter keep alphabetical characters
 Ç      - to ordinals
  32    - thirty-two
    %   - modulo (vectorises)
     ð  - push a space character
      ý - join

เนื่องจาก OP ต้องการให้พิมพ์แยกตามช่องว่างจึงðýสามารถเพิ่มการต่อท้ายได้ แต่เนื่องจากครึ่งหนึ่งของรายการคำตอบที่ได้ออกมาฉันเดาว่าจะปล่อยไว้ตอนนี้
Kevin Cruijssen

อา. ฉันได้พลาดมันในคำตอบของฉัน ...
โจนาธานอัลลัน

5

Java 8, 82 78 72 69 62 ไบต์

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

-13 ไบต์ขอบคุณที่@ OlivierGrégoire

ลองออนไลน์

คำอธิบาย:

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

1
s->s.chars().forEach(c->{if(c>64&~-c%32<26)System.out.print(c%32+" ");})(72bytes)
Olivier Grégoire

1
@ OlivierGrégoireขอบคุณ! และ -3 ไบต์เพิ่มเติมโดยการเปลี่ยนเป็นแบบไตรภาคถ้า :)
Kevin Cruijssen

s->{for(int c:s)System.out.print(c>64&~-c%32<26?c%32+" ":"");}(62 ไบต์) โดยใช้char[]เป็น input Stringแทน
Olivier Grégoire

4

Python 3 , 62 60 49 ไบต์

-5 ไบต์ต้องขอบคุณโจกษัตริย์
-8 ไบต์ขอบคุณที่pLOPeGG

หลังจากการปรับปรุงเหล่านี้คำตอบนี้อยู่ในขณะนี้คล้ายกับโจนาธานอัลลัน 's คำตอบ

print(*[ord(c)%32for c in input()if c.isalpha()])

ลองออนไลน์!


โอ้ฉันเดาว่า%32ใช้ได้เหมือนกัน
โจคิง

4

R , 55 50 ไบต์

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

ลองออนไลน์!

อ่านอินพุตจาก stdin แปลงเป็นตัวพิมพ์ใหญ่ลบตัวอักษรที่ไม่ใช่ตัวอักษรตัวพิมพ์ใหญ่แปลงเป็นรหัสจุดลบถึง 64 mods 32 และพิมพ์เป็น stdout คั่นด้วยช่องว่าง

ขอบคุณ Kevin Cruijssen สำหรับสนามกอล์ฟ!



@KevinCruijssen * facepalm * duh
Giuseppe

ฉันได้เพิ่มสองความคิดเห็น (คำถาม) คำถาม - ขึ้นอยู่กับคำตอบมีโอกาสที่จะเล่นกอล์ฟนี้ลงไปที่ 46 หรือ 39 ตัวอักษร
JayCe

1
คุณสามารถทำ 47 โดยใช้[^A-z]
MickyT

4

APL (Dyalog Unicode) , 24, 20, 14 13 ไบต์

-4 ไบต์ขอบคุณZacharý (และ Mr. Xcoder)!

-6 ไบต์ขอบคุณAdám!

-1 ไบต์ขอบคุณ ngn!

A⍳⎕A∩⍨≡819⌶⊢

ลองออนไลน์!

คำอธิบาย:

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

ทางออกแรกของฉัน:

APL (Dyalog Unicode) , 24 20 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

                        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)

อย่าหัวเราะฉันฉันใหม่สำหรับ APL :)


1
นั่นเป็นเรื่องดีสำหรับคนที่เพิ่งรู้จัก APL! คุณไม่จำเป็นต้องใส่วงเล็บ นอกจากนี้ยังสามารถ{1(819⌶)⍵} 1(819⌶)⊢มิฉะนั้นงานที่น่าทึ่ง! หวังว่าคุณจะสนุกกับ APL ในอนาคต!
Zacharý

@ Zacharýขอบคุณ! ฉันหวังว่าอย่างนั้น (ฉันมีความรู้บางอย่างใน J ฉันไม่ใช่คนใหม่ในภาษาอาเรย์)
Galen Ivanov

1
ดังที่ Zachary ตั้งข้อสังเกต, วงเล็บจะถูกสมมติขึ้น , ดังนั้นคุณไม่จำเป็นต้องรวมมันไว้ในจำนวนไบต์, ส่งผลให้ 20 ไบต์
นาย Xcoder

1
@Jonah ฉันได้เพิ่มคำอธิบาย คุณพูดถูกแล้วตัวพิมพ์ใหญ่และตัวอักษรมีราคาแพงกว่ามากใน J.
Galen Ivanov

1
งานที่ดี! คุณสามารถบันทึกไบต์โดยการเขียน1ถึง819⌶และบันทึกห้าโดยการลบ 27s โดยตรง: 27~⍨⎕A⍳819⌶⍨∘1; หรือใช้จุดตัดร่วมกับตัวอักษร:⎕A⍳⎕A∩⍨819⌶⍨∘1
Adám

3

Python 2 (45?) 55 ไบต์

เพิ่ม 11 ไบต์เพื่อจัดรูปแบบเอาท์พุทซึ่งทำให้สิ่งนี้เข้ากันไม่ได้กับ Python 3)

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

อีกคำตอบ Jelly ของฉัน

ลองออนไลน์!


เวอร์ชันที่ไม่ได้จัดรูปแบบ (ส่งคืนรายการจำนวนเต็ม):

lambda s:[ord(c)%32for c in s if c.isalpha()]

1
ดูเหมือนว่า OP จะยืนยันในเอาต์พุตสตริงที่คั่นด้วยช่องว่างโชคไม่ดี
Sok

1
ใช่ - ฉันพลาดทุกคำตอบของฉัน - กลายเป็นความคุ้นเคยกับบรรทัดฐานของเว็บไซต์!
Jonathan Allan

3

JavaScript (Node.js) , 69 55 54 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

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 ไบต์ด้วย @Kevin

อีก 1 ไบต์ขอบคุณ @Neil


คุณสามารถเพิ่มการสนับสนุนสำหรับตัวเลขสำหรับไบต์เพิ่มเติมบางส่วน (ขอบคุณ @neil)

JavaScript (Node.js) , 62 ไบต์

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

ลองออนไลน์!


-11 ไบต์โดยการเปลี่ยนa-zไปA-Za-zและi.toLowerCase().charCodeAt()-96ไปi.charCodeAt()%32
เควิน Cruijssen

1
parseInt(i,36)-9บันทึกไบต์อื่น
Neil

.match(/[^_\W]/g).map(i=>(parseInt(i,36)+26)%36+1)ให้คุณรองรับหมายเลขไม่แน่ใจว่าเป็นวิธีที่ดีที่สุดหรือไม่
Neil

2

เยลลี่ , (7?) 8 ไบต์

ไบต์ขวาสุดคือการจัดรูปแบบผลลัพธ์

fØẠO%32K

โปรแกรมแบบเต็มที่ยอมรับสตริงในรูปแบบ Python ซึ่งพิมพ์ผลลัพธ์ไปที่ STDOUT

ลองออนไลน์!

อย่างไร?

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


2

x86 opcode 35 ไบต์

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

สมมติว่าผลลัพธ์มีตัวอักษรอย่างน้อยหนึ่งตัวและไม่ใช่ {|}~

40 ไบต์อนุญาตให้ใช้ตัวอักษร ASCII ทั้งหมด

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                           

"x86 opcode" คืออะไร? นี่เป็นเพียงการส่งรหัสเครื่อง x86 หรือไม่
Jakob

@ Jakob จริง ฉันที่นี่ไม่พูดว่า ".COM" เพราะมันเป็นฟังก์ชั่นและไม่พึ่งพารูปแบบ ".COM"
l4m2

อืมมม ใช่ฉันคิดว่ามันเป็นไปได้ว่าการแก้ปัญหาของรหัสเครื่องไม่จำเป็นต้องใช้โปรแกรมที่สมบูรณ์ จริง ๆ แล้วอาจจะดีกว่าที่จะระบุว่า "รหัสเครื่อง x86"
Jakob

2

Stax , 9 10 9 ไบต์

üpÉÿ%}},√

เรียกใช้และแก้ไขข้อบกพร่อง

-1 ไบต์ขอบคุณ @recursive

คำอธิบาย:

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 ไบต์

É▌Xl»↔"

เรียกใช้และแก้ไขข้อบกพร่อง

อันนี้เอาท์พุทคั่นบรรทัดใหม่ vmVaI^|cแตก: คล้ายกัน แต่กับแผนที่ซึ่งแสดงผลลัพธ์โดยนัยด้วยการขึ้นบรรทัดใหม่


ฮึ่ม ดูเหมือนจะมีโปรแกรมการบรรจุปัญหาที่สิ้นสุดในพื้นที่
เรียกซ้ำ

@ recursive โอ้ไม่ได้สังเกตว่า (ปกติฉันจะลองลิงค์ แต่ดูเหมือนว่าฉันลืมมันที่นี่) ฉันเพิ่มวิธีแก้ปัญหา
สูญเปล่า

ฉันไม่เคยสังเกตเห็นข้อผิดพลาดนี้เช่นกัน ฉันจะแก้ไขใน Stax รุ่นถัดไป โปรแกรมที่บรรจุอยู่แล้วจะยังคงไม่เปลี่ยนแปลง
เรียกซ้ำ

นี่คือ 9 กลับสำหรับปัญหาของคุณ
เรียกซ้ำ

2

ช่องว่าง , 152 117 ไบต์

-35 ไบต์ขอบคุณที่@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]

เพิ่มตัวอักษรS(ช่องว่าง), T(แท็บ) และN(บรรทัดใหม่) เป็นการเน้นเท่านั้น
[..._some_action]เพิ่มเป็นคำอธิบายเท่านั้น

ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)

คำอธิบายในรหัสเทียม:

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

1
ผมไม่ได้มีเวลาที่จะเขียนไว้ในช่องว่าง แต่บางทีคุณอาจจะเขียนอะไรบางอย่างเช่นนี้
ลินน์

1
ดูเหมือนว่า117 ไบต์ ! (* ผมเปลี่ยน 64-63 ในรหัสเป็นมันเทียบเท่า แต่สั้นเพื่อเป็นตัวแทนในช่องว่าง) :)
ลินน์

@Lynn ไม่เลวเลย -35 ไบต์อยู่ตรงนั้น ขอบคุณ :)
Kevin Cruijssen

1

05AB1E , 8 ไบต์

láÇ96-ðý

ลองออนไลน์!

หรือถ้าเราสามารถส่งคืนอาร์เรย์:

05AB1E , 6 ไบต์

láÇ96-

คำอธิบาย:

l         Lowercase
 á        Only letters
  Ç       Codepoints
   96-    Subtract 96.

ลองออนไลน์!

หรือหากคุณต้องการให้นับจำนวน:

05AB1E , 13 ไบต์

lAžh«DŠÃSk>ðý

ลองออนไลน์!



1

ถ่าน 21 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔⁺β⭆χιβ

ผนวกตัวเลขเข้ากับตัวแปรตัวอักษรตัวพิมพ์เล็กที่กำหนดไว้ล่วงหน้า

F↧S

วนซ้ำผ่านอินพุตที่ลดลง

¿№βι«

หากอักขระปัจจุบันเป็นตัวอักษรหรือตัวเลข

I⊕⌕βι

พิมพ์ดัชนี 1 ดัชนี

และเว้นช่องว่างสำหรับค่าถัดไป


1

สีแดง 93 ไบต์

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

ลองออนไลน์!


ฉันไม่รู้เกี่ยวกับ Red มากพอ แต่สามารถ#"a"-#"z"เปลี่ยนเป็นอักษรตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ได้ แล้วlowercaseสามารถลบ; และ-96 + to-char cสามารถโมดูโล -32? ไม่แน่ใจว่าจะบันทึกไบต์เป็นสีแดงได้หรือไม่
Kevin Cruijssen

@ Kevin Cruijssen ขอบคุณฉันจะลองใหม่ภายหลัง
Galen Ivanov

@KevinCruijssen ฟังก์ชั่นเก็บรวบรวมสตริงแม้ในขณะที่การแข่งขันเป็นตัวละครเดียวที่ว่าทำไมฉันมักจะต้องparse to-charสำหรับตัวอักษรพิมพ์ใหญ่ที่ฉันจะต้องเพิ่ม charset # "A" - # "Z" ซึ่ง spoils กำไร (ถ้ามี) lowercaseจากการกำจัด
กาเลนอีวานอฟ

ใช่ฉันกลัว#"A"-#"Z"อาจจะไม่ได้รับมากเมื่อเทียบกับlowercaseเพราะมันสั้นเพียง 1 ไบต์ และฉันรู้ว่าคุณต้องการto-charแต่ก็ไม่แน่ใจว่า-96 + และ modulo-32 จะมีขนาดใกล้เคียงกันหรือไม่
Kevin Cruijssen

1

Perl 5 , 47 ไบต์

ด้วยความท้าทายเพิ่มเติมของการแยกตัวเลข:

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

ลองออนไลน์!

ลดลงถึง 38 ไบต์โดยไม่สนใจตัวเลข

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

1

PHP , 70 ไบต์

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

ลองออนไลน์!

-5 ไบต์ขอบคุณเควิน


ตัวอย่างไม่ได้รับอนุญาตให้ส่งที่นี่ แต่คุณสามารถทำให้มันเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
Nissa

ขออภัยตอนนี้มันใช้อาร์กิวเมนต์แรกเป็นอินพุต
user2803033

สวัสดียินดีต้อนรับสู่ PPCG! หากคุณยังไม่ได้อ่านเคล็ดลับสำหรับการเล่นกอล์ฟใน PHPและเคล็ดลับสำหรับการเล่นกอล์ฟใน <ทุกภาษา>อาจน่าสนใจในการอ่าน สำหรับชิ้นส่วนที่คุณสามารถเล่นกอล์ฟ: &&เป็นได้&และord(strtolower($c))-96สามารถเป็นord($c)%32ได้ นอกจากนี้ฉันคิดว่าคุณสามารถลบออก~ก่อนหน้า$cนี้ แต่ฉันไม่แน่ใจ ยังไม่ได้โปรแกรมมากใน PHP และไม่รู้จริงๆว่า~มันใช้สำหรับอะไรที่นี่
Kevin Cruijssen

ขอบคุณสำหรับข้อมูลของคุณ Mod 32 เป็นความคิดที่ดี มันช่วยประหยัดบางไบต์ แต่ต้องมีการตรวจสอบเพิ่มเติมเพื่อให้แน่ใจว่า ord ($ c) มีขนาดใหญ่กว่า 64
user2803033

1

Perl 5 -p , 35 ไบต์

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

ลองออนไลน์!

รวมส่วนเพิ่มเติมเกี่ยวกับตัวเลข


1
/\w/รวม_
Brad Gilbert b2gills

เล็กกว่าสิ่งที่ฉันเล่นด้วย! คุณสามารถบันทึกหนึ่งไบต์และแก้ไขข้อบกพร่อง @ BradGilbertb2gills ที่กล่าวถึงโดยใช้-F/[^0-9\pL]|/: ลองออนไลน์!
Dom Hastings


1

Perl 6 , 32 ไบต์ (อัลฟา), 41 ไบต์ (อัลฟา + หลัก)

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

ลองใช้ (32 ไบต์อัลฟา)

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

ลองใช้ (41 ไบต์ตัวอักษร + ตัวเลข)

ขยาย:

32 ไบต์อัลฟา

{  # 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 + อัลฟาหลัก

{  # 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
  )
}

สิ่งนี้ตรงกับตัวละครที่ไม่ใช่ ASCII เช่นЭกัน แต่ฉันขอคำชี้แจงจาก OP ว่าการป้อนข้อมูลเป็น ASCII เท่านั้นหรือไม่
Jo King


1

PHP 108 105 ไบต์

ลองออนไลน์ (108 ไบต์)

ทดลองใช้งานออนไลน์ (105 ไบต์)

-3 ไบต์ขอบคุณ @manassehkatz (เปลี่ยนระดับของ strtolower และลบ AZ ออกจาก regex)

รหัสพยายามหลีกเลี่ยงการวนซ้ำใด ๆ

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

คำอธิบาย

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

เพื่อให้สิ่งนี้ทำงานโดยไม่มีคำเตือนฉันต้อง (a) เปลี่ยน $ argv เป็น $ argv [1] และ (b) เพิ่ม "รอบ z ล่าสุด แต่มีหรือไม่มีการเปลี่ยนแปลงเหล่านั้น (ซึ่งอาจขึ้นอยู่กับรุ่น - ฉัน กำลังใช้ 5.6) คุณสามารถบันทึก 3 ไบต์โดยการย้าย strtolower () ในระดับstrtolower($argv)และลบทุนA-Zจาก regex
manassehkatz-Moving 2 Codidact

ใน php 7 มัน trows คำเตือนฉันจะแก้ไขคำตอบทันที ฉันขอโทษที่ไม่มีใครมีเวลาตรวจสอบ :-D
Francisco Hahn

1
@manassehkatz ทำตามคำแนะนำของคุณและบันทึกไว้ 3 ไบต์ขอบคุณมาก
Francisco Hahn

ไม่ควรจะเป็น$argv[1]หรือ$argnแทน$argv? joinคือ 3 implodeไบต์สั้นกว่า
ติตัส


0

Python 2, 110 ไบต์ 104 ไบต์พร้อมอินพุตผู้ใช้

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

ลองออนไลน์!


Python 2, 105 ไบต์ 104 ไบต์ 96 ไบต์โดยที่tกำหนดไว้ล่วงหน้า:

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

ลองออนไลน์!

มาทำลายมันด้วยเวอร์ชันที่อ่านง่ายขึ้น:

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

อันดับแรกเรานิยามalphabetว่าเป็นตัวอักษรเอาละ

ต่อไปเราใช้ list comprehension เพื่อ:

  1. ทำรายการที่แต่ละรายการเป็นอักขระตัวพิมพ์เล็ก t
  2. สำหรับตัวอักษรแต่ละตัวถ้ามันไม่ได้อยู่ในตัวอักษรละทิ้งมัน
  3. ถ้าเป็นเช่นนั้นค้นหาดัชนีในตัวอักษร
  4. เพิ่มหนึ่งลงไป (เพราะเราเริ่มนับที่ 1)
  5. และทำให้มันเป็นสตริง

ในที่สุดเราเข้าร่วมทั้งหมดเข้าด้วยกันและพิมพ์


แก้ไข:เปลี่ยนเป็นprint(และสูญเสียการพกพา) เพื่อบันทึกไบต์และทำให้มันทำงานนอกฟังก์ชั่น

แก้ไข 2:เพิ่มรุ่นด้วยinput()แทนที่จะเป็นตัวแปรที่กำหนดไว้ล่วงหน้า

แก้ไข 3:ลบ 8 ไบต์ในโซลูชัน 1 และ 2 ขอบคุณJo King


คุณมี 6 ช่องว่างที่ไม่เกี่ยวข้องในโค้ดของคุณ
โจคิง

@ โจกิ้งฉันพบสาม (หลังจากอัฒภาคโดยรอบ+) คนอื่น ๆ อยู่ที่ไหน?
Theo C

ก่อนif, forและ" "
โจกษัตริย์

นอกจากนี้คุณยังสามารถลบ[]ในjoin
โจคิง

ยินดีต้อนรับสู่ PPCG อีกครั้ง! โดยค่าเริ่มต้น FYI (เช่นถ้าไม่เขียนทับอย่างชัดเจนในคำถาม) คำตอบที่ส่งอาจเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ (เช่นรุ่น 104 ไบต์ของคุณ) แต่ไม่ใช่ตัวอย่าง (เช่นรุ่น 96 ไบต์) ที่นี่คุณสามารถส่งรุ่นที่สร้างฟังก์ชั่นซึ่งจะคืนค่าสตริง 100 ไบต์ :)
Jonathan Jonathan Allan

0

PowerShell , 63 ไบต์

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

ลองออนไลน์!

(ดูเหมือนยาว ... )

รับอินพุต$argsแปลง.ToUpperเคสเป็นcharคาสต์เป็น-array ฟีดนั้นเป็นfor eachลูป ภายในลูปเราจะลบค่าตัวเองหรือ 64 จากค่า (ASCII int) โดยพิจารณาว่าค่าปัจจุบันนั้นเป็น-inช่วง65ที่90(หรือว่ามันคือตัวอักษรตัวใหญ่ ASCII) ค่าเหล่านั้นจะถูกทิ้งไว้ที่ไพพ์ไลน์และเราใช้-not equal เพื่อกำจัดค่าที่ไม่ใช่ตัวอักษร (เพราะมันเป็นศูนย์ทั้งหมด) ตัวเลขเหล่านั้นถูกห่อหุ้มในสายอักขระเนื่องจากการเรียงสตริงเริ่มต้นของอาเรย์คือการเว้นวรรคดังนั้นเราจึงได้ค่าที่ค่อนข้างถูก สตริงนั้นจะถูกทิ้งไว้บนไปป์ไลน์และเอาท์พุทนั้นเป็นนัย


0

MS-SQL, 133 ไบต์

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

ต่อ IO ของเรากฎการป้อนข้อมูลจะได้รับการผ่านตารางที่มีอยู่ก่อนทีมีเขต varchar s

จำเป็นต้องใช้ SQL 2017 หรือใหม่กว่า ต้องทำงานในmasterฐานข้อมูลเพราะฉันใช้ประโยชน์จากตารางระบบที่เรียกว่าspt_valuesซึ่ง (เมื่อกรองตามtype='P') มีจำนวนการนับจาก 0 ถึง 2047

โดยพื้นฐานแล้วฉันกำลังเข้าร่วมตารางตัวเลขโดยใช้สตริงอินพุตSUBSTRING()ซึ่งส่งคืนแถวแยกสำหรับอักขระแต่ละตัว นี้จะถูกกรองสำหรับตัวอักษรเพียงแค่ใช้LIKE'[a-z]'แล้วเราจะได้รับค่า ASCII ของพวกเขาและลบ 64 ตัวเลขเหล่านี้จะเข้าร่วมกลับเป็นสตริงใช้ (ใหม่กับ SQL 2017) STRING_AGGฟังก์ชั่น


0

Pyth , 10 ไบต์

jdfTmhxGr0

ฉันค่อนข้างมั่นใจว่านี่สามารถเล่นกอล์ฟได้เล็กน้อย ... -2 ไบต์ถ้าฉันสามารถส่งออกเป็นรายการคำตอบบางอย่างดูเหมือนจะ แต่ไม่ได้อยู่ในสเป็ค

ลองออนไลน์!


คุณสามารถลบครั้งสุดท้ายd( jdfTmhGr0, 10 ไบต์)
Mr. Xcoder

0

C (gcc) , 67 ไบต์

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

ลองออนไลน์!

แปลงอักขระแต่ละตัวเป็นตัวพิมพ์เล็กชดเชยโค้ดโดย -96 และหากอยู่ในช่วงของตัวอักษรที่มีดัชนี 1 ตัวให้พิมพ์รหัสออฟเซ็ต


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.