Zrób deszcz alfabetu


54

Deszcz alfabetu

Zadanie:

Podstawową przesłanką jest wydrukowanie ciągu wejściowego, a następnie powtórzenie każdego znaku pionowo, w oparciu o jego (indeksowaną 0) pozycję w alfabecie (bez rozróżniania wielkości liter) A-Z. Ajest w miejscu 0, więc się nie powtarza, ejest w pozycji 4, więc jest powtarzane 4 razy, Pjest w pozycji 15, więc jest powtarzane 15 razy, !nie jest w nim, A-Zwięc jest powtarzane 0 razy itp.

Dla jasności wszystko, co wykracza poza zakres B-Zb-z, na przykład cyfry lub znaki specjalne, nie będzie powtarzane, a zatem pojawi się tylko w pierwszym wierszu.

To jest , więc zwycięzcą jest najkrótsze rozwiązanie w każdym języku.

Wejście:

  • Dane wejściowe będą znajdować się w standardowym zestawie znaków do wydruku ASCII, od 32 do 126 ~.
  • Łańcuch wejściowy będzie miał 1 znak lub więcej.
  • Nie będzie żadnych początkowych ani końcowych białych znaków.
  • Możesz wziąć dane wejściowe jako ciąg znaków ( "hello") lub listę znaków ( ["h", "e", "l", "l", "o"])

Przykłady:

Wejście aaaadaje:

aaaa

Wejście abcdadaje:

abcda
 bcd
  cd
   d

Wejście Programming Puzzles & Code Golf!, daje:

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

Wejście ~|[abc<0>cba]|~, daje:

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

Uwagi:

  • obowiązują standardowe luki
  • wyjściem może być lista ciągów znaków, ale:
  • obce końcowe znaki nowej linii są niedozwolone (dopuszczalne jest pojedyncze \nw ostatniej linii)
  • wyjściem może być lista list znaków, o ile wygląda na to, że pada deszcz
  • brak wiodącej nowej linii
  • dla naszych skandynawskich użytkowników, którzy mają kilka dodatkowych liter w swoim alfabecie „AZ”, zachęcamy do ich wspierania, ale nie jest to część wyzwania

2
Czy jeden prowadzący jest do \n przyjęcia?
Lynn,

@ Lynn, brak wiodących znaków nowego wiersza, pierwszy wiersz powinien być ciągiem znaków / listą znaków - zaktualizuję wpis!
streetster,

18
FWIW, myślę, że wyglądają bardziej jak sople lodu niż deszcz
caird coinheringaahing 10.10.17

@cairdcoinheringaahing brzmi prawie świątecznie
Pureferret

:( Just Nordic?
Tylko ASCII

Odpowiedzi:


22

Kod maszynowy 6502 (C64), 113 bajtów

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

zrzut ekranu

Demo online

Zastosowanie: sys49152,"[string]" np sys49152,"Programming Puzzles & Code Golf!".

Ważne: Jeśli program został załadowany z dysku (jak w wersji demonstracyjnej online), newnajpierw wydaj polecenie! Jest to konieczne, ponieważ ładowanie programu maszynowego niszczy niektóre wskaźniki C64 BASIC.

Uwaga: C64 jest domyślnie w trybie bez małych liter - aby móc wprowadzić ciąg znaków składający się z małych liter, najpierw przełącz na tryb małych liter, naciskając SHIFT+ CBM.


Wyjaśnienie

Oto skomentowana lista dezasemblacji:

         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
kod maszynowy c64. Jestem pod wrażeniem.
Dschoni

@Dschoni dzięki, ale wciąż jest to prosty kod (i dla mnie to świetna zabawa!) - powinieneś rzucić okiem na scenę demonstracyjną naprawdę imponujących dzieł C64;)
Felix Palmen

Jeśli nadal będziemy je otrzymywać, możemy chcieć skonfigurować linki do emulatora JavaScript C64, aby ludzie mogli zobaczyć, jak działają.
trlkly 12.10.17

1
@trlkly Mam taki link w swoim zgłoszeniu, kliknij „Online demo”;)
Felix Palmen

