Сделайте немного Алфавитный дождь


54

Алфавитный дождь

Задание:

Основная предпосылка состоит в том, чтобы распечатать входную строку и затем повторить каждый символ по вертикали, основываясь на его (0-индексированной) позиции в алфавите (без учета регистра) A-Z. Aнаходится в позиции 0, поэтому не повторяется, eнаходится в позиции 4, поэтому повторяется 4 раза, Pнаходится в позиции 15, повторяется 15 раз, !не A-Zвыполняется, повторяется 0 раз и т. д.

Для ясности, все, что выходит за пределы диапазона B-Zb-z, например цифры или специальные символы, повторяться не будет и, следовательно, будет отображаться только в первой строке.

Это , поэтому самое короткое решение на каждом языке - победитель.

Входные данные:

  • Ввод будет в стандартном наборе печатных символов ASCII, от 32 до 126 ~.
  • Входная строка будет длиной 1 символ или более.
  • Не будет никаких начальных или конечных пробелов.
  • Вы можете принять входные данные в виде строки ( "hello") или список символов ( ["h", "e", "l", "l", "o"])

Примеры:

Ввод aaaaдает:

aaaa

Ввод abcdaдает:

abcda
 bcd
  cd
   d

Ввод Programming Puzzles & Code Golf!, дает:

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

Ввод ~|[abc<0>cba]|~, дает:

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

Примечания:

  • применяются стандартные лазейки
  • Вывод может быть списком строк, но:
  • посторонние завершающие символы новой строки не допускаются (допускается одиночное \nна последней строке)
  • Вывод может быть списком символов, если он выглядит так, как будто идет дождь.
  • нет новой строки
  • нашим скандинавским пользователям, у которых есть несколько дополнительных букв в алфавите "AZ", не стесняйтесь их поддерживать, но это не является частью проблемы

2
Является ли один ведущий \n приемлемым?
Линн

@ Линн, без начальных символов новой строки, первая строка должна быть строкой ввода / списком символов - я обновлю пост!
streetster

18
FWIW, я думаю, что они больше похожи на сосульки, чем на дождь
Caird Coneheringaahing

@cairdcoinheringaahing звучит почти празднично
Pureferret

:( Просто Nordic?
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

Скриншот

Онлайн демо

Использование: sys49152,"[string]" , например sys49152,"Programming Puzzles & Code Golf!".

Важно: если программа была загружена с диска (как в онлайн-демонстрации), newсначала введите команду! Это необходимо, потому что при загрузке машинной программы перегружаются некоторые основные указатели C64.

Примечание: 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 спасибо, но это все еще простой код (и это весело для меня!) - вы должны взглянуть на демо-сцену для действительно впечатляющих работ C64;)
Феликс Палмен

Если мы будем продолжать получать их, мы могли бы захотеть установить ссылки на эмулятор JavaScript C64, чтобы люди могли видеть их запуск.
17

1
@trlkly У меня есть такая ссылка в моем представлении, нажмите «Демо»;)
Феликс Палмен

14

05AB1E , 13 12 байт

,εDlAsk×}ζ»,

Попробуйте онлайн!

объяснение

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

32
Нужно получить индекс символа в строчном алфавите? только Askдля этого
Уриэль

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
Mr. Xcoder

Ах, ты прав! Я держал его, потому что 12-байтовая версия печатала дословно одну строку, и я не мог смешивать подобные форматы, и я забыл, что могу удалить это сейчас, когда все в транспонировании. Спасибо!
Стивен Х.

8

Python 3 , 83 байта

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

Попробуйте онлайн! Принимает список персонажей. Возвращает список списков персонажей.

Python 2 , 90 байт

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

Попробуйте онлайн! Берет строку Возвращает строку.


7

Mathematica, 115 89 байт

Он принимает в inputкачестве списка символов [{"a", "b", "c", "d", "a"}] и выводит список списков символов

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

