ทำฝนตัวอักษร


54

ฝนตัวอักษร

งาน:

ขั้นพื้นฐานคือการพิมพ์จากสายป้อนแล้วทำซ้ำตัวละครแต่ละตัวในแนวตั้งอยู่บนพื้นฐานของมัน (0-จัดทำดัชนี) ตำแหน่งใน (กรณีตาย) A-Zตัวอักษร Aอยู่ที่ตำแหน่ง 0 ดังนั้นจะไม่ถูกทำซ้ำeคือที่ตำแหน่ง 4 ดังนั้นจะทำซ้ำ 4 ครั้งPคือที่ตำแหน่ง 15 ดังนั้นจะทำซ้ำ 15 ครั้ง!ไม่ได้อยู่ในA-Zนั้นจะถูกทำซ้ำ 0 ครั้งเป็นต้น

เพื่อความชัดเจนสิ่งใดก็ตามที่อยู่นอกช่วงB-Zb-zเช่นตัวเลขหรืออักขระพิเศษจะไม่ถูกทำซ้ำและจะปรากฏในบรรทัดแรกเท่านั้น

นี่คือดังนั้นทางออกที่สั้นที่สุดในแต่ละภาษาจึงเป็นผู้ชนะ

การป้อนข้อมูล:

  • การป้อนข้อมูลจะอยู่ในมาตรฐานที่พิมพ์ชุดอักขระ ASCII จาก 32 ถึง ~126
  • สตริงอินพุตจะมีความยาว 1 อักขระหรือนานกว่านั้น
  • จะไม่มีช่องว่างนำหน้าหรือต่อท้าย
  • คุณสามารถรับข้อมูลเป็นสตริง ( "hello") หรือรายการอักขระ ( ["h", "e", "l", "l", "o"])

ตัวอย่าง:

ใส่ของaaaaให้:

aaaa

ใส่ของabcdaให้:

abcda
 bcd
  cd
   d

การป้อนข้อมูลของProgramming Puzzles & Code Golf!ให้:

Programming Puzzles & Code Golf!
Progr mming Puzzles   Code Golf
Progr mming Puzzles   Code Golf
Progr mming Puzzles    ode Golf
Progr mming Puzzles    o e Golf
Progr mming Puzzl s    o   Golf
Progr mming Puzzl s    o   Gol
Pro r mmin  Puzzl s    o    ol
Pro r mmin  Puzzl s    o    ol
Pro r mm n  Puzzl s    o    ol
Pro r mm n  Puzzl s    o    ol
Pro r mm n  Puzzl s    o    ol
Pro r mm n  Puzz  s    o    o
Pro r    n  Puzz  s    o    o
Pro r       Puzz  s    o    o
Pr  r       Puzz  s
 r  r        uzz  s
 r  r        uzz  s
             uzz  s
             uzz
             uzz
              zz
              zz
              zz
              zz
              zz

การป้อนข้อมูลของ~|[abc<0>cba]|~ให้:

~|[abc<0>cba]|~
    bc   cb
     c   c

หมายเหตุ:

  • ช่องโหว่มาตรฐานใช้
  • เอาต์พุตสามารถเป็นรายการสตริงได้ แต่:
  • ไม่อนุญาตให้ขึ้นบรรทัดใหม่ที่ต่อท้าย (บรรทัดเดียว\nบนบรรทัดสุดท้ายเป็นที่ยอมรับได้)
  • เอาต์พุตสามารถเป็นรายการของอักขระได้ตราบใดที่มันดูเหมือนว่ามีฝนตก
  • ไม่มีการขึ้นบรรทัดใหม่ชั้นนำ
  • สำหรับผู้ใช้นอร์ดิกของเราที่มีตัวอักษรพิเศษสองสามตัวในตัวอักษร "AZ" ของพวกเขารู้สึกฟรีเพื่อสนับสนุนพวกเขา แต่มันไม่ได้เป็นส่วนหนึ่งของความท้าทาย

2
เป็นผู้นำ \nที่ยอมรับได้หรือไม่
Lynn

@ ลินน์, ไม่มีการขึ้นบรรทัดใหม่, บรรทัดแรกควรเป็นอินพุตสตริง / รายชื่อตัวละคร - ฉันจะอัพเดทกระทู้!
streetster

18
FWIW ฉันคิดว่าพวกเขาดูเหมือนหยาดกว่าฝน
caird coinheringaahing

@cairdcoinheringaahing ฟังดูเกือบจะรื่นเริง
Pureferret

คำตอบ:


22

รหัสเครื่อง 6502 (C64), 113 ไบต์

00 C0 20 FD AE 20 9E AD 85 FB 20 A3 B6 A0 00 84 FC B1 22 99 6F C1 C9 41 90 14 
C9 5B B0 04 E9 40 B0 0E C9 C1 90 08 C9 DB B0 04 E9 C0 B0 02 A9 00 99 6F C0 C5 
FC 30 02 85 FC C8 C4 FB D0 D3 A9 00 99 6F C1 A0 C1 A9 6F 20 1E AB A9 0D 20 D2 
FF A6 FC D0 01 60 C6 FC A0 00 B9 6F C1 F0 E6 BE 6F C0 D0 07 A9 20 99 6F C1 D0 
05 CA 8A 99 6F C0 C8 D0 E7

ภาพหน้าจอ

การสาธิตออนไลน์

การใช้งาน: เช่นsys49152,"[string]"sys49152,"Programming Puzzles & Code Golf!"

