アルファベットの雨を作る


54

アルファベットの雨

タスク:

基本的な前提は、入力文字列を出力し、(大文字と小文字を区別しない)アルファベットの(0から始まる)位置に基づいて各文字を垂直に繰り返すことA-Zです。A位置0にあるので繰り返されないe、位置4にあるので4回繰り返されるP、位置15にあるので15回繰り返される、!存在しないA-Zので0回繰り返される、など

わかりやすくするために、範囲外のB-Zb-z数字や特殊文字などは繰り返されないため、最初の行にのみ表示されます。

これはであるため、各言語で最も短いソリューションが勝者です。

入力:

  • 入力は、32 から126までの標準の印刷可能なASCII文字セットになり~ます。
  • 入力文字列は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、先頭に改行はありません。最初の行は入力文字列/文字リストでなければなりません-投稿を更新します!
ストリートスター

18
FWIWは、私は彼らが雨よりつららのような、より見て考える
coinheringaahing caird

@cairdcoinheringaahingはほとんどお祭り騒ぎに聞こえる
-Pureferret

:(ただ、北欧?
ASCIIのみ

回答:


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

screenshot

オンラインデモ

使用法: sys49152,"[string]"、例えばsys49152,"Programming Puzzles & Code Golf!"

重要:プログラムがディスクからロードされた場合(オンラインデモなど)、new最初にコマンドをください!これは、マシンプログラムをロードするとC64 BASICポインターが破棄されるために必要です。

注:デフォルトでは、C64は小文字のないモードです。大文字と小文字が混在する文字列を入力するには、最初にSHIFT+ を押して小文字モードに切り替えますCBM


説明

以下にコメント付きの逆アセンブリのリストを示します。

         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提出物にそのようなリンクがあります。「オンラインデモ」をクリックしてください;)
Felix Palmen

14

05AB1E13 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
小文字のアルファベットでcharのインデックスを取得する必要がありますか?ちょうど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バイトバージョンは1行を逐語的に印刷していたので、そのような形式を混在させることができなかったため、それを保持していました。ありがとう!
スティーブンH.10年


7

Mathematica、115 89バイト

それはとして取り文字のリストを出力文字のリストのリストをinput [{"a", "b", "c", "d", "a"}]

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

オンラインでお試しください!

-26バイト、Misha Lavrovから

user202729から-5バイト

ただし、テストケースの出力をそのまま表示する場合は、この(128バイト)コードを
試してください。オンラインで試してください!


将来の読者向け:「この答えはMathematicaでのみ機能します...」という部分は少し誤解を招くかもしれません。問題はMathematicaがノートブック(REPL)モードでUnicode文字のみをサポートしていることです。ではスクリプトモード(例えば、それだけでASCIIおよびASCIIに変換されている特殊文字を理解する- >(3バイト)\[Infinity](11バイト))。
user202729

@ user202729 OK、私はあなたのコメントを読むために人々を編集し、アドレスします。
感謝-J42161217

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}内を検索すると#、少なくとも1回
ミシャラヴロフ

@MishaLavrovとても素敵です。それを修正しました!
-J42161217

6

Dyalog APL27 22バイト

@Adámのおかげで5バイト節約

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

オンラインでお試しください!

どうやって?

⍴¨⍨ -各文字を次の長さに整形します

    1⌈ -少なくとも1つまたは

    ⎕A⍳819⌶⍨∘1 -アルファベットで大文字にされた文字のインデックス

        27| -モジュロ27

-行列に平坦化

-および転置



@Adámありがとう!更新
ウリエル



5

パイソン2111 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バイトに到達するために
ロッド

OPは、余分な末尾の改行は許可されていないと述べていますが、入力にzまたはが含まれていない場合、コードはそれらのいくつかを出力しますZ
リン

@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へようこそ、最初の回答です。いくつかのトリックを使用して、コードを短縮できます。これは、よりゴルフ版のコードです:オンラインで試してみてください!
イアンH.

コメントをありがとう、私は自分のコードがそれ自体で実行可能でなければならないと仮定したので、私はその仮定に基づいてそれを構築しました!コメントと指導に感謝します。
ネジョサン

2
C#でゴルフをする方法について他のトリックを見つけたい場合は、この投稿をご覧になるか、既存のC#の回答をご覧ください。ハッピーゴルフ!
イアンH.

素敵な答え。続けてください:)
aloisdgは、Reinstate Monica

1
こんにちは、PPCGへようこそ!特に今ではゴルフをしているので、素晴らしい最初の答えです。私から+1。ところで、それは必要なインポートではなく162、現在は180バイトですusing System.Linq;(または変更すべきバイト数に追加することが、残念ながら必須であるMaxSystem.Linq.MaxしてSelectまでSystem.Linq.Max、単によりも高くなると思われる、using System.Linq;一回。)ここでも歓迎し、ご滞在をお楽しみください。ああ、私は@IanHを見る。既に言及したC#でのゴルフのヒント。<すべての言語>でのゴルフのヒントも読むのが面白いかもしれません。
ケビンCruijssen

5

バッシュ、7876の 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バイトのコード+の2 -nl

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

オンラインでお試しください!


