Buatlah Alphabet Rain

54

Alfabet Hujan

Tugas:

Premis dasarnya adalah untuk mencetak string input dan kemudian mengulangi setiap karakter secara vertikal, berdasarkan posisi (0-diindeks) itu dalam alfabet (case-insensitive) A-Z. Aberada di lokasi 0 jadi tidak diulang, eberada di posisi 4 jadi diulang 4 kali, Pdi posisi 15 jadi diulang 15 kali, !tidak di A-Zbegitu diulang 0 kali, dll.

Untuk kejelasan, apa pun yang berada di luar rentang B-Zb-z, misalnya digit atau karakter khusus, tidak akan diulang, dan dengan demikian hanya akan muncul di baris pertama.

Ini adalah , jadi solusi terpendek dalam setiap bahasa adalah pemenangnya.

Memasukkan:

  • Input akan berada dalam set karakter ASCII yang dapat dicetak standar, dari 32 hingga 126 ~.
  • String input akan menjadi 1 karakter atau lebih panjang.
  • Tidak akan ada spasi putih depan atau belakang.
  • Anda dapat mengambil input sebagai string ( "hello") atau daftar karakter ( ["h", "e", "l", "l", "o"])

Contoh:

Masukan dari aaaamemberi:

aaaa

Masukan dari abcdamemberi:

abcda
 bcd
  cd
   d

Input dari Programming Puzzles & Code Golf!, memberikan:

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

Input dari ~|[abc<0>cba]|~, memberikan:

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

Catatan:

  • celah standar berlaku
  • output bisa berupa daftar string, tetapi:
  • newline trailing asing tidak diperbolehkan (tunggal \npada baris terakhir dapat diterima)
  • output bisa berupa daftar karakter, asalkan terlihat hujan
  • tidak ada baris baru terkemuka
  • untuk pengguna Nordic kami yang memiliki beberapa huruf tambahan dalam alfabet "AZ" mereka, jangan ragu untuk mendukung mereka, tetapi itu bukan bagian dari tantangan
streetster
sumber
2
Apakah pemimpin tunggal \ndapat diterima?
Lynn
@ Lynn, tidak ada baris baru, baris pertama harus menjadi string input / daftar karakter - Saya akan memperbarui posting!
streetster
18
FWIW, saya pikir mereka lebih mirip es daripada hujan
caird coinheringaahing
@cairdcoinheringaahing terdengar hampir meriah
Pureferret
:( Hanya Nordic?
ASCII-saja

Jawaban:

22

6502 kode mesin (C64), 113 byte

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

tangkapan layar

Demo online

Penggunaan:, sys49152,"[string]" mis sys49152,"Programming Puzzles & Code Golf!".

Penting: Jika program dimuat dari disk (seperti dalam demo online), keluarkan newperintah terlebih dahulu! Ini diperlukan karena memuat program mesin menghancurkan beberapa pointer BASIC C64.

Catatan: C64 secara default dalam mode tanpa huruf kecil - untuk dapat memasukkan string case campuran, beralih ke mode huruf kecil terlebih dahulu dengan menekan SHIFT+ CBM.


Penjelasan

Berikut daftar pembongkaran yang dikomentari:

         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
Felix Palmen
sumber
3
kode mesin c64. Saya terkesan.
Dschoni
@Dschoni terima kasih, tapi ini masih kode sederhana (dan itu menyenangkan, bagi saya!) - Anda harus melihat adegan demo untuk karya C64 yang benar-benar mengesankan;)
Felix Palmen
Jika kita akan terus mendapatkan ini, kita mungkin ingin mengatur tautan ke emulator JavaScript C64 sehingga orang dapat melihatnya berjalan.
trlkly
1
@ CtrlKly Saya memiliki tautan seperti itu dalam kiriman saya, klik "Demo online";)
Felix Palmen
14

05AB1E , 13 12 byte

,εDlAsk×}ζ»,

Cobalah online!

Penjelasan

,             # 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
Emigna
sumber
32
Perlu mendapatkan indeks char dalam huruf kecil? hanya Askuntuk itu
Uriel
8

Pyth, 12 10 9 byte

.tm+*xGr0

Suite uji.

Penjelasan:

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

j.t*VmxGr0d

(dengan mengikuti baris baru)

Suite uji.

