Alfabe Yağmuru Yap


54

Alfabe Yağmuru

Görev:

Temel öncül, girdi dizesini yazdırmak ve ardından (büyük harf duyarlı) alfabedeki (0 indeksli) konumuna bağlı olarak her karakteri dikey olarak tekrarlamaktır A-Z. A0 konumunda, tekrarlanmadı, e4 konumunda, 4 kez tekrarlandı, P15 konumunda, 15 kez tekrarlandı, !öyle değil, A-Z0 kez tekrarlandı vb.

Netlik açısından, aralığın dışında kalan herhangi bir şey B-Zb-z, örneğin rakamlar veya özel karakterler, tekrarlanmayacak ve yalnızca ilk satırda görünecektir.

Bu , yani her dilde en kısa çözüm kazanan.

Giriş:

  • Giriş, standart olarak yazdırılabilir ASCII karakter setinde, 32 - 126 arasında olacaktır ~.
  • Giriş dizesi 1 karakter uzunluğunda veya daha uzun olacaktır.
  • Önde gelen ya da takip eden bir boşluk olmayacak.
  • Girdiyi bir dize ( "hello") veya karakter listesi ( ["h", "e", "l", "l", "o"]) olarak alabilir.

Örnekler:

aaaaVerir girişi :

aaaa

abcdaVerir girişi :

abcda
 bcd
  cd
   d

Giriş Programming Puzzles & Code Golf!, verir:

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

Giriş ~|[abc<0>cba]|~, verir:

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

Notlar:

  • standart boşluklar uygulanır
  • çıktı , dizelerin bir listesi olabilir , ancak:
  • yabancı takip eden yeni satırlara izin verilmez ( \nson satırdaki tekler kabul edilebilir)
  • Çıktı , karakter yağmurlu gibi gözüktüğü sürece karakter listelerinin bir listesi olabilir .
  • baştaki yeni hat yok
  • "AZ" alfabelerinde fazladan birkaç harf olan İskandinav kullanıcılarımıza , onları desteklemekten çekinmeyin, ancak bu zorluğun bir parçası değildir.

2
Tek bir lider \n kabul edilebilir mi?
Lynn

@Lynn, baştaki yeni satır yok, ilk satır giriş dizesi / karakter listesi olmalı - Gönderiyi güncelleyeceğim!
Streetster

18
Şimdi, sanırım yağmurdan çok buz sarkıtlarına benziyorlar
caird coinheringaahing

@cairdcoinheringaahing neredeyse şenlikli geliyor
Pureferret

:( Sadece İskandinav mı?
ASCII-sadece

Yanıtlar:


22

6502 makine kodu (C64), 113 bayt

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

ekran görüntüsü

Çevrimiçi demo

Kullanım: sys49152,"[string]" örn sys49152,"Programming Puzzles & Code Golf!".

Önemli: Program diskten yüklenmişse (çevrimiçi demoda olduğu gibi), newönce bir komut verin! Bir makine programı yüklemek bazı C64 BASIC imleçleri çöktüğü için bu gereklidir.

Not: C64 varsayılan olarak küçük harf içermeyen bir moddadır - karışık büyük bir dize girebilmek için önce SHIFT+ tuşlarına basarak küçük harf moduna geçin CBM.


açıklama

Yorumlanmış bir sökme listesi:

         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 makine kodu. Etkilendim.
Dschoni

@Dschoni teşekkür ediyor, ama yine de basit bir kod (ve benim için eğlenceli!) - gerçekten etkileyici C64 çalışmaları için demo sahnesine bir göz atmalısınız;)
Felix Palmen

Bunları almaya devam edeceksek, bir JavaScript C64 öykünücüsüne bağlantılar kurmak isteyebiliriz ki böylece insanlar onları çalıştırır.
saat

1
@ trlkly Gönderimde böyle bir bağlantı var, "Online demo" seçeneğine tıklayın;)
Felix Palmen

14

05AB1E , 13 12 bayt

,εDlAsk×}ζ»,

Çevrimiçi deneyin!

açıklama

,             # 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
Küçük harfli alfabe char dizini almak gerekiyor? sadece Askbunun için
Uriel

8

Pyth, 12 10 9 bayt

.tm+*xGr0

Test odası.

Açıklama:

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

j.t*VmxGr0d

(izleyen newline ile)

Test odası.

Açıklama:

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

