Lass ein bisschen Alphabet regnen

54

Alphabet Regen

Die Aufgabe:

Die Grundvoraussetzung besteht darin, die Eingabezeichenfolge auszudrucken und dann jedes Zeichen vertikal zu wiederholen, basierend auf seiner (0-indizierten) Position im Alphabet (ohne Berücksichtigung der Groß- / Kleinschreibung) A-Z. ABefindet sich an Position 0, wird also nicht wiederholt. eBefindet sich an Position 4, wird also 4 Mal wiederholt. Befindet Psich an Position 15, wird also 15 Mal wiederholt. Befindet !sich nicht in A-Z, wird also 0 Mal wiederholt.

Aus Gründen der Übersichtlichkeit wird alles, was außerhalb des Bereichs liegt B-Zb-z, z. B. Ziffern oder Sonderzeichen, nicht wiederholt und daher nur in der ersten Zeile angezeigt.

Das ist , also ist die kürzeste Lösung in jeder Sprache der Gewinner.

Eingang:

  • Die Eingabe erfolgt im standardmäßigen druckbaren ASCII-Zeichensatz von 32 bis 126 ~.
  • Die Eingabezeichenfolge ist mindestens 1 Zeichen lang.
  • Es wird kein führendes oder nachfolgendes Leerzeichen geben.
  • Sie können Eingaben als Zeichenfolge ( "hello") oder Liste von Zeichen ( ["h", "e", "l", "l", "o"]) übernehmen.

Beispiele:

Eingabe von aaaagibt:

aaaa

Eingabe von abcdagibt:

abcda
 bcd
  cd
   d

Eingabe von Programming Puzzles & Code Golf!, ergibt:

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

Eingabe von ~|[abc<0>cba]|~, ergibt:

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

Anmerkungen:

  • Es gelten Standardlücken
  • output kann eine Liste von Strings sein, aber:
  • Überflüssige nachgestellte Zeilenumbrüche sind nicht zulässig (einzelne \nZeilen in der letzten Zeile sind akzeptabel).
  • Die Ausgabe kann eine Liste mit Listen von Zeichen sein, solange es so aussieht, als würde es Zeichen regnen
  • keine führende newline
  • Für unsere nordischen Benutzer, die ein paar zusätzliche Buchstaben in ihrem "AZ" -Alphabet haben, steht es uns frei, sie zu unterstützen, aber dies ist nicht Teil der Herausforderung
Streetster
quelle
2
Ist eine einzelne Führung \n akzeptabel?
Lynn
@Lynn, keine führenden Zeilenumbrüche, die erste Zeile sollte die Eingabezeichenfolge / Zeichenliste sein - ich aktualisiere den Beitrag!
Streetster
18
FWIW, ich denke , dass sie eher wie Eiszapfen aussehen als regen
caird coinheringaahing
@ Cairdcoinheringaahing klingt fast festlich
Pureferret
:( Nur Nordic?
ASCII

Antworten:

22

6502 Maschinencode (C64), 113 Bytes

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

Bildschirmfoto

Online-Demo

Verwendung: sys49152,"[string]" zB sys49152,"Programming Puzzles & Code Golf!".

Wichtig: Wenn das Programm von der Festplatte geladen wurde (wie in der Online-Demo), geben Sie zuerst einen newBefehl aus! Dies ist notwendig, weil das Laden eines Maschinenprogramms einige C64 BASIC-Zeiger in den Papierkorb wirft.

Hinweis: Der C64 befindet sich standardmäßig in einem Modus ohne Kleinbuchstaben. Um eine gemischte Zeichenfolge eingeben zu können, müssen Sie zuerst in den Kleinbuchstabenmodus wechseln, indem Sie SHIFT+ drücken CBM.


Erläuterung

Hier ist eine kommentierte Auflistung der Demontage:

         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
quelle
3
c64 maschinencode. Ich bin beeindruckt.
Dschoni
@Dschoni danke, aber es ist immer noch einfacher Code (und es macht Spaß, für mich!) - Sie sollten einen Blick auf die Demo-Szene für wirklich beeindruckende C64-Werke werfen;)
Felix Palmen
Wenn wir diese weiterhin erhalten, möchten wir möglicherweise Links zu einem JavaScript C64-Emulator einrichten, damit die Benutzer sehen können, wie sie ausgeführt werden.
trlkly
1
@trlkly Ich habe einen solchen Link in meinem Beitrag, klicken Sie auf "Online-Demo";)
Felix Palmen
14

