Зробіть кілька алфавітних дощів


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 ?
Лінн

@Lynn, жодних провідних рядків немає, перший рядок має бути вхідним рядком / списком символів - я оновлю пост!
Стрітер

18
FWIW, я думаю, вони більше схожі на бурульки, ніж на дощ
caird coinheringaahing

@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

скріншот

Демонстрація в Інтернеті

Використання:, 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;)
Фелікс Палмен

Якщо ми продовжуємо їх отримувати, ми можемо захотіти налаштувати посилання на емулятор JavaScript C64, щоб люди могли бачити їх запуск.
trlkly

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
Потрібно отримати індекс char у малому алфавіті? тільки 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
Містер Xcoder

Ах, ти маєш рацію! Я зберігав це, тому що 12-байтна версія друкувала один рядок дословно, і я не міг змішати такі формати, і я забув, що можу видалити це тепер, коли все перебуває в положенні. Дякую!
Стівен Х.


7

Математика, 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 байт)).
користувач202729

@ user202729 Гаразд, я відредагую і
звернусь

Пропозиція Golf для 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}, ми гарантовано знайдемо #хоча б раз.)
Миша Лавров

@MishaLavrov дуже приємно. виправлено!
J42161217

6

Діялог APL , 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.
Лінн

@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 та приємної першої відповіді. Ви можете скоротити код, скориставшись декількома хитрощами. Ось більш гольф- версія вашого коду: Спробуйте в Інтернеті! .
Ян Х.

Дякую за коментарі, я припустив, що мій код повинен бути виконаним сам, тому я будував його на цьому припущенні! Дякуємо за коментар та наставництво.
Нейосан

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 #. Поради щодо гольфу на <всіх мовах> також можуть бути цікавими для прочитання.
Кевін Кройсейсен


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не потрібен
Nahuel Fouilleul

@NahuelFouilleul Ага, так, я був занадто швидким на тестових випадках. Їх слід додати до ОП! :) Дякую! +4 :(
Дом Гастінгс

моя пропозиція не працює для символів між 32 і 126 (не більше альфа-Z)
Nahuel Fouilleul

@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 байти?
Ніл

@Neil, да. Джастін: Що сказав Ніл. :)
Рік Хічкок

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

Спробуйте в Інтернеті!

Друкує до stdout за допомогою одного зворотного нового рядка і читає з 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, але в основному моя відповідь вище перенесена, щоб прийняти список символів, а не розбивати рядок, тому я відчуваю, що це "обман". Плюс, підхід планапусу з регулярними виразками досить акуратний!



3

Japt , 15 14 11 10 байт

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

y_ùZInZu c

Спробуй це


Пояснення

Неявне введення рядка U.

y_

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

InZu c

Перетворіть Zу верхній регістр ( u), отримайте його charcode ( c) і відніміть ( 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, але я цього не бачу.

EDIT: Дякую @streetster за те, що ти допомагаєш мені голити один байт! Я не використовував toUpperспочатку через вартість імпорту, Data.Charале забув, що він також забезпечує ordнабагато коротше, ніжfromEnum

EDIT 2: Дякуємо @Laikoni за те, що голив ще 6 байт та виявив помилку, яку я тепер виправив. Я використав 26 замість 25, тому що забув, що масиви Haskell включені. Тоді я помітив, що можу використовувати lastзамість цього, headщо дозволить мені 0:скоріше використовувати ++[0].

EDIT 3: Ще раз дякую Лайконі за ці 8 байт. Я фактично забув про цей простір. Чомусь Sublime Text вивертається без нього, і я забув його видалити. Я не знав, що дозволені списки рядків, я повинен був уважніше читати правила.


1
Чи можете ви зменшити регістр даних, щоб уникнути необхідності перевірки AZ, а також az, а потім модифікації?
Стрітер

@streetster У haskell функції toLower і toUpper потребує імпорту Data.Char, який коштує більше символів, ніж економить. TIO
користувач1472751

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

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

3

Excel VBA, 110 байт

Анонімна функція негайного вікна VBE, яка приймає введення як очікуваний тип 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 

Жорстокий !!! Це також можна зробити?A1:...
LS_ᴅᴇᴠ

@ LS_ᴅᴇᴠ, на жаль, оскільки []вказує на те, що міститься рядок слід оцінювати об'єкту в / в / як робочу книгу, [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
@Christoph fix
Titus



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]
  до н.е.
   c

Частково натхненний Асистем безпосередньо на основі відповіді користувача 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], але довгими через вилучення сторонніх пробілів та обчислення виводу пробілу чи символу.

Виправлення завдяки "бійкракеру".


На жаль, це не вдається на ~|[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]}. отже, я даю свою відповідь у q haha
scrawl

1

SOGL V0.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.