Попробуйте онлайн!

-26 байтов от Миши Лаврова

-5 байт от пользователя 202729

но если вы хотите, чтобы результат был таким, как в тестовом примере, попробуйте этот (128 байт) код
Попробуйте онлайн!


Для будущих читателей: часть «этот ответ работает только в Mathematica ...» немного вводит в заблуждение, проблема в том, что Mathematica поддерживает только символы Unicode в режиме ноутбука (REPL). В режиме сценария он понимает только ASCII и специальные символы, которые были преобразованы в ASCII (например, (3 байта) -> \[Infinity](11 байтов)).
user202729

@ user202729 Хорошо, я буду редактировать и адресовать людей, чтобы они прочитали ваш комментарий. Спасибо
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}, мы гарантированно найдем #хотя бы один раз.)
Миша Лавров

@МишаЛавров очень милый. починил это!
J42161217

6

Дьялог АПЛ , 27 22 байта

5 байтов сохранено благодаря @ Adám

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

Попробуйте онлайн!

Как?

⍴¨⍨ - сформировать каждый символ в длину

    1⌈ - хотя бы один или

    ⎕A⍳819⌶⍨∘1 - индекс символа в верхнем регистре в алфавите

        27| - по модулю 27

- сплющить к матрице

- и транспонировать



@ Adám спасибо! обновленный
Uriel



5

Python 2 , 111 106 99 98 97 87 93 байта

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

Попробуйте онлайн!


whileможет быть заменен на, execчтобы сохранить несколько байтов, iможет начинаться с 65, чтобы сохранить больше, чтобы достигнуть 87 байтов
Род

ОП говорит, что посторонние завершающие символы новой строки не разрешены , но ваш код печатает несколько из них, когда ввод не содержит zили Z.
Линн

@ Линн Исправлено, я забыл перепроверить 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 и хороший первый ответ. Вы можете сократить свой код, используя несколько приемов. Вот более удачная версия вашего кода: Попробуйте онлайн! ,
Ян Х.

Спасибо за комментарии, я предположил, что мой код должен быть исполняемым сам по себе, поэтому я построил его на этом предположении! Спасибо за комментарий и наставничество.
Nejosan

2
Если вы хотите узнать больше о том, как играть в гольф в C #, посмотрите этот пост или посмотрите существующие ответы C #. Удачного игры в гольф!
Ян Х.

Хороший ответ. Продолжайте :)
говорит aloisdg Восстановить Монику

1
Привет, добро пожаловать в PPCG! Отличный первый ответ, особенно сейчас, когда игра в гольф. +1 от меня. Кстати, в настоящее время это 180 байтов, а не 162. К using System.Linq;сожалению, обязательный импорт необходимо добавить к счетчику байтов (или вы должны перейти Maxна System.Linq.Maxи Selectк System.Linq.Max, что будет больше, чем просто using System.Linq;один раз). Снова добро пожаловать, и приятного пребывания. О, и я вижу @IanH. уже упоминалось Советы по игре в гольф на C #. Советы по игре в гольф на <все языки> также могут быть интересными для чтения.
Кевин Круйссен

5

Баш, 78 , 76 71 байт

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

В зависимости от параметров сортировки (по умолчанию LC_ALL) можно сохранить еще несколько байтов

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

Попробуйте онлайн


4

Perl 5 , 43 байта

Код 41 байт + 2 для -nl .

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

Попробуйте онлайн!