Penjelasan:

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
Steven H.
sumber
output dapat berupa daftar daftar karakter, asalkan tampaknya sedang hujan karakter - Oleh karena itu Anda tidak perluj
Tn. Xcoder
Ah, kamu benar! Saya menyimpannya karena versi 12-byte sedang mencetak satu baris kata demi kata dan saya tidak dapat mencampur format seperti itu, dan saya lupa saya bisa menghapusnya sekarang karena semuanya ada dalam transpose. Terima kasih!
Steven H.
8

Python 3 , 83 byte

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

Cobalah online! Mengambil daftar karakter. Mengembalikan daftar daftar karakter.

Python 2 , 90 byte

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

Cobalah online! Mengambil string. Mengembalikan string.

Lynn
sumber
7

Mathematica, 115 89 byte

Dibutuhkan sebagai inputsebuah daftar karakter [{"a", "b", "c", "d", "a"}] dan output daftar daftar karakter

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

Cobalah online!

-26 byte dari Misha Lavrov

-5 byte dari user202729

tetapi jika Anda ingin melihat output seperti pada test case, coba kode (128 byte) ini.
Coba online!

J42161217
sumber
Untuk pembaca masa depan: Bagian "jawaban ini hanya berfungsi pada Mathematica ..." agak menyesatkan, masalahnya adalah Mathematica hanya mendukung karakter Unicode dalam mode notebook (REPL). Dalam mode skrip , itu hanya memahami ASCII dan karakter khusus yang telah dikonversi ke ASCII (misalnya, (3 byte) -> \[Infinity](11 byte)).
user202729
@ user202729 ok, saya akan mengedit dan menyapa orang-orang untuk membaca komentar Anda.
terima kasih
Saran golf untuk Mathematica (mode skrip): \[Infinity](11 byte) dapat diganti dengan Infinity(8 byte) atau \:221e(6 byte). Yang terakhir adalah representasi default karakter khusus tanpa nama. (meskipun itu bukan bagian utama)
user202729
Kita dapat Infinitysepenuhnya menghindari . Bagian yang bermasalah adalah If[(d=Min@Position[Alphabet[],If[UpperCaseQ@#,ToLowerCase@#,#]])==∞,1,d]dan kita bisa mengubahnya ke Max@Position[Alphabet[]/."a"->#,#|ToLowerCase@#]. (Menelusuri dalam daftar {#,b,c,d,...,y,z}, kami dijamin akan menemukan #setidaknya satu kali.)
Misha Lavrov
@MishaLavrov sangat bagus. memperbaikinya!
J42161217
6

Dyalog APL , 27 22 byte

5 byte disimpan berkat @ Adám

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

Cobalah online!

Bagaimana?

⍴¨⍨ - bentuk masing-masing char dengan panjang

    1⌈ - setidaknya satu atau

    ⎕A⍳819⌶⍨∘1 - Indeks char yang ditulis dalam alfabet

        27| - modulo 27

- Ratakan ke matriks

- dan transpos

Uriel
sumber
@ Adam terima kasih! diperbarui
Uriel
5

Python, 105 103 byte

2 byte disimpan berkat @TFeld

lambda s:'\n'.join(''.join((' '+l)[i<1or 91>ord(l.upper())>i+64]for l in s)for i in range(26)).rstrip()

Cobalah online!

Uriel
sumber
103 byte
TFeld
@Tfeld tangkapan bagus, terima kasih!
Uriel
5

Python 2 , 111 106 99 98 97 87 93 byte

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

Cobalah online!

TFeld
sumber
whiledapat diganti dengan execuntuk menghemat beberapa byte, idapat mulai dengan 65 untuk menyimpan lebih banyak hingga mencapai 87 byte
Rod
OP mengatakan baris trailing asing tidak diizinkan , tetapi kode Anda mencetak beberapa baris saat input tidak mengandung zatau Z.
Lynn
@ Lynn Diperbaiki, saya lupa mengecek execperubahan ...
TFeld
5

C # (.NET Core) , 162 byte

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

Cobalah online!

Nejosan
sumber
2
Selamat datang di PPCG dan jawaban pertama yang bagus. Anda dapat mempersingkat kode Anda dengan menggunakan beberapa trik. Ini adalah versi kode Anda yang lebih golf : Coba online! .
Ian H.
Terima kasih atas komentarnya, saya menganggap kode saya harus dapat dieksekusi dengan sendirinya, jadi saya membangunnya berdasarkan asumsi itu! Terima kasih atas komentar dan bimbingannya.
Nejosan
2
Jika Anda ingin menemukan beberapa trik lebih lanjut tentang cara bermain golf di C #, lihat posting ini , atau lihat jawaban C # yang ada. Selamat bermain golf!
Ian H.
Jawaban bagus. Teruskan :)
aloisdg berkata Reinstate Monica
1
Hai, selamat datang di PPCG! Jawaban pertama yang bagus, terutama sekarang karena sudah golf. +1 dari saya. Btw, saat ini 180 byte, bukan 162. Impor yang diperlukan using System.Linq;sayangnya wajib untuk menambah byte-count (atau Anda harus mengubah Maxke System.Linq.Maxdan Selectke System.Linq.Max, yang akan lebih tinggi dari hanya using System.Linq;sekali.) Sekali lagi selamat datang, dan nikmati masa tinggal Anda. Oh, dan saya melihat @IanH. sudah disebutkan Tips untuk Golf di C #. Kiat bermain golf di <semua bahasa> mungkin juga menarik untuk dibaca.
Kevin Cruijssen
5

Bash, 78 , 76 71 byte

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

Tergantung pada pemeriksaan (LC_ALL default) dapat menyimpan lebih banyak byte

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

Cobalah secara Online

Nahuel Fouilleul
sumber
4

Perl 5 , 43 byte

Kode 41 byte + 2 untuk -nl.

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

Cobalah online!

Dom Hastings
sumber
1
loop untuk karakter [_0-9], mungkin s/["-$c]/ /gidan -ltidak diperlukan
Nahuel Fouilleul
@NahuelFouilleul Ahh, ya, saya agak terlalu cepat dalam soal-soal ujian. Mereka harus ditambahkan ke OP! :) terima kasih! +4 :(
Dom Hastings
saran saya tidak berfungsi untuk karakter apa pun antara 32 dan 126 (non alpha lebih besar dari Z)
Nahuel Fouilleul
@NahuelFouilleul Tidak dapat menemukan cara yang lebih pendek yang memenuhi semua persyaratan ... Saya akan terus bermain ...
Dom Hastings
4

JavaScript (ES6), 87 78 76 byte

-9 byte berkat @RickHitchcock .
-2 byte terima kasih kepada @Neil .

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

Mengambil input sebagai string dan kembali dengan satu baris tambahan.

Uji Kasus

Justin Mariner
sumber
76 byte (satu baris baru tertinggal): f=(s,i=10)=>s.trim()&&s+'newline'+f(s.replace(/./g,c=>parseInt(c,36)-i?c:" "),i+1)
Rick Hitchcock
@RickHitchcock Tampaknya loop tak terbatas untuk string input yang berisi angka: Cobalah online! . Gagasan langkah demi langkah berubah menjadi ssangat bagus.
Justin Mariner
Ahh, poin bagus. Itu dapat diperbaiki dengan biaya 2 byte:parseInt(c,36)-i>0
Rick Hitchcock
1
@RickHitchcock Bisakah Anda tidak menggunakan parseInt(c,36)>isebagai gantinya untuk menyimpan 2 byte?
Neil
@Neil, ya. Justin: Apa yang dikatakan Neil. :)
Rick Hitchcock
4

R, 118 114 byte

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

Terima kasih kepada @Giuseppe untuk off 4 byte tersebut

Cobalah online!

Penjelasan singkat:

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)
    }
plannapus
sumber
ohhh, tunggu, masalah potensial: jika asemua ruang, ini tidak akan mencetak apa pun ... tetapi Anda dapat mengubah whilekondisi grepl()|!Fyang masih byte lebih pendek dari jawaban asli Anda.
Giuseppe
4

R , 125 123 byte

Dikalahkan oleh 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='')