05AB1E , 13 12 Bytes

,εDlAsk×}ζ»,

Probieren Sie es online!

Erläuterung

,             # 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
quelle
32
Müssen Sie den Index des Zeichens in Kleinbuchstaben erhalten? nur Askdafür
Uriel
8

Pyth, 12 10 9 Bytes

.tm+*xGr0

Testsuite.

Erläuterung:

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

j.t*VmxGr0d

(mit nachfolgender Newline)

Testsuite.

Erläuterung:

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.
quelle
Die Ausgabe kann eine Liste vonj
Zeichenlisten sein
Ah, du hast recht! Ich behielt es bei, weil die 12-Byte-Version eine Zeile wörtlich druckte und ich die Formate nicht so mischen konnte, und ich vergaß, dass ich das jetzt entfernen konnte, da alles transponiert ist. Vielen Dank!
Steven H.
8

Python 3 , 83 Bytes

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

Probieren Sie es online! Nimmt eine Liste von Zeichen. Gibt eine Liste mit Listen von Zeichen zurück.

Python 2 , 90 Bytes

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

Probieren Sie es online! Nimmt eine Zeichenfolge. Gibt eine Zeichenfolge zurück.

Lynn
quelle
7

Mathematica, 115 89 Bytes

Es dauert als inputeine Liste von Zeichen [{"a", "b", "c", "d", "a"}] und gibt eine Liste der Listen von Zeichen

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

Probieren Sie es online!

-26 Bytes von Mischa Lawrow

-5 Bytes von user202729

Wenn Sie die Ausgabe jedoch so sehen möchten, wie sie im Testfall vorliegt, versuchen Sie diesen (128 Byte) Code.
Versuchen Sie es online!