Çıktı, karakterlerin bir listesi olabilir, karakter yağmurlu gibi gözüktüğü sürece - Bu yüzden ihtiyacınız yokj
Mr. Xcoder 10:17

Ah, haklısın! 12 baytlık sürüm bir satır yazdırıyordu ve böyle formatları karıştıramadım, ve artık her şeyin devrik olduğu olduğunu kaldırabilirim. Teşekkürler!
Steven H.

8

Python 3 , 83 bayt

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

Çevrimiçi deneyin! Bir karakter listesi alır. Karakter listelerinin bir listesini döndürür.

Python 2,90 bayt

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

Çevrimiçi deneyin! Bir dize alır. Bir dize döndürür.


7

Mathematica, 115 89 bayt

Sanki alır inputbir karakter listesinden [{"a", "b", "c", "d", "a"}] ve çıkışlar karakterlerin listelerin bir listesini

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

Çevrimiçi deneyin!

Misha Lavrov'dan -26 bayt

Kullanıcısından -5 bayt202729

Ancak çıktıyı test durumunda olduğu gibi görmek istiyorsanız, bu (128 bayt) kodu
deneyin. Çevrimiçi deneyin!


Gelecekteki okuyucular için: "Bu cevap sadece Mathematica'da çalışıyor ..." bölümü biraz yanıltıcı, sorun ise Mathematica'nın yalnızca notebook (REPL) modunda Unicode karakterini desteklemesi. Gelen komut modu , sadece ASCII dönüştürüldü ASCII ve özel karakterleri (örneğin, anlaşılması -> (3 bayt) \[Infinity](11 bayt)).
user202729

@ user202729 tamam, insanları yorumunuzu okuyacak şekilde düzenleyip
adresleyeceğim. Teşekkürler

Mathematica için golf önerisi (script modu): \[Infinity](11 byte) Infinity(8 byte) veya \:221e(6 byte) ile değiştirilebilir. Sonuncusu, adsız özel karakterlerin varsayılan temsilidir. (ana bölüm olmasa da)
user202729 10:17