Cobalah online!

Mencetak ke stdout dengan satu baris baru dan membaca dari stdin().

Mari kita jabarkan:

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
}

Jawaban alternatif, 106 byte

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

Cobalah online!

Fungsi; mencetak ke stdout tetapi pada dasarnya respons saya di atas porting untuk menerima daftar karakter daripada membelah string, jadi saya merasa seperti "curang." Plus, pendekatan plannapus dengan regex cukup rapi!

Giuseppe
sumber
4

Oktaf / MATLAB, 74 66 byte

@(s)char(arrayfun(@(c){repmat(c,1,prod(find(upper(c)==65:90)))},s))'

Cobalah online!

Luis Mendo
sumber
3

Japt , 15 14 11 10 byte

Kesempatan pertama untuk bermain dengan metode padding string baru dari Japt sehingga mungkin masih ada ruang untuk perbaikan.

y_ùZInZu c

Cobalah


Penjelasan

Input string yang tersirat U.

y_

Lewati setiap kolom Umelalui fungsi, di mana Zelemen saat ini (atau huruf, dalam hal ini).

InZu c

Konversikan Zke huruf besar ( u), dapatkan kode kodenya ( c) dan kurangi ( u) 64 ( I).

ùZ

Pad mulai Zdengan dirinya sendiri hingga mencapai panjang itu.