J42161217
quelle
Für zukünftige Leser: Der Teil "Diese Antwort funktioniert nur auf Mathematica ..." ist etwas irreführend, das Problem ist, dass Mathematica nur Unicode-Zeichen im Notebook-Modus (REPL) unterstützt. Im Skriptmodus werden nur ASCII- und Sonderzeichen verstanden, die in ASCII konvertiert wurden (z. B. (3 Byte) -> \[Infinity](11 Byte)).
User202729
@ user202729 ok, ich bearbeite und adressiere Leute, um deinen Kommentar zu lesen. Danke
J42161217
Golfvorschlag für Mathematica (Skriptmodus): \[Infinity](11 Bytes) können durch Infinity(8 Bytes) oder \:221e(6 Bytes) ersetzt werden. Die letzte ist die Standarddarstellung von Sonderzeichen ohne Namen. (obwohl es nicht der Hauptteil ist)
User202729
Das können wir Infinityganz vermeiden . Der problematische Teil ist If[(d=Min@Position[Alphabet[],If[UpperCaseQ@#,ToLowerCase@#,#]])==∞,1,d]und wir können dies ändern Max@Position[Alphabet[]/."a"->#,#|ToLowerCase@#]. (Wenn {#,b,c,d,...,y,z}wir in der Liste suchen, werden wir garantiert #mindestens einmal finden.)
Misha Lavrov
@ Mischa Lawrow sehr schön. behoben!
J42161217
6

Dyalog APL , 27 22 Bytes

5 Bytes gespart dank @ Adám

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

Probieren Sie es online!

Wie?

⍴¨⍨ - Form jedes Saiblings auf Länge von

    1⌈ - mindestens eine oder

    ⎕A⍳819⌶⍨∘1 - Index des Zeichens in Großbuchstaben

        27| - Modulo 27

- Auf eine Matrix abflachen

- und transponieren

Uriel
quelle
@Adám danke! aktualisiert
Uriel
5

Python, 105 103 Bytes

2 Bytes gespart dank @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()

Probieren Sie es online!

Uriel
quelle
103 Bytes
TFeld
@TFeld schöner Fang, danke!
Uriel
5

Python 2 , 111 106 99 98 97 87 93 Bytes

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

Probieren Sie es online!

TFeld
quelle
whilekann durch ersetzt werden exec, um einige Bytes zu sparen, ikann mit 65 beginnen, um weitere zu speichern , um 87 Bytes zu erreichen
Rod
Das OP sagt, dass überflüssige nachgestellte Zeilenumbrüche nicht zulässig sind , aber Ihr Code druckt mehrere davon, wenn die Eingabe zoder nicht enthält Z.
Lynn
@Lynn Behoben, ich habe vergessen, die execÄnderung zu überprüfen ...
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;}

Probieren Sie es online!

Nejosan
quelle
2
Willkommen bei PPCG und schöne erste Antwort. Sie können Ihren Code mit ein paar Tricks verkürzen. Hier ist eine bessere Version Ihres Codes: Probieren Sie es online aus! .
Ian H.
Vielen Dank für die Kommentare, ich nahm an, dass mein Code von selbst ausführbar sein musste, also baute ich ihn auf dieser Annahme auf! Vielen Dank für den Kommentar und die Betreuung.
Nejosan
2
Wenn Sie weitere Tricks zum Golfspielen in C # suchen, schauen Sie sich diesen Beitrag an oder werfen Sie einen Blick auf die vorhandenen C # -Antworten. Viel Spaß beim Golfen!
Ian H.
Gute Antwort. Mach weiter :)
aloisdg sagt Reinstate Monica
1
Hallo, willkommen bei PPCG! Tolle erste Antwort, besonders jetzt, wo es Golf spielt. +1 von mir. Übrigens sind es derzeit 180 Bytes, nicht 162. Der erforderliche Import using System.Linq;ist leider obligatorisch, um die Byteanzahl zu erhöhen (oder Sie sollten Maxzu System.Linq.Maxund Selectzu wechseln System.Linq.Max, was höher wäre als einfach nur using System.Linq;einmal.). Nochmals willkommen, und genießen Sie Ihren Aufenthalt. Oh, und ich sehe @ IanH. Bereits erwähnte Tipps zum Golfen in C #. Tipps zum Golfen in <allen Sprachen> könnten ebenfalls interessant sein.
Kevin Cruijssen
5

Bash, 78 , 76, 71 Bytes

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

Abhängig von der Sortierung (Standardeinstellung LC_ALL) können weitere Bytes eingespart werden

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

Probieren Sie es online

Nahuel Fouilleul
quelle
4

Perl 5 , 43 Bytes

41 Byte Code + 2 für -nl.

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

Probieren Sie es online!

Dom Hastings
quelle
1
Schleife für [_0-9] Zeichen, vielleicht s/["-$c]/ /giund -lnicht benötigt
Nahuel Fouilleul
@NahuelFouilleul Ahh, ja, ich war in den Testfällen etwas zu schnell. Sie sollten dem OP hinzugefügt werden! :) Vielen Dank! +4 :(
Dom Hastings
Mein Vorschlag funktioniert nicht für Zeichen zwischen 32 und 126 (nicht Alpha größer als Z)
Nahuel Fouilleul
@NahuelFouilleul Kann keinen kürzeren Weg finden, der alle Anforderungen erfüllt ... Ich werde weiterspielen ...
Dom Hastings
4

JavaScript (ES6), 87 78 76 Bytes

-9 Bytes dank @RickHitchcock .
-2 Bytes dank @Neil .

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

Nimmt Eingaben als Zeichenfolge und gibt sie mit einer nachgestellten Zeile zurück.

Testfälle

Justin Mariner
quelle
76 Bytes (eine nachgestellte neue Zeile): f=(s,i=10)=>s.trim()&&s+'newline'+f(s.replace(/./g,c=>parseInt(c,36)-i?c:" "),i+1)
Rick Hitchcock
@RickHitchcock Das scheint eine Endlosschleife für eine Eingabezeichenfolge zu sein, die Zahlen enthält: Probieren Sie es online aus! . Die Idee, Schritt für Schritt zu wechseln, sist allerdings sehr schön.
Justin Mariner
Ahh, guter Punkt. Das kann auf Kosten von 2 Bytes behoben werden:parseInt(c,36)-i>0
Rick Hitchcock
1
@RickHitchcock Kannst du nicht parseInt(c,36)>istattdessen 2 Bytes speichern?
Neil
@ Neil, duh. Justin: Was Neil gesagt hat. :)
Rick Hitchcock
4

R 118 114 Bytes

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

Danke an @ Giuseppe für die 4 Bytes

Probieren Sie es online!

Kurze Erklärung:

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
quelle
ohhh, warte, potenzielles Problem: Wenn aalle Leerzeichen vorhanden sind, wird nichts gedruckt ... Sie können jedoch die whileBedingung ändern , grepl()|!Fdie immer noch ein Byte kürzer ist als Ihre ursprüngliche Antwort.
Giuseppe
4

R , 125 123 Bytes

Vom Plannapus überfordert

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

Probieren Sie es online!

Druckt mit einer einzelnen nachgestellten Zeile auf Standardausgabe und liest aus stdin() .

Lassen Sie es uns zusammenfassen:

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
}

Alternative Antwort, 106 Bytes

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

Probieren Sie es online!

Funktion; druckt auf stdout, aber es ist im Grunde meine obige Antwort, um eine Liste von Zeichen zu akzeptieren, anstatt die Zeichenfolge zu teilen, so dass ich das Gefühl habe, dass es "betrügt". Außerdem ist der Ansatz von Plannapus mit Regex ziemlich ordentlich!

Giuseppe
quelle
4

Octave / MATLAB, 74 66 Bytes

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

Probieren Sie es online!

Luis Mendo
quelle
3

Japt , 15 14 11 10 Bytes

Erste Chance, mit den neuen Saitenpolstermethoden von Japt zu spielen, sodass möglicherweise noch Verbesserungspotenzial besteht.

y_ùZInZu c

Versuch es


Erläuterung

Implizite Eingabe eines Strings U.

y_

Übergeben Sie jede Spalte Ueiner Funktion, wobei Zin diesem Fall das aktuelle Element (oder der Buchstabe) ist.

InZu c

Konvertiere Zin Großbuchstaben ( u), erhalte den Zeichencode ( c) und subtrahiere ( u) 64 ( I).

ùZ

Füllen Sie den Anfang Zmit sich selbst auf, bis er diese Länge erreicht hat.


Alternative

y_ùZ9aZn36

Versuch es

Zottelig
quelle
Aber könnten Sie nicht ändern ùZ, pum ein B ...
egal
@ETHproductions: Ich habe ein paar Versuche mit p(es könnte 1 in der Bearbeitungshistorie geben) gemacht, aber ùam Ende gewonnen.
Shaggy
3

Haskell , 137 136 127 119 Bytes

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

Probieren Sie es online!

Ziemlich lang, aber ich kann mir keine Möglichkeit vorstellen, es weiter zu verkürzen. Ich habe das Gefühl, dass es einen Weg geben muss, der kürzer ist als die If-Then-Syntax, aber ich sehe es nicht.

EDIT: Danke @streetster, dass du mir geholfen hast, ein Byte zu entfernen! toUpperAnfangs habe ich wegen der Kosten für den Import nicht verwendet , Data.Charaber ich habe vergessen, dass es auch bietet, ordwas viel kürzer ist alsfromEnum

EDIT 2: Danke an @Laikoni für das Abschneiden von weiteren 6 Bytes und das Identifizieren eines Fehlers, den ich jetzt behoben habe. Ich habe 26 statt 25 verwendet, weil ich vergessen habe, dass Haskell-Arrays inklusive sind. Dann bemerkte ich, dass ich lastanstelle headdessen verwenden konnte, was mir ermöglichen würde, 0:anstatt zu verwenden ++[0].

EDIT 3: Nochmals vielen Dank Laikoni für diese 8 Bytes. Ich hatte diesen Raum tatsächlich vergessen. Aus irgendeinem Grund wird der erhabene Text ohne ihn ausgeblendet und ich habe vergessen, ihn zu entfernen. Mir war nicht bewusst, dass Zeilenlisten erlaubt waren, ich hätte die Regeln genauer lesen sollen.

user1472751
quelle
1
Können Sie die Eingabe in Kleinbuchstaben schreiben, um zu vermeiden, dass sowohl AZ als auch az überprüft und dann geändert werden müssen?
Streetster
@streetster In haskell müssen für die Funktionen toLower und toUpper Data.Char importiert werden, was mehr Zeichen kostet als es spart. TIO
user1472751
1
Vielleicht möchten Sie einen Blick auf die Tipps zum Golfen in Haskell werfen . ZB if i>p c then ' ' else ckann auf gekürzt werden last$c:[' '|i>p c].
Laikoni
Zwei weitere Dinge: Es gibt einen unnötigen Platz in [k | und das Zurückgeben einer Liste von Zeilen ist zulässig, sodass Sie das nicht benötigen unlines. Vielleicht interessiert dich auch unser Chatraum in Haskell .
Laikoni
3

Excel VBA, 110 Bytes

Anonymes VBE-Direktfenster Funktion, die Eingaben wie erwartet Variant\Stringaus dem Bereich entnimmt [A1]und das Alphabet im VBE-Direktfenster regnet.

?[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

Beispiel-E / A

[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
quelle
Brutal!!! Es ?A1:...
scheint,
@ LS_ᴅᴇᴠ, da die []angibt, dass die enthaltene Zeichenfolge für ein Objekt in / on / as Arbeitsmappe ausgewertet werden soll, wird der [A1]Aufruf möglicherweise nicht auf reduziert, A1da dies die ersten Eingaben aus dem Bereich nicht annimmt und druckt [A1]. Stattdessen bleibt nur eine leere Zeile und alle nachfolgenden Zeilen werden gedruckt
Taylor Scott
Ups, du hast recht ... Hab das nicht bemerkt!
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
";

benötigt PHP <7. Laufen Sie als Pipe mit -nRoder versuchen Sie es online .

Titus
quelle
@ Shaggy danke für den Hinweis. Es ist jetzt komplett.
Titus
+1 für $c=A;!$c[1];$c++. Schön! Leider extraneous trailing newlines are not allowed (single \n on final line is acceptable). Es schlägt also für alle Zeichenfolgen fehl, die nichts enthalten z.
Christoph
1
@Christoph behoben
Titus
3

Bash + sed, 37

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

Probieren Sie es online aus .

Digitales Trauma
quelle
es sieht so aus, als würde es Zeichen im Alphabet 1-zu-oft
wiederholen
@streetster Ich denke, es ist jetzt behoben.
Digitales Trauma
2

C (gcc) 189 Bytes

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

Probieren Sie es online!

Felix Palmen
quelle
Versuchen Sie es puts("");stattputchar(10)
Conor O'Brien
178 Bytes
Ceilingcat
2

Ruby, 70 67 74 Bytes

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

Dank @TuukkaX für den Hinweis, dass einige Parens entfernt werden konnten (-3 Bytes)

Leider musste ich dann 7 Bytes hinzufügen, da die Originalversion "z" nicht verarbeiten konnte.

Nennen Sie es:

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
quelle
Die Klammern bei der Lambda-Definition können entfernt werden. +1.
Yytsi
2

Oracle SQL, 186 Bytes

Angenommen, die Zeichenfolge befindet sich in einer Tabelle tin der Spalte 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-Geige

Oracle 11g R2 Schema Setup :

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

Abfrage 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

Ergebnisse :

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

Haskell , 98 Bytes

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

Probieren Sie es online!

Anwendungsbeispiel: f "[Abc]"ergibt eine Liste der Zeilen: ["[Abc]"," bc "," c "]. VerwendenputStr.unlines.f $ "[Abc]" für ziemlich-gedruckte Ausgabe:

[ABC]
  bc
   c

Teilweise inspiriert von Now, direkt basierend auf der Haskell-Antwort von user1472751 .


Vorheriger Ansatz ( 100 bis 99 Byte)

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

Probieren Sie es online!

Laikoni
quelle
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''

Probieren Sie es online!

Kurz , weil PowerShell dynamisch zwischen [char]und umwandeln kann [int], aber lang, weil überflüssige Leerzeichen entfernt und berechnet werden, ob ein Leerzeichen oder ein Zeichen ausgegeben werden soll.

Bugfix dank Beatcracker.

AdmBorkBork
quelle
Leider schlägt dies im ~|[abc<0>cba]|~Testfall fehl . Versuchen Sie param($a)$a;(1..25|%{$i=$_;(-join([char[]]$a|%{(' ',$_)[$_-match'[a-z]'-and[math]::Max(0,($_-bor32)-96-$i)]})).TrimEnd()})-ne''
Folgendes
@beatcracker Guter Fang. Das ist eine clevere Art, mit dem Vergleich umzugehen. Vielen Dank!
AdmBorkBork
2

Java 8, 151 147 144 143 139 Bytes

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

Erläuterung:

Probieren Sie es hier aus.

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
quelle
2

q , 42 37 Bytes

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

-5 danke an streetster!


alte Lösung + Erklärung:

{(+)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
kritzeln
quelle
1
{(+)max[m]$(m:1+mod[.Q.a?(_)x]26)#'x}für 37 kann ich mich nicht erinnern, wie ich es beim Erstellen der Frage gelöst habe, wahrscheinlich aber sehr ähnlich!
Streetster
@streetster, danke! Aktualisiert. _Ich wusste nichts über k , tippte lowerden q-Interpreter ein und bekam k){$[~t&77h>t:abs@@x;.z.s'x;19<t;.z.s@. x;~t in 10 11h;'`type;_x]}. daher meine antwort in q haha
scrawl
1

SOGL V0.12 , 12 11 Bytes

ā,{Z⁴UW1Χ∙┼

Probieren Sie es hier aus!

Erläuterung:

ā            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
quelle