สำคัญ:หากโปรแกรมโหลดจากดิสก์ (เช่นในการสาธิตออนไลน์) ให้ออกnewคำสั่งก่อน! สิ่งนี้จำเป็นเนื่องจากการโหลดโปรแกรมเครื่องจะทำให้พอยน์เตอร์ C64 พื้นฐานบางส่วนเสียหาย

หมายเหตุ:ศตวรรษที่ 64 เป็นค่าเริ่มต้นในโหมดโดยไม่ต้องตัวอักษรตัวพิมพ์เล็ก - เพื่อสามารถที่จะใส่สตริงกรณีผสมสลับไปโหมดพิมพ์เล็กเป็นครั้งแรกโดยการกด+SHIFTCBM


คำอธิบาย

นี่คือรายการถอดแยกชิ้นส่วนที่แสดงความคิดเห็น:

         00 C0       .WORD $C000        ; load address
.C:c000  20 FD AE    JSR $AEFD          ; consume comma
.C:c003  20 9E AD    JSR $AD9E          ; evaluate expression
.C:c006  85 FB       STA $FB            ; store string length
.C:c008  20 A3 B6    JSR $B6A3          ; free string
.C:c00b  A0 00       LDY #$00           ; initialize counter
.C:c00d  84 FC       STY $FC            ; and number of "extra" lines
.C:c00f   .copyloop:                    
.C:c00f  B1 22       LDA ($22),Y        ; load next character
.C:c011  99 6F C1    STA .outbuf,Y      ; store to buffer
.C:c014  C9 41       CMP #$41           ; compare with 'a'
.C:c016  90 14       BCC .zerocount     ; smaller -> no repetition
.C:c018  C9 5B       CMP #$5B           ; compare with 'z'
.C:c01a  B0 04       BCS .checkupper    ; larger -> check for uppercase
.C:c01c  E9 40       SBC #$40           ; subtract 'a' ('a' - 1 and carry)
.C:c01e  B0 0E       BCS .cl_storecount ; and jump to store in repeat count
.C:c020   .checkupper:                  
.C:c020  C9 C1       CMP #$C1           ; compare with 'A'
.C:c022  90 08       BCC .zerocount     ; smaller -> no repetition
.C:c024  C9 DB       CMP #$DB           ; compare with 'Z'
.C:c026  B0 04       BCS .zerocount     ; larger -> no repetition
.C:c028  E9 C0       SBC #$C0           ; subtract 'A' ('A' - 1 and carry)
.C:c02a  B0 02       BCS .cl_storecount ; and jump to store in repeat count
.C:c02c   .zerocount:                   
.C:c02c  A9 00       LDA #$00           ; store 0 ...
.C:c02e   .cl_storecount:               
.C:c02e  99 6F C0    STA .repcount,Y    ; ... in repeat count
.C:c031  C5 FC       CMP $FC            ; compare with number of extra lines
.C:c033  30 02       BMI .cl_next       ; smaller -> go on with loop
.C:c035  85 FC       STA $FC            ; repeat count to number of extra lines
.C:c037   .cl_next:                     
.C:c037  C8          INY                ; next
.C:c038  C4 FB       CPY $FB            ; compare with string length
.C:c03a  D0 D3       BNE .copyloop      ; not yet reached? -> repeat
.C:c03c  A9 00       LDA #$00           ; terminate string in buffer
.C:c03e  99 6F C1    STA .outbuf,Y      ; with 0 byte
.C:c041   .outloop:                     
.C:c041  A0 C1       LDY #>.outbuf      ; output ...
.C:c043  A9 6F       LDA #<.outbuf      ; ...
.C:c045  20 1E AB    JSR $AB1E          ; ... string
.C:c048  A9 0D       LDA #$0D           ; and output ...
.C:c04a  20 D2 FF    JSR $FFD2          ; ... newline
.C:c04d  A6 FC       LDX $FC            ; load extra line count
.C:c04f  D0 01       BNE .ol_step       ; not zero -> go on
.C:c051  60          RTS                ; WE ARE DONE HERE ;)
.C:c052   .ol_step:                     
.C:c052  C6 FC       DEC $FC            ; decrease extra line count
.C:c054  A0 00       LDY #$00           ; initialize counter
.C:c056   .eraseloop:                   
.C:c056  B9 6F C1    LDA .outbuf,Y      ; load next character from buffer
.C:c059  F0 E6       BEQ .outloop       ; 0 byte? -> end of string, output
.C:c05b  BE 6F C0    LDX .repcount,Y    ; load repeat count for this characer
.C:c05e  D0 07       BNE .el_step       ; not 0 yet? -> jump to decrement
.C:c060  A9 20       LDA #$20           ; load code for space
.C:c062  99 6F C1    STA .outbuf,Y      ; store in current string position
.C:c065  D0 05       BNE .el_next       ; and jump to next loop iteration
.C:c067   .el_step:                     
.C:c067  CA          DEX                ; decrease repeat count ...
.C:c068  8A          TXA                ; ... and ...
.C:c069  99 6F C0    STA .repcount,Y    ; ... store back
.C:c06c   .el_next:                     
.C:c06c  C8          INY                ; increase counter ...
.C:c06d  D0 E7       BNE .eraseloop     ; and jump back to loop

.C:c06f   .repcount:
.C:c06f              .RES $100          ; 256 bytes for repeat count
.C:c16f   .outbuf:
.C:c16f              .RES $100          ; 256 bytes as buffer for output

3
รหัสเครื่อง c64 ฉันประทับใจ.
Dschoni