Alternatif

y_ùZ9aZn36

Cobalah

Shaggy
sumber
Tapi tidak bisakah kamu berubah ùZuntuk pmenyelamatkan ... tidak apa-apa, itu benar-benar pintar ...
ETHproduksi
@ ETHproductions: Saya melakukan beberapa upaya dengan p( mungkin ada 1 di edit history) tetapi ùmenang pada akhirnya.
Shaggy
3

Haskell , 137 136 127 119 byte

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

Cobalah online!

Cukup lama tapi saya tidak bisa memikirkan cara untuk mempersingkat lebih lanjut. Saya merasa harus ada beberapa cara yang lebih pendek dari sintaks if-then tapi saya tidak melihatnya.

EDIT: Terima kasih @streetster untuk membantu saya mengurangi satu byte! Saya tidak menggunakan toUpperpada awalnya karena biaya impor Data.Chartetapi saya lupa bahwa itu juga menyediakan ordyang jauh lebih pendek daripadafromEnum

EDIT 2: Terima kasih kepada @Laikoni karena telah menghilangkan 6 byte lagi dan mengidentifikasi bug yang sekarang telah saya perbaiki. Saya menggunakan 26 bukannya 25 karena saya lupa bahwa array Haskell inklusif. Kemudian saya perhatikan bahwa saya bisa menggunakan lastdaripada headyang akan memungkinkan saya untuk menggunakannya 0:daripada ++[0].

EDIT 3: Terima kasih lagi Laikoni untuk 8 byte itu. Saya benar-benar lupa tentang ruang itu. Untuk beberapa alasan Sublime Text membalik tanpa itu dan saya lupa menghapusnya. Saya tidak tahu bahwa daftar garis diizinkan, saya harus membaca peraturan dengan lebih hati-hati.