1
цикл для [_0-9] символов, может быть s/["-$c]/ /giи -lне нужен
Науэль Фуийо

@NahuelFouilleul Ааа, да, я был слишком быстр в тестовых случаях. Они должны быть добавлены в ОП! :) Спасибо! +4 :(
Дом Гастингс

мое предложение не работает ни для каких символов от 32 до 126 (не альфа больше, чем Z)
Науэль Фуйе

@NahuelFouilleul Не могу найти более короткий путь, который отвечает всем требованиям ... Я продолжу играть ...
Дом Гастингс

4

JavaScript (ES6), 87 78 76 байт

-9 байт благодаря @RickHitchcock .
-2 байта благодаря @Neil .

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

Принимает ввод в виде строки и возвращается с одним завершающим символом новой строки.

Тестовые случаи


76 байтов (одна новая строка в конце): f=(s,i=10)=>s.trim()&&s+'newline'+f(s.replace(/./g,c=>parseInt(c,36)-i?c:" "),i+1)
Рик Хичкок,

@RickHitchcock Это кажется бесконечным циклом для входной строки, содержащей числа: Попробуйте онлайн! , Однако идея постепенных изменений sдействительно хороша.
Джастин Маринер

Ах, хорошая мысль. Это можно исправить стоимостью 2 байта:parseInt(c,36)-i>0
Рик Хичкок,

1
@RickHitchcock Вы не можете использовать parseInt(c,36)>iвместо этого, чтобы сохранить 2 байта?
Нил

@ Нил, дух. Джастин: Что сказал Нейл? :)
Рик Хичкок

4

R 118 114 байтов

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

Спасибо @Giuseppe за эти 4 байта

Попробуйте онлайн!

Краткое объяснение:

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

оооо, подожди, потенциальная проблема: если aвсе пробелы, это ничего не распечатает ... но ты можешь изменить whileусловие, на grepl()|!Fкоторое все равно будет байт короче, чем твой исходный ответ.
Джузеппе

4

R , 125 123 байт

Обойден планнапусом

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

Попробуйте онлайн!

Функция; печатает в stdout, но в основном мой ответ выше портирован, чтобы принять список символов, а не разбивать строку, поэтому я чувствую, что это "обман". Кроме того, подход plannapus с регулярным выражением довольно аккуратный!



3

Japt , 15 14 11 10 байт

Первый шанс поиграть с новыми методами заполнения строк в Japt, так что может быть место для улучшений.

y_ùZInZu c

Попробуй


объяснение

Неявный ввод строки U.

y_

Пропустите каждый столбец Uчерез функцию, где Zнаходится текущий элемент (или в данном случае буква).

InZu c

Преобразуйте Zв uuppercase ( ), получите его charcode ( c) и subtract ( u) 64 ( I).

ùZ

Начните Zс себя, пока не достигнете этой длины.


альтернатива

y_ùZ9aZn36

Попробуй


Но ты не мог измениться, ùZчтобы pспасти б ... не
ETHproductions

@ETHproductions: я сделал несколько попыток p(их может быть 1 в истории редактирования), но ùв итоге победил.
Shaggy

3

Haskell , 137 136 127 119 байт

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

Попробуйте онлайн!

Довольно долго, но я не могу придумать, как еще сократить его. Я чувствую, что должен быть какой-то путь короче, чем синтаксис if-then, но я этого не вижу.

РЕДАКТИРОВАТЬ: Спасибо @streetster за помощь мне сбрить один байт! toUpperСначала я не использовал из-за стоимости импорта, Data.Charно я забыл, что он также обеспечивает, ordчто намного короче, чемfromEnum

РЕДАКТИРОВАТЬ 2: Спасибо @Laikoni за сокращение 6 байт и выявление ошибки, которую я сейчас исправил. Я использовал 26 вместо 25, потому что я забыл, что массивы на Haskell включены. Тогда я заметил, что могу использовать lastвместо того, headчто позволит мне использовать, 0:а не ++[0].

РЕДАКТИРОВАТЬ 3: Еще раз спасибо Лайкони за эти 8 байтов. Я действительно забыл об этом месте. По какой-то причине Sublime Text вылетает без него, и я забыл удалить его. Я не знал, что списки строк были разрешены, я должен был прочитать правила более внимательно.


1
Можете ли вы ввести строчные буквы, чтобы избежать необходимости проверять AZ, а также az и затем модифицировать?
streetster