@Dschoni ขอบคุณ แต่มันก็ยังเป็นรหัสง่าย ๆ (และมันสนุกสำหรับฉัน!) - คุณควรจะดูฉากตัวอย่างสำหรับงาน C64 ที่น่าประทับใจจริงๆ)
Felix Palmen

หากเราจะได้รับสิ่งเหล่านี้ต่อไปเราอาจต้องการตั้งค่าลิงก์ไปยังตัวจำลอง JavaScript C64 เพื่อให้ผู้คนสามารถเห็นพวกเขาทำงานได้
trlkly

1
@trlkly ฉันมีลิงก์ดังกล่าวในการส่งของฉันคลิกที่ "Online demo";)
Felix Palmen

14

05AB1E , 13 12 ไบต์

,εDlAsk×}ζ»,

ลองออนไลน์!

คำอธิบาย

,             # print input
 ε      }     # apply to each char in input
  D           # duplicate
   l          # convert to lower case
    Ask       # get index of current char in the lower case alphabet
       ×      # repeat the char that many times
         ζ    # transpose with space as filler
          »,  # join on newlines and print

32
ต้องการที่จะได้รับดัชนีของถ่านในตัวอักษรตัวพิมพ์เล็ก? เพียงAskเพื่อมัน
Uriel

8

Pyth, 12 10 9 ไบต์

.tm+*xGr0

ชุดทดสอบ

คำอธิบาย:

.tm+*xGr0dddQ   Expanded program with autofilled input variable
  m      dddQ    For each character d in the input:
       r0d     get its lowercase variant
     xG        and return its 0-based index in the alphabet 
                   (-1 if not found, for special chars)
                (empty string for A/a and special characters)
    *     d    that many of the corresponding character
   +       d   and one more for good measure (because x is 0-indexed)
.t             Transpose it and fill blanks with spaces

12 ไบต์:

j.t*VmxGr0d

(พร้อมการขึ้นบรรทัดใหม่)

ชุดทดสอบ

คำอธิบาย:

j.t*VmxGr0d
QQ              Expanded program with autofilled input variable
Q               print the input verbatim
     m    dQ    For each character d in the input:
        r0      get its lowercase variant
      xG        and return its 0-based index in the alphabet 
                    (-1 if not found, for special chars)
   *V       Q   multiply the corresponding characters in (the second autofilled input)
                 by their alphabet indices we just calculated
                 (empty string for A/a and special characters)
 .t             Transpose it and fill blanks with spaces
j               Join the result on newlines

เอาท์พุทสามารถเป็นรายการของรายการของตัวละครตราบใดที่ดูเหมือนว่ามันเป็นตัวอักษรฝนตก - ดังนั้นคุณไม่จำเป็นต้องj
นาย Xcoder

อ่าคุณพูดถูก! ฉันรักษามันไว้เพราะเวอร์ชั่น 12 ไบต์กำลังพิมพ์คำต่อคำหนึ่งบรรทัดและฉันไม่สามารถผสมรูปแบบเช่นนั้นได้และฉันลืมไปเลยว่าฉันสามารถลบได้ตอนนี้ทุกอย่างอยู่ในทรานสโพส ขอบคุณ!
Steven H.

8

Python 3 , 83 ไบต์

f=lambda s,k=65:[*{*s}-{' '}]and[s]+f([[' ',c][91>ord(c.upper())>k]for c in s],k+1)

ลองออนไลน์! ใช้รายการของตัวละคร ส่งคืนรายการของตัวละคร

Python 2 , 90 ไบต์

f=lambda s,k=65:s.strip()and s+'\n'+f(''.join([' ',c][91>ord(c.upper())>k]for c in s),k+1)

ลองออนไลน์! รับสาย ส่งคืนสตริง


7

Mathematica, 115 89 ไบต์

มันต้องใช้เวลาเป็นรายการของตัวอักษรและผลรายชื่อของรายการของตัวอักษรinput [{"a", "b", "c", "d", "a"}]