14

05AB1E , 13 12 bajtów

,εDlAsk×}ζ»,

Wypróbuj online!

Wyjaśnienie

,             # 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
Chcesz uzyskać indeks znaków małymi alfabetami? tylko Askdla tego
Uriel,

8

Pyth, 12 10 9 bajtów

.tm+*xGr0

Zestaw testowy.

Wyjaśnienie:

.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 bajtów:

j.t*VmxGr0d

(z końcowym znakiem nowej linii)

Zestaw testowy.

Wyjaśnienie:

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

wyjściem może być lista list postaci, o ile wygląda na to, że pada deszcz - Stąd nie potrzebujeszj
Mr. Xcoder

Ach, masz rację! Trzymałem go, ponieważ 12-bajtowa wersja drukowała dosłownie jedną linię i nie mogłem mieszać takich formatów i zapomniałem, że mogę to usunąć teraz, gdy wszystko jest transponowane. Dzięki!
Steven H.,

8

Python 3 , 83 bajty

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

Wypróbuj online! Pobiera listę znaków. Zwraca listę list znaków.

Python 2 , 90 bajtów

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

Wypróbuj online! Bierze sznurek. Zwraca ciąg.


7

Mathematica, 115 89 bajtów

To trwa jak inputna liście znaków [{"a", "b", "c", "d", "a"}] i wyświetla listę list znaków

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

Wypróbuj online!

-26 bajtów od Misza Ławrow

-5 bajtów od user202729

ale jeśli chcesz zobaczyć dane wyjściowe takie jak w przypadku testowym, wypróbuj ten kod (128 bajtów)
Wypróbuj online!


Dla przyszłych czytelników: Część „ta odpowiedź działa tylko na Mathematica ...” jest nieco myląca, problem polega na tym, że Mathematica obsługuje tylko znaki Unicode w trybie notebooka (REPL). W trybie skryptowym rozumie tylko ASCII i znaki specjalne przekonwertowane na ASCII (np. (3 bajty) -> \[Infinity](11 bajtów)).
user202729,

@ user202729 ok, będę edytować i zwracać się do ludzi o przeczytanie twojego komentarza. dzięki
J42161217 10.10.17

Sugestia golfa dla Mathematica (tryb skryptu): \[Infinity](11 bajtów) można zastąpić Infinity(8 bajtów) lub \:221e(6 bajtów). Ostatni to domyślna reprezentacja znaków specjalnych bez nazw. (chociaż nie jest to główna część)
202729