@streetster В haskell функции toLower и toUpper требуют импорта Data.Char, который стоит больше символов, чем экономит. TIO
user1472751

1
Возможно, вы захотите взглянуть на советы по игре в гольф на Хаскелле . Например, if i>p c then ' ' else cможно сократить до last$c:[' '|i>p c].
Лайкони

Еще две вещи: есть лишний пробел [k | и возврат списка строк разрешен, так что вам не нужно unlines. Наконец, вас может заинтересовать наш чат на Haskell .
Лайкони

3

Excel VBA, 110 байт

Anonymous VBE Immediate Window Функция, которая берет входной тип как ожидаемый Variant\Stringиз диапазона [A1]и использует его, чтобы заставить алфавит отображаться в непосредственном окне VBE.

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

Образец ввода / вывода

[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 

Brutal !!! Это швы, вы также можете сделать?A1:...
LS_ᴅᴇᴠ

@ LS_ᴅᴇᴠ, к сожалению, поскольку []указывает, что содержащаяся строка должна быть оценена как объект в / on / как рабочая книга, [A1]вызов не может быть уменьшен до A1- так как это не будет принимать и печатать начальный ввод из диапазона [A1]; скорее это просто оставит пустую строку и все последующие строки будут напечатаны
Тейлор Скотт

Упс, ты прав ... Не заметил этого!
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 байта)

К сожалению, мне пришлось добавить 7 байтов, потому что оригинальная версия не смогла обработать "z".

Называя это:

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

Скобки в лямбда-определении могут быть удалены. +1.
Yytsi

2

Oracle SQL, 186 байт

Предполагается, что строка будет в таблице tв столбце v:

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

SQL Fiddle

Настройка схемы 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]
  до н.э
   с

Частично вдохновлен Теперь непосредственно на основе ответа пользователя Haskell пользователя 1472751 .


Предыдущий подход ( 100 99 байт)

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

Попробуйте онлайн!


2

PowerShell , 122 127 байт

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

Попробуйте онлайн!

Коротко благодаря тому, как PowerShell может динамически приводить между [char]и [int], но долго из-за удаления лишних пробелов и вычисления того, выводить ли пробел или символ.

Исправление ошибок благодаря beatcracker.


К сожалению, это не удается в ~|[abc<0>cba]|~тестовом случае. Попробуйте это:param($a)$a;(1..25|%{$i=$_;(-join([char[]]$a|%{(' ',$_)[$_-match'[a-z]'-and[math]::Max(0,($_-bor32)-96-$i)]})).TrimEnd()})-ne''
beatcracker

@beatcracker Хороший улов. Это умный способ обработки сравнения. Спасибо!
AdmBorkBork

2

Java 8, 151 147 144 143 139 байт

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

Объяснение:

Попробуй это здесь.

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

2

q , 42 37 байт

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

-5 спасибо стритстеру!


старое решение + объяснение:

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


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

1
{(+)max[m]$(m:1+mod[.Q.a?(_)x]26)#'x}для 37 не могу вспомнить, как я решил это при создании вопроса, вероятно, очень похоже, хотя!
Стритстер

@streetster, спасибо! обновлено. не знал о k _, я набрал lowerв интерпретаторе q и получил k){$[~t&77h>t:abs@@x;.z.s'x;19<t;.z.s@. x;~t in 10 11h;'`type;_x]}. отсюда и мой ответ в д хаха
каракули

1

СОГЛ В0.12 , 12 11 байтов

ā,{Z⁴UW1Χ∙┼

Попробуй здесь!

Объяснение:

ā            push an empty array
 ,{          for each character in the input, pushing it
   Z           push the uppercase alphabet
    ⁴          push a duplicate of the character
     U         uppercase it
      W        find its index in that alphabet
       1Χ      get the maximum of that and 1
         ∙     repeat the character that many times
          ┼    append horizontally to that array
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.