pengguna1472751
sumber
1
Bisakah Anda mengurangi input untuk menghindari memeriksa AZ dan juga az dan kemudian mod'ing?
streetster
@streetster Dalam haskell fungsi toLower dan toUpper memerlukan mengimpor Data.Char yang harganya lebih mahal daripada menyimpannya. TIO
user1472751
1
Anda mungkin ingin melihat tips untuk bermain golf di Haskell . Misalnya if i>p c then ' ' else cbisa disingkat menjadi last$c:[' '|i>p c].
Laikoni
Dua hal lagi: Ada ruang yang tidak perlu di dalam [k | dan mengembalikan daftar garis diperbolehkan, jadi Anda tidak memerlukannya unlines. Akhirnya, Anda mungkin tertarik dengan ruang obrolan Haskell kami .
Laikoni
3

Excel VBA, 110 Bytes

Anonymous VBE Immediate Window Fungsi yang mengambil input seperti tipe yang diharapkan Variant\Stringdari rentang [A1]dan menggunakannya untuk menghujani alfabet di jendela langsung 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

Contoh 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 
Taylor Scott
sumber
Brutal!!! Tampaknya Anda juga bisa membuat?A1:...
LS_ᴅᴇᴠ
@ LS_ᴅᴇᴠ, sayangnya, karena []menunjukkan bahwa string yang terkandung harus dievaluasi ke objek di / di / sebagai buku kerja, [A1]panggilan mungkin tidak berkurang menjadi A1- karena ini tidak akan mengambil dan mencetak input awal dari rentang [A1]; melainkan ini hanya akan meninggalkan baris kosong dan semua baris berikutnya akan dicetak
Taylor Scott
Ups, kau benar ... Tidak memperhatikan ini!
LS_ᴅᴇᴠ
3

PHP, 69 78 77 85 + 1 byte

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

membutuhkan PHP <7. Jalankan sebagai pipa dengan -nRatau coba online .

Titus
sumber
@Shaggy, terima kasih telah menunjukkan. Lengkap sekarang.
Titus
+1 untuk $c=A;!$c[1];$c++. Yang bagus! Sedihnya extraneous trailing newlines are not allowed (single \n on final line is acceptable). Jadi gagal untuk semua string yang tidak mengandung z.
Christoph
1
@Christoph fix
Titus
3

Bash + sed, 37

sed -rne"/^ *$/q;p;s/\W|"{a..z}/\ /gi

Cobalah online .

Trauma Digital
sumber
sepertinya itu mengulangi karakter dalam alfabet 1-kali-terlalu banyak
streetster
@streetster saya pikir sudah diperbaiki sekarang.
Digital Trauma
2

C (gcc) , 189 byte

#define F for(q=c,p=s;*p;++p,++q)
char*p,*q,s[99],c[99];main(h){gets(s);F{*q=*p>64&&*p<91?*p-65:*p>96&&*p<123?*p-97:0;h=h>*q?h:*q;}for(puts(s);h--;){F{putchar(*q?--*q,*p:32);}putchar(10);}}

Cobalah online!

Felix Palmen
sumber
Coba puts("");alih-alihputchar(10)
Conor O'Brien
178 bytes
ceilingcat
2

Ruby, 70 67 74 byte

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

Terima kasih kepada @TuukkaX karena menunjukkan beberapa parens dapat dihapus (-3 byte)

Sayangnya saya kemudian harus menambahkan 7 byte karena versi asli gagal menangani "z".

Menyebutnya:

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
Neil Slater
sumber
Tanda kurung pada definisi lambda dapat dihapus. +1.
Yytsi
2

Oracle SQL, 186 Bytes

Asumsikan string akan berada dalam tabel tdi kolom 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

SQL Fiddle

Pengaturan Skema Oracle 11g R2 :

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

Pertanyaan 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

Hasil :

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

Haskell , 98 byte

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

Cobalah online!

Contoh penggunaan: f "[Abc]"menghasilkan daftar baris: ["[Abc]"," bc "," c "]. Gunakan putStr.unlines.f $ "[Abc]"untuk hasil cetak yang cantik:

[Abc]
  bc
   c

Sebagian terinspirasi oleh Now langsung berdasarkan jawaban Haskell user1472751 .


Pendekatan sebelumnya ( 100 99 bytes)

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

Cobalah online!

Laikoni
sumber
2

PowerShell , 122 127 byte

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

Cobalah online!

Singkat terima kasih kepada bagaimana PowerShell dapat secara dinamis berpindah di antara [char]dan [int], tetapi lama karena menghilangkan spasi kosong dan perhitungan apakah akan menghasilkan spasi atau karakter.

Perbaikan bug berkat beatcracker.

AdmBorkBork
sumber
Sayangnya, ini gagal pada ~|[abc<0>cba]|~test case. Coba ini:param($a)$a;(1..25|%{$i=$_;(-join([char[]]$a|%{(' ',$_)[$_-match'[a-z]'-and[math]::Max(0,($_-bor32)-96-$i)]})).TrimEnd()})-ne''
beatcracker
@beatcracker Tangkapan yang bagus. Itu cara cerdas menangani perbandingan. Terima kasih!
AdmBorkBork
2

Java 8, 151 147 144 143 139 byte

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

Penjelasan:

Coba di sini.

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
Kevin Cruijssen
sumber
2

q , 42 37 byte

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

Terima kasih kepada streetster!


solusi + penjelasan lama:

{(+)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
tulisan cakar ayam
sumber
1
{(+)max[m]$(m:1+mod[.Q.a?(_)x]26)#'x}untuk 37, tidak ingat bagaimana saya menyelesaikannya saat membuat pertanyaan, mungkin sangat mirip!
streetster
@streetster, terima kasih! diperbarui. tidak tahu tentang k _, saya mengetikkan lowerq interpreter dan mendapatkannya k){$[~t&77h>t:abs@@x;.z.s'x;19<t;.z.s@. x;~t in 10 11h;'`type;_x]}. karenanya memberikan jawaban saya dalam q haha
scrawl
1

SOGL V0.12 , 12 11 byte

ā,{Z⁴UW1Χ∙┼

Coba Di Sini!

Penjelasan:

ā            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
dzaima
sumber