1
[_0-9]文字のループ、おそらく必要s/["-$c]/ /gi-lはない
ナウエルFouilleul

@NahuelFouilleulああ、はい、私はテストケースについて少し速すぎました。OPに追加する必要があります!:)ありがとう!+4 :(
Dom Hastings

私の提案は、
32〜126

@NahuelFouilleulがすべての要件を満たしている短い方法を見つけることができません...私はプレーしておこう...
ドムヘイスティングス

4

JavaScript(ES6)、87 78 76バイト

@RickHitchcockのおかげで-9バイト。@Neilの
おかげで-2バイト。

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

入力を文字列として受け取り、1つの末尾の改行で戻ります。

テストケース


76バイト(1つの末尾の改行): f=(s,i=10)=>s.trim()&&s+'newline'+f(s.replace(/./g,c=>parseInt(c,36)-i?c:" "),i+1)
リックヒッチコック

@RickHitchcock数字を含む入力文字列の無限ループのようです:オンラインで試してみてください!。しかし、段階的sな変更のアイデアは本当に素晴らしいです。
ジャスティンマリナー

ああ、良い点。:それは、2バイトのコストで固定することができますparseInt(c,36)-i>0
リック・ヒッチコック

1
@RickHitchcock parseInt(c,36)>i代わりに2バイトを節約することはできませんか?
ニール

@ニール、当たり前。ジャスティン:ニールが言ったこと。:)
リックヒッチコック

4

R、118114バイト

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

4バイトオフの@Giuseppeに感謝

オンラインでお試しください!

簡単な説明:

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すべてのスペースである場合、これは何も出力しません...しかし、元の答えよりも1バイト短いwhile条件に変更できgrepl()|!Fます。
ジュゼッペ

4

R125 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='')

オンラインでお試しください!

単一の末尾の改行で標準出力に出力し、読み取ります 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='')

オンラインでお試しください!

関数; は標準出力に出力されますが、基本的に上記の私の応答は、文字列を分割するのではなく、文字のリストを受け入れるように移植されているため、「ごまかし」のように感じます。さらに、plannapusの正規表現によるアプローチは非常にきちんとしています!



3

Japt15 14 11 10バイト

Japtの新しい文字列パディングメソッドを使用する最初のチャンスなので、まだ改善の余地があるかもしれません。

y_ùZInZu c

それを試してみてください


説明

stringの暗黙的な入力U

y_

の各列をU関数に渡します。ここZで、は現在の要素(この場合は文字)です。

InZu c

Z大文字(u)に変換し、その文字コード(c)を取得し、減算(u)64(I)します。

ùZ

Zその長さに達するまで、それ自体で開始を埋め込みます。


代替案

y_ùZ9aZn36

それを試してみてください


しかし、節約するために変更ùZすることはできませんでしたp...決して気にしない、それは本当に賢いです
...-ETHproductions

@ETHproductions:私はいくつかの試みをしましたp(編集履歴に1 があるかもしれません)がù、最終的には勝ちました。
シャギー

3

ハスケル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構文よりも何らかの方法で短い必要があるように感じますが、私はそれを見ません。

編集:1バイト削るのを手伝ってくれてありがとう@streetster!toUpper輸入の費用のため、最初は使用しませんでしたData.Charが、それordよりもはるかに短いものも提供することを忘れましたfromEnum

編集2:さらに6バイトを削り、今修正したバグを特定してくれた@Laikoniに感謝します。Haskell配列が包括的であることを忘れたため、25ではなく26を使用しました。それから私は、私が使用することができます気づいたlastの代わりにhead私が使用できるように思われる0:のではなく++[0]

編集3:再びこれら8バイトのライコニに感謝します。実際にそのスペースを忘れていました。何らかの理由でSublime Textはそれなしでひっくり返り、私はそれを削除するのを忘れました。行のリストが許可されていることを知りませんでしたので、ルールをもっと注意深く読むべきでした。


1
入力を小文字にして、AZと同様にAZをチェックしてからmod'ingする必要を回避できますか?
ストリートスター

@streetster haskellでは、toLowerおよびtoUpper関数は、保存するよりも多くの文字を必要とするData.Charをインポートする必要があります。TIO
user1472751

1
Haskellでのゴルフヒントをご覧ください。たとえば、if i>p c then ' ' else cに短縮できますlast$c:[' '|i>p c]
ライコニ

さらに2つ:不要なスペースが[k | あり、行のリストを返すことが許可されているため、を必要としませんunlines。最後に、Haskellチャットルームに興味があるかもしれません。
ライコニ

3

Excel VBA、110バイト

Variant\String範囲から期待されるタイプとして入力を受け取り[A1]、それを使用してVBEイミディエイトウィンドウのアルファベットを降らせる匿名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
クリストフ

1
@クリストフ修正
タイタス



2

ルビー、70 67 74バイト

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

おかげ@TuukkaXいくつかの括弧がドロップされる可能性があることを指摘してに(-3バイト)

残念ながら、元のバージョンが「z」を処理できなかったため、7バイトを追加する必要がありました。

それを呼び出す:

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バイト

文字列がtcolumnのテーブルにあると仮定します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フィドル

Oracle 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]
  紀元前
   c

user1472751のHaskellの回答に直接基づい Nowに一部インスパイアされています。


以前のアプローチ(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

PowerShell122 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

ジャワ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

q42 37バイト

{(+)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のことを知らなかったので、qインタープリターを_入力lowerしてを取得しました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.1212の 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.