InfinityTamamen önleyebiliriz . Sorunlu kısım If[(d=Min@Position[Alphabet[],If[UpperCaseQ@#,ToLowerCase@#,#]])==∞,1,d]ve bunu değiştirebiliriz Max@Position[Alphabet[]/."a"->#,#|ToLowerCase@#]. (Listede arama yaparak, en az bir kere {#,b,c,d,...,y,z}bulmamız garanti edilir #.)
Misha Lavrov

@MishaLavrov çok hoş. onu düzeltti!
J42161217

6

Dyalog APL , 27 22 bayt

@ Adám sayesinde 5 bayt kurtarıldı

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

Çevrimiçi deneyin!

Nasıl?

⍴¨⍨ - Her bir kömürün uzunluğunu biçimlendirmek

    1⌈ - en az bir veya

    ⎕A⍳819⌶⍨∘1 - alfabenin üst kısmındaki karakterin dizini

        27| - modulo 27

- bir matrise yassılaştırmak

- ve devrik



@ Adám teşekkürler! güncellendi
Uriel


5

Python, 105 103 bayt

@TFeld sayesinde 2 bayt kaydedildi

lambda s:'\n'.join(''.join((' '+l)[i<1or 91>ord(l.upper())>i+64]for l in s)for i in range(26)).rstrip()

Çevrimiçi deneyin!



@Tfeld güzel yakalamak, teşekkürler!
Uriel

5

Python 2 , 111 106 99 98 97 87 93 bayt

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

Çevrimiçi deneyin!


whileexecbirkaç byte kurtarmak için ile değiştirilebilir, 87 byte'a ulaşmaki için daha fazla tasarruf etmek için 65 ile başlayabilir
Rod

OP diyor yabancı sondaki yeni satırlar izin verilmez , ancak giriş içermiyorsa kodunuzu onları birkaç yazdırır zveya Z.
Lynn

@ Lynn Sabit, execdeğişikliği iki kez kontrol etmeyi unuttum ...
TFeld

5

C # (.NET Core) , 162 bayt

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

Çevrimiçi deneyin!


2
PPCG'ye hoş geldiniz ve ilk güzel cevap. Birkaç püf noktası kullanarak kodunuzu kısaltabilirsiniz. İşte kodunuzun daha golf versiyonudur: Çevrimiçi deneyin! .
Ian H.

Yorumlar için teşekkürler, kodumun kendi başına çalıştırılabilir olması gerektiğini varsaydım, bu yüzden bu varsayımı temel aldım! Yorumunuz ve mentorluk için teşekkür ederiz.
Nejosan

2
C # 'da nasıl golf oynayacağınıza dair daha fazla püf noktası bulmak istiyorsanız, bu yazıya bir göz atın veya mevcut C # cevaplarına bir göz atın. Mutlu golf!
Ian H.

Güzel cevap Devam et :)
aloisdg diyor Reinstate Monica

1
Merhaba, PPCG'ye hoş geldiniz! Büyük ilk cevap, özellikle de şimdi golf oldu. Benden +1. Btw, gerekli ithalat değil 162., şu anda 180 bayt olduğunu using System.Linq;(veya değiştirmelisiniz bayt sayısı eklenecek maalesef zorunludur Maxiçin System.Linq.Maxve Selectiçin System.Linq.Maxbasitçe daha yüksek olurdu, using System.Linq;bir kere.) Yine hoşgeldin ve kaldınız. Oh, ve @IanH'ı görüyorum. C # ile Golf için çoktan bahsetmiştik. <Tüm diller> de golf oynamak için ipuçları de bunu okumak için ilginç olabilir.
Kevin Cruijssen

5

Bash, 78 , 76 71 bayt

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

Harmanlamaya bağlı olarak (varsayılan LC_ALL) daha fazla bayttan tasarruf sağlayabilir

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

Çevrimiçi Deneyin


4

Perl 5 , 43 bayt

İçin 41 bayt kodu + 2 -nl.

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

Çevrimiçi deneyin!


1
[_0-9] karakterleri için döngü, belki s/["-$c]/ /give -lgerekli değildir
Nahuel Fouilleul

@NahuelFouilleul Ahh, evet, testlerde biraz hızlıydım. OP'ye eklenmelidir! :) Teşekkürler! +4 :(
Dom Hastings

önerim 32 ile 126 (Z'den büyük alfa değil) arasındaki karakterler için geçerli değil.
Nahuel Fouilleul

@NahuelFouilleul Tüm gereksinimleri karşılayan daha kısa bir yol bulamıyorum ... Oynamaya devam edeceğim ...
Dom Hastings

4

JavaScript (ES6), 87 78 76 bayt

@RickHitchcock sayesinde -9 bayt . @Neil
sayesinde -2 bayt .

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

Bir dize olarak girdi alır ve bir izleyen yeni satır ile döner.

Test Kılıfları


76 bayt (sondaki bir satır): f=(s,i=10)=>s.trim()&&s+'newline'+f(s.replace(/./g,c=>parseInt(c,36)-i?c:" "),i+1)
Rick Hitchcock

@RickHitchcock Sayıları içeren bir giriş dizgisi için sonsuz döngüye benziyor: Çevrimiçi deneyin! . Adım adım değişme fikri solsa da gerçekten güzel.
Justin Mariner

Ahh, iyi nokta. Bu 2 byte pahasına sabitlenebilir:parseInt(c,36)-i>0
Rick Hitchcock

1
@RickHitchcock parseInt(c,36)>i2 bayt kaydetmek yerine kullanamazsınız ?
Neil

Ne haber, hah. Justin: Neil ne dedi. :)
Rick Hitchcock

4

R, 118 114 bayt

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

4 bayt için @Giuseppe'e teşekkürler

Çevrimiçi deneyin!

Kısa açıklama:

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, bekle, olası sorun: atüm boşluklar varsa , bu hiçbir şey yazdırmaz ... ama orijinal cevabınızdan hala bir bayt olan whilekoşulu değiştirebilirsiniz grepl()|!F.
Giuseppe

4

R , 125 123 bayt

Plannapus tarafından aşıldı

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

Çevrimiçi deneyin!

Tek bir izleyen yeni satırla stdout'a yazdırır ve okur stdin().

Şimdi onu parçalayalım:

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
}

Alternatif cevap, 106 bayt

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

Çevrimiçi deneyin!

Fonksiyon; stdout'a yazdırır, ancak temelde dizeyi bölmek yerine karakterlerin bir listesini kabul etmek için verilen cevabım bu yüzden "hile yapıyor" gibi hissediyorum. Ayrıca, plannapus'un regex ile yaklaşımı oldukça düzenli!



3

Japt , 15 14 11 10 bayt

Japt'un yeni tel dolgu yöntemleriyle oynamaya ilk fırsat bu yüzden hala iyileştirme için yer olabilir.

y_ùZInZu c

Dene


açıklama

Dizenin örtük girişi U.

y_

Her öğenin sütununu , geçerli elemanın (veya bu durumda harfin) Uolduğu bir işlev içinden geçirin Z.

InZu c

ZBüyük harfe ( u) dönüştürün , charcode ( c) 'ı alın ve subtract ( u) 64 ( I).

ùZ

ZBu uzunluğa ulaşana kadar başlangıcı kendisiyle doldurun.


Alternatif

y_ùZ9aZn36

Dene


Ama değiştiremiyordunuz ùZiçin p... Bir b kurtarmak aldırma, yani ... gerçekten zeki
ETHproductions

@ETHproductions: Birkaç deneme yaptım p( düzenleme geçmişinde 1 olabilir ) ancak ùsonunda kazandım.
Shaggy

3

Haskell , 137 136 127 119 bayt

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

Çevrimiçi deneyin!

Oldukça uzun ama daha fazla kısaltmanın bir yolunu düşünemiyorum. İf-then sözdiziminden biraz daha kısa olması gerektiğini düşünüyorum ama göremiyorum.

EDIT: Bir bayt'ı tıraş etmeme yardım ettiğin için teşekkürler @streetster! toUpperİthalatın maliyeti nedeniyle ilk başta kullanmadım , Data.Charancak orddaha kısa olanın da sağladığını unuttum.fromEnum

EDIT 2: @Laikoni'ye 6 bayt'ı tıraş ettiğim ve şimdi düzelttiğim bir hatayı tanımladığı için teşekkürler. 25 yerine 26 kullandım çünkü Haskell dizilerinin kapsayıcı olduğunu unuttum. Sonra kullanabileceğim fark lastyerine headhangi beni kullanmasına izin vereceğini 0:yerine++[0] .

3 EDIT: Bu 8 bayt için tekrar teşekkürler Laikoni. O alanı gerçekten unutmuştum. Nedense Sublime Metin onsuz dışarı çıkar ve onu kaldırmayı unuttum. Satır listelerine izin verildiğinin farkında değildim, kuralları daha dikkatli okumalıydım.


1
A'dan Z'ye az ve sonra mod'ları kontrol etmek zorunda kalmaktan kaçınmak için girişi küçültebilir misiniz?
streetster,

@streetster toLower ve toUpper işlevlerinde, kaydettiğinden daha fazla karaktere mal olan Data.Char'ın içe aktarılması gerekir. TIO
kullanıcı1472751

1
Haskell'de golf oynamak için ipuçlarına göz atmak isteyebilirsiniz . Örneğin if i>p c then ' ' else ckısaltılabilir last$c:[' '|i>p c].
Laikoni

İki şey daha var: Gereksiz bir boşluk var [k | ve satır listesine geri dönülmesine izin veriliyor, bu nedenle buna ihtiyacınız yok unlines. Son olarak, Haskell sohbet odamızla ilgilenebilirsiniz .
Laikoni

3

Excel VBA, 110 Bayt

Anonim VBE Acil Durum Penceresi Girdiyi Variant\Stringaralıktan beklenen tipte [A1]alan ve VBE acil durum penceresindeki alfabeyi yağdırmak için kullanan işlev .

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

Örnek I / O

[A1]="qwertyuiop[]ASDFGHJKL:'zxcvbnm,./"
?[A1]:For i=1To 26:For j=1To[Len(A1)]:c=Mid([A1],j,1):d=Asc(UCase(c)):?IIf((d>64+i)*(d<91),c," ");:Next:?:Next
qwertyuiop[]ASDFGHJKL:'zxcvbnm,./
qwertyuiop   SDFGHJKL  zxcvbnm   
qwertyuiop   SDFGHJKL  zxcv nm   
qwertyuiop   SDFGHJKL  zx v nm   
qwertyuiop   S FGHJKL  zx v nm   
qw rtyuiop   S FGHJKL  zx v nm   
qw rtyuiop   S  GHJKL  zx v nm   
qw rtyuiop   S   HJKL  zx v nm   
qw rtyuiop   S    JKL  zx v nm   
qw rtyu op   S    JKL  zx v nm   
qw rtyu op   S     KL  zx v nm   
qw rtyu op   S      L  zx v nm   
qw rtyu op   S         zx v nm   
qw rtyu op   S         zx v n    
qw rtyu op   S         zx v      
qw rtyu  p   S         zx v      
qw rtyu      S         zx v      
 w rtyu      S         zx v      
 w  tyu      S         zx v      
 w  tyu                zx v      
 w   yu                zx v      
 w   y                 zx v      
 w   y                 zx        
     y                 zx        
     y                 z         
                       z 

Acımasız !!! Ayrıca yapabileceğiniz dikiş?A1:...
LS_ᴅᴇᴠ

@ LS_ᴅᴇᴠ, maalesef, []içerilen dizginin çalışma kitabındaki / / içindeki bir nesneye değerlendirilmesi gerektiğini belirttiğinden, [A1]çağrı indirgenemeyebilir A1- aralıktan ilk girdiyi almayacak ve yazdırmayacaktır [A1]; bunun yerine bu sadece boş bir satır bırakacak ve sonraki tüm satırlar yazdırılacak
Taylor Scott

Ups, haklısın ... Bunu farketmedim!
LS_ᴅᴇᴠ

3

PHP, 69 78 77 85 + 1 bayt

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

PHP <7 gerektirir. Pipe ile çalıştırın -nRveya çevrimiçi deneyin .


@Shaggy işaret ettiğiniz için teşekkürler. Şimdi tamamlandı.
Titus

İçin +1 $c=A;!$c[1];$c++. Güzel! Ne yazık ki extraneous trailing newlines are not allowed (single \n on final line is acceptable). Bu yüzden içermeyen tüm dizeler için başarısız olur z.
Christoph

1
@ Christoph sabit
Titus



2

Ruby, 70 67 74 bayt

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

@TuukkaX'a teşekkürlerBazı işaret eden (-3 bayt) bırakılabilir

Maalesef 7 bayt eklemek zorunda kaldım çünkü orjinal sürüm "z" yi kullanamadı.

Onu arayarak:

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

Lambda tanımındaki parantezler çıkartılabilir. +1.
Yytsi

2

Oracle SQL, 186 Bayt

Dize tsütunundaki bir tabloda olacağını varsayar 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 Şema Kurulumu :

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

Sorgu 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

Sonuçlar :

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


2

Haskell , 98 bayt

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

Çevrimiçi deneyin!

Örnek kullanım: f "[Abc]"çizgilerin bir listesini verir: ["[Abc]"," bc "," c "]. putStr.unlines.f $ "[Abc]"Basılı çıktılar için kullanın :

[ABC]
  İSA'DAN önce
   c

Kısmen Şimdi doğrudan kullanıcı1472751 Haskell cevabı dayalı esinlenerek .


Önceki yaklaşım ( 100 99 bayt)

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

Çevrimiçi deneyin!


2

PowerShell , 122 127 bayt

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

Çevrimiçi deneyin!

PowerShell'in dinamik boşluklar arasında nasıl bir boşluk bırakacağını ve boşluk veya karakter çıkarıp çıkarmayacağının hesaplanmasından dolayı [char]ve aralarında dinamik olarak döküm yapabildiğinden kısa [int].

Beatcracker sayesinde Bugfix.


Ne yazık ki, bu ~|[abc<0>cba]|~test durumunda başarısız olur . Bunu deneyin:param($a)$a;(1..25|%{$i=$_;(-join([char[]]$a|%{(' ',$_)[$_-match'[a-z]'-and[math]::Max(0,($_-bor32)-96-$i)]})).TrimEnd()})-ne''
beatcracker

@beatcracker İyi yakala. Karşılaştırma yapmanın akıllıca bir yolu. Teşekkürler!
AdmBorkBork,

2

Java 8, 151 147 144 143 139 bayt

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

Açıklama:

Burada dene.

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 bayt

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

-5 Streetster'e teşekkürler!


eski çözüm + açıklama:

{(+)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 için, soru oluştururken nasıl çözdüğümü hatırlayamıyorum, muhtemelen çok benzer!
Streetster

@streetster, teşekkürler! güncellenmiş. k en bilmiyordu _, ben daktilo lowerq yorumlayıcı ve var k){$[~t&77h>t:abs@@x;.z.s'x;19<t;.z.s@. x;~t in 10 11h;'`type;_x]}. dolayısıyla cevabımı q haha'da vererek
karalama

1

SOGL V0.12 , 12 11 bayt

ā,{Z⁴UW1Χ∙┼

Burada dene!

Açıklama:

ā            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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.