Możemy Infinitycałkowicie tego uniknąć . Problematyczne jest to, If[(d=Min@Position[Alphabet[],If[UpperCaseQ@#,ToLowerCase@#,#]])==∞,1,d]że możemy to zmienić Max@Position[Alphabet[]/."a"->#,#|ToLowerCase@#]. (Przeszukując listę {#,b,c,d,...,y,z}, gwarantujemy, że znajdziemy #przynajmniej raz.)
Misza Ławrow

@MishaLavrov bardzo miło. naprawione!
J42161217,

6

Dyalog APL , 27 22 bajtów

5 bajtów zapisanych dzięki @ Adám

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

Wypróbuj online!

W jaki sposób?

⍴¨⍨ - uformuj każdy znak na długość

    1⌈ - co najmniej jeden lub

    ⎕A⍳819⌶⍨∘1 - indeks wielkich liter alfabetu

        27| - moduł 27

- spłaszczyć do matrycy

- i transponować



@ Adám dzięki! zaktualizowano
Uriel,



5

Python 2 , 111 106 99 98 97 87 93 bajtów

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

Wypróbuj online!


whilemożna go zastąpić, execaby zaoszczędzić kilka bajtów, imożna zacząć od 65, aby zaoszczędzić jeden i osiągnąć 87 bajtów
Rod

OP twierdzi, że obce końcowe znaki nowej linii są niedozwolone , ale twój kod drukuje kilka z nich, gdy dane wejściowe nie zawierają zlub Z.
Lynn,

@ Lynn Naprawiono, zapomniałem dokładnie sprawdzić execzmianę ...
TFeld,

5

C # (.NET Core) , 162 bajty

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

Wypróbuj online!


2
Witamy w PPCG i fajna pierwsza odpowiedź. Możesz skrócić swój kod za pomocą kilku sztuczek. Oto twoja wersja kodu dla golfistów : Wypróbuj online! .
Ian H.,

Dzięki za komentarze, założyłem, że mój kod musi być wykonywalny sam, więc zbudowałem go na tym założeniu! Dzięki za komentarz i mentoring.
Nejosan,

2
Jeśli chcesz znaleźć więcej sztuczek na temat gry w golfa w C #, spójrz na ten post lub spójrz na istniejące odpowiedzi w C #. Miłej gry w golfa!
Ian H.,

Niezła odpowiedź. Kontynuuj :)
aloisdg mówi Przywróć Monikę

1
Cześć, witamy w PPCG! Świetna pierwsza odpowiedź, zwłaszcza teraz, gdy gra w golfa. +1 ode mnie Btw, obecnie jest to 180 bajtów, a nie 162. Wymagany import using System.Linq;jest niestety obowiązkowy, aby dodać do liczby bajtów (lub powinieneś zmienić Maxna System.Linq.Maxi Selectna System.Linq.Max, który byłby wyższy niż tylko using System.Linq;raz). Ponownie witamy i życzymy miłego pobytu. Och, i widzę @IanH. wspomniano już Porady dotyczące gry w golfa w C #. Porady dotyczące gry w golfa w <wszystkich językach> mogą być również interesujące.
Kevin Cruijssen

5

Bash, 78 , 76 71 bajtów

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

W zależności od sortowania (domyślnie LC_ALL) można zapisać więcej bajtów

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

Wypróbuj online


4

Perl 5 , 43 bajtów

41 bajtów kodu + 2 dla -nl.

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

Wypróbuj online!


1
zapętlić znaki [_0-9], być może s/["-$c]/ /gii -lniepotrzebne
Nahuel Fouilleul 10.10.17

@NahuelFouilleul Ahh, tak, byłem trochę za szybki w testach. Powinny zostać dodane do PO! :) Dzięki! +4 :(
Dom Hastings,

moja sugestia nie działa na znaki między 32 a 126 (nie alfa większe niż Z)
Nahuel Fouilleul 10.10.17

@NahuelFouilleul Nie mogę znaleźć krótszej drogi, która spełniałaby wszystkie wymagania ... Będę nadal grać ...
Dom Hastings,

4

JavaScript (ES6), 87 78 76 bajtów

-9 bajtów dzięki @RickHitchcock .
-2 bajty dzięki @Neil .

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

Pobiera dane wejściowe jako ciąg znaków i zwraca jeden znak nowej linii.

Przypadki testowe


76 bajtów (jedna ostatnia nowa linia): f=(s,i=10)=>s.trim()&&s+'newline'+f(s.replace(/./g,c=>parseInt(c,36)-i?c:" "),i+1)
Rick Hitchcock

@ RickHitchcock To wydaje się być nieskończoną pętlą dla ciągu wejściowego zawierającego liczby: Wypróbuj online! . Pomysł zmiany krok po kroku sjest naprawdę fajny.
Justin Mariner,

Ahh, dobra uwaga. Można to naprawić kosztem 2 bajtów:parseInt(c,36)-i>0
Rick Hitchcock,

1
@RickHitchcock Czy nie można parseInt(c,36)>izamiast tego użyć do zapisania 2 bajtów?
Neil,

@Neil, duh. Justin: Co powiedział Neil. :)
Rick Hitchcock

4

R, 118 114 bajtów

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

Dzięki @Giuseppe za te 4 bajty wyłączone

Wypróbuj online!

Krótkie wyjaśnienie:

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

ohhh, czekaj, potencjalny problem: jeśli asą wszystkie spacje, to nic nie wydrukuje ... ale możesz zmienić whilestan, w grepl()|!Fktórym bajt jest nadal krótszy niż oryginalna odpowiedź.
Giuseppe,

4

R , 125 123 bajtów

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

Wypróbuj online!

Drukuje na standardowe wyjście z jednym końcowym znakiem nowej linii i czyta z stdin().

Rozbijmy to:

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
}

Alternatywna odpowiedź, 106 bajtów

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

Wypróbuj online!

Funkcjonować; wypisuje na standardowe wyjście, ale w zasadzie moja powyższa odpowiedź została przeniesiona, aby zaakceptować listę znaków zamiast rozdzielać ciąg, więc mam wrażenie, że to „oszustwo”. Co więcej, podejście Plannapusa z wyrażeniem regularnym jest całkiem fajne!



3

Japt , 15 14 11 10 bajtów

Pierwsza szansa, aby zagrać z nowymi metodami wypełniania strun Japt, aby nadal było miejsce na ulepszenia.

y_ùZInZu c

Spróbuj


Wyjaśnienie

Domniemane wprowadzanie ciągu U.

y_

Przekaż każdą kolumnę Uprzez funkcję, gdzie Zjest bieżący element (lub litera, w tym przypadku).

InZu c

Konwertuj Zna wielkie litery ( u), uzyskaj jego charcode ( c) i odejmij ( u) 64 ( I).

ùZ

Padaj początkiem Zsamego siebie, aż osiągnie tę długość.


Alternatywny

y_ùZ9aZn36

Spróbuj


Ale czy nie mógłbyś zmienić ùZna poszczędzanie b ... nieważne, to naprawdę sprytne ...
ETHproductions

@ETHproductions: Podjąłem kilka prób z p( może być 1 w historii edycji), ale ostatecznie ùwygrałem.
Kudłaty,

3

Haskell , 137 136 127 119 bajtów

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

Wypróbuj online!

Dość długo, ale nie mogę wymyślić żadnego sposobu, aby go skrócić. Wydaje mi się, że musi być jakiś sposób krótszy niż składnia if-then, ale nie widzę tego.

EDYCJA: Dzięki @streetster za pomoc w goleniu jednego bajtu! Z początku nie korzystałem toUpperz powodu kosztów importu, Data.Charale zapomniałem, że zapewnia również ordznacznie krótszy niżfromEnum

EDYCJA 2: Podziękowania dla @Laikoni za wygolenie kolejnych 6 bajtów i zidentyfikowanie błędu, który teraz naprawiłem. Użyłem 26 zamiast 25, ponieważ zapomniałem, że tablice Haskell są włącznie. Potem zauważyłem, że mogę użyć lastzamiast tego, headco pozwoliłoby mi użyć 0:zamiast ++[0].

EDYCJA 3: Jeszcze raz dziękuję Laikoni za te 8 bajtów. Właściwie to zapomniałem o tej przestrzeni. Z jakiegoś powodu Sublime Text wyrzuca się bez niego i zapomniałem go usunąć. Nie wiedziałem, że listy linii są dozwolone, powinienem był uważniej przeczytać zasady.


1
Czy umiesz wpisywać małe litery, aby uniknąć konieczności sprawdzania AZ, a także az, a następnie modowania?
streetster,

@streetster W haskell funkcje toLower i toUpper wymagają importowania pliku Data.Char, który kosztuje więcej znaków niż zapisuje. TIO
1472751 10.10.17

1
Warto zapoznać się ze wskazówkami dotyczącymi gry w golfa w Haskell . Np. if i>p c then ' ' else cMożna skrócić last$c:[' '|i>p c].
Laikoni

Dwie dodatkowe rzeczy: Wewnątrz jest niepotrzebne miejsce [k | i dozwolone jest zwracanie listy wierszy, więc nie potrzebujesz unlines. Wreszcie, możesz być zainteresowany naszym czatem Haskell .
Laikoni

3

Excel VBA, 110 bajtów

Anonimowa natychmiastowa funkcja okna VBE Funkcja, która pobiera dane wejściowe zgodnie z oczekiwaniami Variant\Stringz zakresu [A1]i wykorzystuje je do wywołania alfabetu w bezpośrednim oknie 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

Próbki we / wy

[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 

Brutalny!!! Wydaje się, że można również wykonać?A1:...
LS_ᴅᴇᴠ

@ LS_ᴅᴇᴠ, niestety, ponieważ []wskazuje, że zawarty ciąg powinien zostać przetworzony na obiekt w / on / jako skoroszyt, [A1]wywołanie może nie zostać zredukowane do A1- ponieważ nie pobierze i nie wydrukuje początkowych danych wejściowych z zakresu [A1]; raczej pozostawi pustą linię i wszystkie kolejne linie zostaną wydrukowane
Taylor Scott

Ups, masz rację ... Nie zauważyłem tego!
LS_ᴅᴇᴠ

3

PHP, 69 78 77 85 + 1 bajty

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

wymaga PHP <7. Uruchom jako potok z -nRlub spróbuj online .


@ Shaggy dzięki za wskazanie. To jest teraz kompletne.
Tytus

+1 dla $c=A;!$c[1];$c++. Niezłe! Niestety extraneous trailing newlines are not allowed (single \n on final line is acceptable). Tak więc zawiedzie dla wszystkich ciągów niezawierających z.
Christoph

1
@Christoph naprawiono
Tytus



2

Rubinowy, 70 67 74 bajtów

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

Dzięki @TuukkaX za wskazanie, że niektóre pareny mogą zostać upuszczone (-3 bajty)

Niestety musiałem wtedy dodać 7 bajtów, ponieważ oryginalna wersja nie obsługiwała „z”.

Nazywając to:

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

Nawiasy w definicji lambda można usunąć. +1.
Yytsi,

2

Oracle SQL, 186 bajtów

Zakłada, że ​​ciąg będzie w tabeli tw kolumnie 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

Konfiguracja schematu Oracle 11g R2 :

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

Zapytanie 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

Wyniki :

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


2

Haskell , 98 bajtów

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

Wypróbuj online!

Przykładowe zastosowania: f "[Abc]"dostarcza listę linii: ["[Abc]"," bc "," c "]. Użyj putStr.unlines.f $ "[Abc]"dla ładnego wydruku:

[ABC]
  pne
   do

Częściowo zainspirowany przez Now bezpośrednio na podstawie odpowiedzi Haskell użytkownika 1472751 .


Poprzednie podejście ( 100 99 bajtów)

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

Wypróbuj online!


2

PowerShell , 122 127 bajtów

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

Wypróbuj online!

Krótkie dzięki temu, w jaki sposób PowerShell może dynamicznie rzutować pomiędzy [char]i [int], ale długie ze względu na usunięcie zbędnych białych znaków i obliczenie, czy wypisać spację czy znak.

Bugfix dzięki beatcracker.


Niestety nie udaje się to w ~|[abc<0>cba]|~przypadku testowym. Spróbuj tego:param($a)$a;(1..25|%{$i=$_;(-join([char[]]$a|%{(' ',$_)[$_-match'[a-z]'-and[math]::Max(0,($_-bor32)-96-$i)]})).TrimEnd()})-ne''
beatcracker

@beatcracker Good catch. To sprytny sposób obsługi porównania. Dzięki!
AdmBorkBork

2

Java 8, 151 147 144 143 139 bajtów

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

Wyjaśnienie:

Wypróbuj tutaj.

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 bajtów

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

-5 dzięki streetster!


stare rozwiązanie + objaśnienie:

{(+)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}dla 37, nie pamiętam, jak to rozwiązałem, tworząc pytanie, choć prawdopodobnie bardzo podobne!
streetster

@streetster, dzięki! zaktualizowane. nie wiedziałem o k _, wpisałem lowerinterpreter q i dostałem k){$[~t&77h>t:abs@@x;.z.s'x;19<t;.z.s@. x;~t in 10 11h;'`type;_x]}. stąd udzielam mojej odpowiedzi w q haha
bazgroły

1

SOGL V0.12 , 12 11 bajtów

ā,{Z⁴UW1Χ∙┼

Wypróbuj tutaj!

Wyjaśnienie:

ā            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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.