Thread[PadRight[Table[#,Max@Position[Alphabet[]/."a"->#,#|ToLowerCase@#]]&/@#]/. 0->" "]&

ลองออนไลน์!

-26 bytes จาก Misha Lavrov

-5 ไบต์จาก user202729

แต่ถ้าคุณต้องการที่จะเห็นผลลัพธ์เช่นเดียวกับในกรณีทดสอบให้ลองใช้โค้ด (128 ไบต์)
ลองออนไลน์!


สำหรับผู้อ่านในอนาคต: ส่วน "คำตอบนี้ใช้ได้กับ Mathematica ... " เป็นเพียงการทำให้เข้าใจผิดเล็กน้อยปัญหาคือ Mathematica รองรับเฉพาะอักขระ Unicode ในโหมด notebook (REPL) ในโหมดสคริปต์จะเข้าใจเฉพาะ ASCII และอักขระพิเศษที่ถูกแปลงเป็น ASCII (เช่น(3 ไบต์) -> \[Infinity](11 ไบต์))
user202729

@ user202729 ตกลงฉันจะแก้ไขและให้ผู้คนอ่านความคิดเห็นของคุณ
ขอบคุณ

คำแนะนำกอล์ฟสำหรับ Mathematica (โหมดสคริปต์): \[Infinity](11 ไบต์) สามารถแทนที่ด้วยInfinity(8 ไบต์) หรือ\:221e(6 ไบต์) ตัวสุดท้ายคือการแทนค่าเริ่มต้นของอักขระพิเศษที่ไม่มีชื่อ (แม้ว่าจะไม่ใช่ส่วนหลัก)
user202729

เราสามารถหลีกเลี่ยงได้Infinityทั้งหมด ส่วนที่มีปัญหาคือเราสามารถเปลี่ยนเป็นIf[(d=Min@Position[Alphabet[],If[UpperCaseQ@#,ToLowerCase@#,#]])==∞,1,d] Max@Position[Alphabet[]/."a"->#,#|ToLowerCase@#](การค้นหาในรายการ{#,b,c,d,...,y,z}เรารับประกันว่าจะหา#อย่างน้อยหนึ่งครั้ง)
Misha Lavrov

@MishaLavrov ดีมาก ซ่อมมัน!
J42161217

6

Dyalog APL , 27 22 ไบต์

บันทึก 5 ไบต์ด้วย @ Adám

⍉∘↑⊢⍴¨⍨127|⎕A819⌶⍨∘1

ลองออนไลน์!

อย่างไร?

⍴¨⍨ - กำหนดถ่านแต่ละอันให้มีความยาว

    1⌈ - อย่างน้อยหนึ่งหรือ

    ⎕A⍳819⌶⍨∘1 - ดัชนีของอักขระตัวพิมพ์ใหญ่เป็นตัวอักษร

        27| - modulo 27

- แบนเป็นเมทริกซ์

- และขนย้าย



@ Adámขอบคุณ! อัปเดต
Uriel



5

Python 2 , 111 106 99 98 97 87 93 ไบต์

s=input()
i=65
while s.strip():print s;s=''.join([' ',c][91>ord(c.upper())>i]for c in s);i+=1

ลองออนไลน์!


whileสามารถแทนที่ด้วยexecเพื่อบันทึกไม่กี่ไบต์iสามารถเริ่มต้นด้วย 65 เพื่อบันทึกมากกว่าหนึ่งถึง 87 ไบต์
Rod

สหกรณ์กล่าวว่าการขึ้นบรรทัดใหม่ภายนอกต่อท้ายไม่ได้รับอนุญาตแต่พิมพ์รหัสของคุณหลายของพวกเขาเมื่อป้อนข้อมูลที่ไม่ได้มีหรือz Z
Lynn

@Lynn คงที่ฉันลืมที่จะตรวจสอบexecเปลี่ยนแปลง ...
TFeld

5

C # (. NET Core) 162 ไบต์

s=>{string A="abcdefghijklmnopqrstuvwxyz",r=s;for(int i=-1;++i<s.Max(A.IndexOf);)r+='\n'+string.Concat(s.Select(c=>A.IndexOf(char.ToLower(c))>i?c:' '));return r;}

ลองออนไลน์!


2
ยินดีต้อนรับสู่ PPCG และคำตอบแรกที่ดี คุณสามารถย่อรหัสของคุณให้สั้นลงได้โดยใช้ลูกเล่นเล็กน้อย นี่คือเวอร์ชันของกอล์ฟที่มากขึ้นของรหัสของคุณ: ลองออนไลน์! .
Ian H.

ขอบคุณสำหรับความคิดเห็นฉันคิดว่ารหัสของฉันจะต้องถูกเรียกใช้ด้วยตัวเองดังนั้นฉันจึงสร้างมันขึ้นมาบนสมมติฐานที่ว่า! ขอบคุณสำหรับความคิดเห็นและการให้คำปรึกษา
Nejosan

2
ถ้าคุณต้องการที่จะหาเทคนิคเพิ่มเติมเกี่ยวกับวิธีการเล่นกอล์ฟใน C # ลองดูที่โพสต์นี้หรือดูคำตอบ C # ที่มีอยู่ มีความสุขในการเล่นกอล์ฟ!
Ian H.

คำตอบที่ดี ไปต่อ :)
aloisdg

1
สวัสดียินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดีโดยเฉพาะอย่างยิ่งตอนนี้มันเล่นกอล์ฟ +1 จากฉัน Btw ปัจจุบันมีขนาด 180 ไบต์ไม่ใช่ 162 การนำเข้าที่ต้องการusing System.Linq;นั้นเป็นสิ่งที่น่าเสียดายอย่างยิ่งที่จะต้องเพิ่มเข้าไปในจำนวนไบต์ (หรือคุณควรเปลี่ยนMaxเป็นSystem.Linq.MaxและSelectไปSystem.Linq.Maxที่ซึ่งจะสูงกว่าเพียงusing System.Linq;ครั้งเดียว) ยินดีต้อนรับอีกครั้ง โอ้และฉันเห็น @IanH เคล็ดลับสำหรับการเล่นกอล์ฟที่กล่าวถึงแล้วใน C # เคล็ดลับสำหรับการเล่นกอล์ฟใน <ทุกภาษา>อาจเป็นที่น่าสนใจในการอ่าน
Kevin Cruijssen

5

Bash, 78 , 76 71 ไบต์

for c in {B..a};{ [[ -n ${1// } ]]&&echo "$1";set "${1//[!$c-Z${c,}-z]/ }";}

ทั้งนี้ขึ้นอยู่กับการเปรียบเทียบ (ค่าเริ่มต้น LC_ALL) สามารถบันทึกได้มากขึ้น

for c in {b..z} _;{ [[ -n ${1// } ]]&&echo "$1";set "${1//[!$c-Z]/ }";}

ลองใช้ออนไลน์


4

Perl 5 , 43 ไบต์

41 ไบต์รหัสเมือง + -nl2

$c=A;print,s/$c|[^a-z]/ /gi,$c++while/\S/

ลองออนไลน์!


1
วนซ้ำสำหรับ [_0-9] ตัวละครอาจs/["-$c]/ /giและ-lไม่จำเป็น
Nahuel Fouilleul

@NahuelFouilleul Ahh ใช่ฉันเร็วไปหน่อยในกรณีทดสอบ พวกเขาควรจะเพิ่มใน OP! :) ขอบคุณ! +4 :(
Dom Hastings

ข้อเสนอแนะของฉันใช้ไม่ได้กับตัวละครใด ๆ ระหว่าง 32 ถึง 126 (ไม่ใช่อัลฟ่ามากกว่า Z)
Nahuel Fouilleul

@NahuelFouilleul ไม่สามารถหาวิธีที่สั้นกว่าที่ตรงกับความต้องการทั้งหมด ... ฉันจะเล่นต่อไป ...
Dom Hastings

4

JavaScript (ES6), 87 78 76 ไบต์

-9 ไบต์ขอบคุณที่@RickHitchcock
-2 ไบต์ขอบคุณที่@Neil

f=(s,i=10)=>s.trim()&&s+`
`+f(s.replace(/./g,c=>parseInt(c,36)>i?c:" "),i+1)

รับอินพุตเป็นสตริงและส่งคืนพร้อมกับขึ้นบรรทัดใหม่หนึ่งบรรทัด

กรณีทดสอบ


76 ไบต์ (ขึ้นบรรทัดใหม่หนึ่งบรรทัด): f=(s,i=10)=>s.trim()&&s+'newline'+f(s.replace(/./g,c=>parseInt(c,36)-i?c:" "),i+1)
Rick Hitchcock

@RickHitchcock ที่ดูเหมือนว่าจะวนซ้ำไม่ จำกัด สำหรับสตริงที่มีตัวเลข: ลองออนไลน์! . แม้ว่าแนวคิดของการเปลี่ยนแปลงทีละขั้นตอนจะsดีมาก
Justin Mariner

อ่าจุดดี สามารถแก้ไขได้ที่ราคา 2 ไบต์:parseInt(c,36)-i>0
Rick Hitchcock

1
@RickHitchcock คุณไม่สามารถใช้parseInt(c,36)>iแทนการบันทึก 2 ไบต์ได้หรือไม่
Neil

@ Neil, duh Justin: สิ่งที่ Neil พูด :)
ริกฮิตช์ค็อก

4

R, 118 114 ไบต์

function(a)while(grepl("[^ ]",a)){F=F+1;cat(a,"\n");for(j in c("[^a-zA-Z]",letters[F],LETTERS[F]))a=gsub(j," ",a)}

ขอบคุณ @Giuseppe สำหรับการปิด 4 ไบต์

ลองออนไลน์!

คำอธิบายสั้น ๆ :

function(a)
    while(grepl("[^ ]",a)){ #As long as the string is not just spaces.
        F=F+1 #Increment letter counter (F is FALSE, hence 0 by default)
        cat(a,"\n") #Print string
        for(j in c("[^a-zA-Z]",letters[F],LETTERS[F])) #Get rid of non-letters, and the current letter in lower and upper case
             a=gsub(j," ",a)
    }

โอ๊ะเดี๋ยวก่อนปัญหาที่อาจเกิดขึ้น: ถ้าaเป็นช่องว่างทั้งหมดจะไม่พิมพ์อะไรออกมา ... แต่คุณสามารถเปลี่ยนwhileเงื่อนไขgrepl()|!Fที่ยังคงเป็นไบต์ที่สั้นกว่าคำตอบเดิมของคุณ
Giuseppe

4

R , 125 123 ไบต์

โต้งโดย plannapus

for(i in 1:max(p<-pmax(1,match(tolower(S<-el(strsplit(scan(,""),''))),letters),na.rm=T)))cat(ifelse(p<i," ",S),'\n',sep='')

ลองออนไลน์!

พิมพ์เพื่อ stdout stdin()กับการขึ้นบรรทัดใหม่ต่อท้ายเดียวและอ่านจาก

มาทำลายมันกันเถอะ:

S <- el(strsplit(scan,""))            # split the string to characters

m <- match(tolower(S),letters)        # 1-based index in letters (lowercase a-z)
p <- pmax(1,m,na.rm=T)                # parallel max, replaces NA (non-alphabet) or 0 with 1
for(i in 1:max(p)){                   # iterate
 cat(                                 # print
  ifelse(p<1,' ',S),                  # the corresponding letter in S if p>=1, space otherwise
  '\n',sep='')                        # newline, and no spaces between chars
}

คำตอบอื่น 106 ไบต์

function(S)for(i in 1:max(p<-pmax(1,match(tolower(S),letters),na.rm=T)))cat(ifelse(p<i,' ',S),'\n',sep='')

ลองออนไลน์!

ฟังก์ชั่น; พิมพ์ไปที่ stdout แต่โดยพื้นฐานแล้วคำตอบของฉันด้านบนได้รับการย้ายเพื่อรับรายการอักขระแทนที่จะแยกสตริงดังนั้นฉันจึงรู้สึกว่าเป็น "การโกง" นอกจากนี้วิธีการของ plannapus กับ regex นั้นค่อนข้างเรียบร้อย!



3

Japt , 15 14 11 10 ไบต์

โอกาสแรกที่จะเล่นกับวิธีการเติมสตริงใหม่ของ Japt ดังนั้นอาจยังมีพื้นที่สำหรับการปรับปรุง

y_ùZInZu c

ลองมัน


คำอธิบาย

Uการป้อนข้อมูลโดยนัยของสตริง

y_

ผ่านแต่ละคอลัมน์ของUผ่านฟังก์ชันซึ่งZเป็นองค์ประกอบปัจจุบัน (หรือตัวอักษรในกรณีนี้)

InZu c

แปลงZเป็นตัวพิมพ์ใหญ่ ( u) รับ charcode ( c) และลบ ( u) 64 ( I)

ùZ

วางแผ่นเริ่มต้นZด้วยตัวเองจนกระทั่งถึงความยาวดังกล่าว


ทางเลือก

y_ùZ9aZn36

ลองมัน


แต่คุณไม่สามารถเปลี่ยนùZเป็นpบันทึกข ... ไม่เป็นไรมันฉลาดจริงๆ ...
ETHproductions

@ETHproductions: ฉันพยายามสองสามครั้งด้วยp( อาจมี 1 ในประวัติการแก้ไข) แต่ùได้รับรางวัลในตอนท้าย
Shaggy

3

Haskell , 137 136 127 119 ไบต์

import Data.Char
p c=last$0:[k|k<-[0..25],k+65==ord(toUpper c)]
f s=[[last$c:[' '|i>p c]|c<-s]|i<-[0..maximum$map p s]]

ลองออนไลน์!

ค่อนข้างยาว แต่ฉันไม่สามารถคิดวิธีที่จะทำให้สั้นลงอีก ฉันรู้สึกว่าต้องมีบางวิธีที่สั้นกว่าไวยากรณ์ if-then แต่ฉันไม่เห็น

แก้ไข: ขอบคุณ @streetster ที่ช่วยฉันกำจัดหนึ่งไบต์! ฉันไม่ได้ใช้toUpperในตอนแรกเพราะค่าใช้จ่ายในการนำเข้าData.Charแต่ฉันลืมไปว่ามันให้บริการordที่สั้นกว่ามากfromEnum

แก้ไข 2: ขอบคุณ @Laikoni สำหรับการตัดออกอีก 6 ไบต์และระบุข้อผิดพลาดซึ่งตอนนี้ฉันได้รับการแก้ไขแล้ว ฉันใช้ 26 แทน 25 เพราะฉันลืมว่าอาร์เรย์ Haskell นั้นรวมอยู่ด้วย จากนั้นผมสังเกตเห็นฉันสามารถใช้lastแทนheadซึ่งจะช่วยให้ฉันไปใช้มากกว่า0:++[0]

แก้ไข 3: ขอขอบคุณ Laikoni อีกครั้งสำหรับ 8 ไบต์เหล่านั้น ฉันลืมเรื่องอวกาศจริงๆ ด้วยเหตุผลบางอย่าง Sublime Text พลิกออกโดยไม่มีมันและฉันลืมที่จะลบมัน ฉันไม่ทราบว่าอนุญาตให้ใช้รายการได้ฉันควรอ่านกฎอย่างละเอียดมากขึ้น


1
คุณสามารถพิมพ์เล็กลงเพื่อหลีกเลี่ยงการตรวจสอบ AZ และ az แล้วทำการปรับเปลี่ยนได้หรือไม่?
streetster

@streetster ใน haskell ฟังก์ชัน toLower และ toUpper จำเป็นต้องนำเข้า Data.Char ซึ่งมีค่าใช้จ่ายมากกว่าตัวอักษรที่ประหยัดกว่า TIO
user1472751

1
คุณอาจต้องการที่จะมีลักษณะที่เป็นเคล็ดลับสำหรับการเล่นกอล์ฟใน Haskell เช่นif i>p c then ' ' else cสามารถย่อให้เหลือlast$c:[' '|i>p c]น้อย
Laikoni

สองสิ่งที่มากขึ้น: มีพื้นที่ที่ไม่จำเป็นในการเป็นและกลับมารายการของสายได้รับอนุญาตเพื่อให้คุณไม่จำเป็นต้อง[k | unlinesสุดท้ายคุณอาจจะสนใจในของเราห้องแชท Haskell
Laikoni

3

Excel VBA, 110 ไบต์

ฟังก์ชั่นหน้าต่าง VBE แบบไม่ระบุชื่อทันทีที่รับอินพุตตามประเภทที่คาดหวังVariant\Stringจากช่วง[A1]และใช้เพื่อทำให้ตัวอักษรฝนตกในหน้าต่างทันทีของ VBE

?[A1]:For i=1To 26:For j=1To[Len(A1)]:c=Mid([A1],j,1):d=Asc(UCase(c)):?IIf((d>64+i)*(d<91),c," ");:Next:?:Next

ตัวอย่าง I / O

[A1]="qwertyuiop[]ASDFGHJKL:'zxcvbnm,./"
?[A1]:For i=1To 26:For j=1To[Len(A1)]:c=Mid([A1],j,1):d=Asc(UCase(c)):?IIf((d>64+i)*(d<91),c," ");:Next:?:Next
qwertyuiop[]ASDFGHJKL:'zxcvbnm,./
qwertyuiop   SDFGHJKL  zxcvbnm   
qwertyuiop   SDFGHJKL  zxcv nm   
qwertyuiop   SDFGHJKL  zx v nm   
qwertyuiop   S FGHJKL  zx v nm   
qw rtyuiop   S FGHJKL  zx v nm   
qw rtyuiop   S  GHJKL  zx v nm   
qw rtyuiop   S   HJKL  zx v nm   
qw rtyuiop   S    JKL  zx v nm   
qw rtyu op   S    JKL  zx v nm   
qw rtyu op   S     KL  zx v nm   
qw rtyu op   S      L  zx v nm   
qw rtyu op   S         zx v nm   
qw rtyu op   S         zx v n    
qw rtyu op   S         zx v      
qw rtyu  p   S         zx v      
qw rtyu      S         zx v      
 w rtyu      S         zx v      
 w  tyu      S         zx v      
 w  tyu                zx v      
 w   yu                zx v      
 w   y                 zx v      
 w   y                 zx        
     y                 zx        
     y                 z         
                       z 

โหด !!! มันเป็นตะเข็บที่คุณสามารถทำได้?A1:...
LS_ᴅᴇᴠ

@ LS_ᴅᴇᴠโชคไม่ดีที่เป็น[]แสดงให้เห็นว่าสตริงที่มีอยู่ควรมีการประเมินไปยังวัตถุใน / บน / เป็นสมุดงานที่[A1]โทรอาจจะไม่ลดลงA1- เช่นนี้จะไม่ใช้เวลาและพิมพ์ป้อนข้อมูลเริ่มต้นจากช่วง[A1]; ค่อนข้างจะปล่อยให้บรรทัดว่างเปล่าและบรรทัดที่ตามมาทั้งหมดจะถูกพิมพ์
Taylor Scott

อัพคุณพูดถูก ... ไม่สังเกตเห็น!
LS_ᴅᴇᴠ

3

PHP, 69 78 77 85 + 1 ไบต์

for($c=A;!$c[1]&&~trim($s=&$argn);$s=eregi_replace("[^".++$c."-Z]"," ",$s))echo"$s
";

ต้องการ PHP <7 ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์


@Shaggy ขอบคุณสำหรับการชี้ให้เห็น เสร็จสมบูรณ์ในขณะนี้
ติตัส

+1 $c=A;!$c[1];$c++สำหรับ ทำได้ดีนี่! extraneous trailing newlines are not allowed (single \n on final line is acceptable)เศร้า zดังนั้นจึงล้มเหลวสำหรับสตริงทั้งหมดไม่ได้มี
Christoph

1
@Christoph แก้ไขแล้ว
ติตัส



2

Ruby, 70 67 74 ไบต์

f=->s{puts s;(?b..?z).each{|c|s.gsub! /[^#{c}-z]/i,' ';puts s if s=~/\S/}}

ขอบคุณ@TuukkaXสำหรับการชี้ให้เห็นบาง parens อาจถูกทิ้ง (-3 ไบต์)

น่าเสียดายที่ฉันต้องเพิ่ม 7 ไบต์เพราะเวอร์ชันดั้งเดิมไม่สามารถจัดการ "z"

เรียกมันว่า:

f.call('The quick brown fox jumps over the lazy dog!')
The quick brown fox jumps over the lazy dog!
The quick brown fox jumps over the l zy dog
The quick  rown fox jumps over the l zy dog
The qui k  rown fox jumps over the l zy dog
The qui k  rown fox jumps over the l zy  og
Th  qui k  rown fox jumps ov r th  l zy  og
Th  qui k  rown  ox jumps ov r th  l zy  og
Th  qui k  rown  ox jumps ov r th  l zy  o
T   qui k  rown  ox jumps ov r t   l zy  o
T   qu  k  rown  ox jumps ov r t   l zy  o
T   qu  k  rown  ox  umps ov r t   l zy  o
T   qu     rown  ox  umps ov r t   l zy  o
T   qu     rown  ox  umps ov r t     zy  o
T   qu     rown  ox  u ps ov r t     zy  o
T   qu     row   ox  u ps ov r t     zy  o
T   qu     r w    x  u ps  v r t     zy
T   qu     r w    x  u  s  v r t     zy
T    u     r w    x  u  s  v r t     zy
T    u       w    x  u  s  v   t     zy
T    u       w    x  u     v   t     zy
     u       w    x  u     v         zy
             w    x        v         zy
             w    x                  zy
                  x                  zy
                                     zy
                                     z

วงเล็บที่นิยามแลมบ์ดาสามารถลบออกได้ +1
Yytsi

2

Oracle SQL, 186 ไบต์

สมมติว่าสตริงจะอยู่ในตารางtในคอลัมน์v:

WITH a(s,l)AS(SELECT v,64 FROM t UNION ALL SELECT REGEXP_REPLACE(s,'[^'||CHR(l+1)||'-Z]',' ',1,0,'i'),l+1 FROM a WHERE l<90)SELECT LISTAGG(RTRIM(s),CHR(10))WITHIN GROUP(ORDER BY l)FROM a

ซอ Fiddle

การติดตั้ง Oracle Schema 11g R2 :

CREATE TABLE t ( v ) AS
SELECT '~|[abc<0>cba]|~' FROM DUAL
/

แบบสอบถาม 1 :

WITH a(s,l)AS(
  SELECT v,64 FROM t
UNION ALL
  SELECT REGEXP_REPLACE(s,'[^'||CHR(l+1)||'-Z]',' ',1,0,'i'),l+1
  FROM a
  WHERE l<90
)
SELECT LISTAGG(RTRIM(s),CHR(10))WITHIN GROUP(ORDER BY l)
FROM a

ผลลัพธ์ :

|      LISTAGG(RTRIM(S),CHR(10))WITHINGROUP(ORDERBYL) |
|-----------------------------------------------------|
| ~|[abc<0>cba]|~                                     |
|    abc   cba                                        |
|     bc   cb                                         |
|      c   c                                          |


2

Haskell , 98 ไบต์

p c=sum[length[a..c]|a:e<-["B[","b{"],[c]<e]
f s=[[last$c:[' '|i>p c]|c<-s]|i<-[0..maximum$p<$>s]]

ลองออนไลน์!

ตัวอย่างการใช้งาน: f "[Abc]"ให้รายการของบรรทัด: ["[Abc]"," bc "," c "]. ใช้putStr.unlines.f $ "[Abc]"สำหรับงานพิมพ์สวย:

[Abc]
  ก่อนคริสต์ศักราช
   ค

แรงบันดาลใจส่วนหนึ่งจากตอนนี้ตรงตามuser1472751 คำตอบของ


วิธีก่อนหน้า ( 100 99 ไบต์)

f s=[h|i<-[0..26],h<-[[(c:concat[c<$[a..c]|[a,e]<-["B[","b{"],c<e]++cycle" ")!!i|c<-s]],any(>' ')h]

ลองออนไลน์!


2

PowerShell , 122 127 ไบต์

param($a)$a;(1..25|%{$i=$_;(-join([char[]]$a|%{(' ',$_)[$_-match'[a-z]'-and[math]::Max(0,($_-bor32)-96-$i)]})).TrimEnd()})-ne''

ลองออนไลน์!

ขอบคุณสั้น ๆ ว่า PowerShell สามารถแปลงระหว่าง[char]และได้อย่างไรแบบไดนามิก[int]แต่ใช้เวลานานเนื่องจากการลบช่องว่างภายนอกและการคำนวณว่าจะส่งออกพื้นที่หรืออักขระ

แก้ไขข้อผิดพลาดด้วย beatcracker


น่าเสียดายที่กรณีนี้ล้มเหลวใน~|[abc<0>cba]|~กรณีทดสอบ ลองสิ่งนี้:param($a)$a;(1..25|%{$i=$_;(-join([char[]]$a|%{(' ',$_)[$_-match'[a-z]'-and[math]::Max(0,($_-bor32)-96-$i)]})).TrimEnd()})-ne''
beatcracker

@beatcracker จับได้ดี นั่นเป็นวิธีที่ชาญฉลาดในการจัดการการเปรียบเทียบ ขอบคุณ!
AdmBorkBork

2

Java 8, 151 147 144 143 139 ไบต์

s->{String x="\n"+s;for(int i=64,t;++i<91;)for(char c:x.toCharArray())s+=(t=c&~32)>64&t<91&t>i|c<11?c:" ";return s.replaceAll("\\s+$","");}

คำอธิบาย:

ลองที่นี่

s->{                   // Method with String as both parameter and return-type
  String x="\n"+s;     //  Temp-String (equal to leading new-line + input)
  for(int i=64,        //  Index-integer `i` (starting at 64)
          t;           //  Temp-integer
      ++i<91;)         //  Loop (1) from 'A' (65) to 'Z' (90) (inclusive)
    for(char c:x.toCharArray())
                       //   Inner loop (2) over the character of the array
      s+=(t=c&~32)>64  //    If the current character as uppercase is larger than 'A'
         &t<91         //    and smaller or equal to 'Z'
         &t>i          //    and larger than the current index
         |c<11?        //    or the current character is a new-line
          c            //     Append the current character to `s`
         :             //    Else:
          " ";         //     Append a space to `s` instead
                       //   End of inner loop (2) (implicit / single-line body)
                       //  End of loop (1) (implicit / single-line body)
  return s             //  Return the result,
    .replaceAll("\\s+$",""); 
                       //   after we've removed all trailing spaces and new-lines
}                      // End of method

2

q , 42 37 bytes

{(+)max[m]$(m:1+mod[.Q.a?(_)x]26)#'x}

-5 ขอบคุณท้องถนน!


คำตอบเก่า + คำอธิบาย:

{(+)max[m]$'(m:1+mod[.Q.a?lower x;26])#'x}


{                                        }  / lambda func
                     .Q.a?lower x           / get lowercase of input (ignores non-alpha values) and find (?) their index in "a...z" (.Q.a). non-alpha values return `26`
                 mod[.Q.a?lower x;26]       / get mod 26 of each index, this returns 0 where index is 26
            (m:1+mod[.Q.a?lower x;26])      / add 1 and assign to m
            (m:1+mod[.Q.a?lower x;26])#'x   / m and x conform, so we can take (#) m copies of each (') x at corresponding indices
    max[m]$'(m:1+mod[.Q.a?lower x;26])#'x   / get max of m, and pad each ($') of right-side list to that length
 (+)                                        / transpose the char matrix

1
{(+)max[m]$(m:1+mod[.Q.a?(_)x]26)#'x}สำหรับ 37, จำไม่ได้ว่าฉันแก้ไขมันอย่างไรเมื่อสร้างคำถาม, อาจจะคล้ายกันมาก!
streetster

@ ผู้รายงานขอบคุณ! อัปเดต ไม่ทราบเกี่ยวกับ k ของ_ผมพิมพ์lowerในล่าม Q k){$[~t&77h>t:abs@@x;.z.s'x;19<t;.z.s@. x;~t in 10 11h;'`type;_x]}และมี ดังนั้นให้คำตอบของฉันใน q haha
เขียนลวก ๆ

1

SOGL V0.12 , 12 11 ไบต์

ā,{Z⁴UW1Χ∙┼

ลองที่นี่!

คำอธิบาย:

ā            push an empty array
 ,{          for each character in the input, pushing it
   Z           push the uppercase alphabet
    ⁴          push a duplicate of the character
     U         uppercase it
      W        find its index in that alphabet
       1Χ      get the maximum of that and 1
         ∙     repeat the character that many times
          ┼    append horizontally to that array
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.