Yarı Çapraz Alfabe


35

İngilizce alfabenin bir mektubu verildiğinde, sizin göreviniz girdi için yarı köşegen bir alfabe oluşturmaktır.

Yarı köşegen bir alfabe nasıl yapılır?

Kısa Açıklama : Öncelikle, harfin alfabedeki konumunu alırsınız P( Pburada 1 indekslenir). Ardından, her harfi bir satırdaki giriş (dahil) olana kadar önce basar P-1ve bu harf Pzamanlarını boşluklarla arayarak tekrarlarsınız .

Örnekler :

  • Verilen F, programın çıktı vermelidir:

    bir 
     BB 
      CCC 
       DDDD 
        EEEEE 
         FFFFFF 
    
  • Verilen K, programın çıktı vermelidir:

    bir
     BB 
      CCC 
       DDDD 
        EEEEE 
         FFFFFF 
          ggggggg 
           hhhhhhhh 
            IIIIIIIII 
             JJJJJJJJJJ 
              KKKKKKKKKKK 
    
  • Verilen A, programın çıktı vermelidir:

    A
    

kurallar

  • Küçük veya büyük harflerden birini seçebilirsiniz, ancak bu tutarlı olmalıdır.

  • Aşağıdaki gibi fazladan boşluklara sahip olabilirsiniz:

    • Tek bir tutarlı satır aralığı (her satırda).
    • Bir izleyen veya önde gelen yeni satırlar.
    • Arka boşluklar.
  • Giriş ve çıkış herhangi bir standart ortalama tarafından alınabilir ve varsayılan boşluklar uygulanır.

  • versiyonunu sağladığınız sürece, bunun yerine satırların bir listesini çıkarmanıza izin verilir .

  • Bu , yani bayttaki en kısa kod kazanır!

Bu zorluktan ilham aldık .


Dizelerin listesi olarak çıktı uygun mu?
— Adám

2
Neden aşağı oy? Neleri geliştirebilirim?

1
"P burada 1 indeksli" deyince, buradaki zorluk veya örneğe mi işaret ediyor?
— Dave

3
@pizzakingme Hayır, olmayabilir.

1
: Cevabımı golf ederken accidentlly ilginç bir model var tio.run/##K0nO@f@/...
— sergiol

Yanıtlar:


10

Python 3 , 59 bayt

lambda l:[' '*i+'%c '%(i+65)*-~i for i in range(ord(l)-64)]

Çevrimiçi deneyin!

Python 3 , 61 bayt

lambda l:[' '*i+-~i*(chr(i+65)+' ')for i in range(ord(l)-64)]

Çevrimiçi deneyin! (güzel baskı versiyonuna bağlantı)


8
Olumsuz bir oy için kesinlikle hiçbir sebep göremiyorum. @ Downvoter açıklayabilir mi?
— Bay Xcoder

1
Ben sadece bir yanlış anlaşılma olduğunu, belki de açıklama eksikliğinden hoşlanmadıklarını düşünebilirim (ikincisi oldukça düşük olasılıkla IMO'dur)
— Conor O'Brien,

Python'dan hoşlanmıyorum ve Python ile uygulayamıyorum, bu yüzden cevap benim için yararlı değil mi? Şaka yapıyorum, ancak düğme ipuçları muhtemelen bu sitenin kurallarına uymuyor
— Thomas Weller

Sadece ben miyim yoksa Bay Xcoder’ın 1 temsilcisi var mı?
— Stan Strum



7

PowerShell , 45 42 bayt

65..$args[0]|%{" "*$i+++"$([char]$_) "*$i}

Çevrimiçi deneyin!

Değişken bir karakter olarak girdiyi alır, daha sonra başlıklar arasında o noktaya kadar döner, her yineleme uygun sayıda boşluk hazırlar ve ardından char \ boşluk melezi.

TessellatingHeckler sayesinde 3 bayt kurtardı.


@TessellatingHeckler Gerçekten. O "$args"kadar çok golf oynuyordum ki , burada işe yaramazsa, [0]yöntemi unuttum . Haha.
— AdmBorkBork

5

JavaScript (ES6), 85 bayt

Hem giriş hem de çıkış için küçük harfle çalışır. Her satırda bir satır boşluğu ve sonunda bir boşluk çıkar.

f=(c,k=10,C=k.toString(36),r=s=>`${s} `.repeat(k-9))=>r``+r(C)+(C==c?'':`
`+f(c,k+1))

gösteri


`${s} `(s+"")bir bayt tasarrufu için değiştirilebilir
— Luke,

@Luke Bu alana ihtiyacım var. Yerine (s+" "), ancak bu kadar uzun olabilir.
— Arnauld,

5

APL (Dyalog) , 26 bayt

Skaler karakter istemi. Satır listesini yazdırır.

(∊⍴∘'',' ',¨⍨⊢⍴⊃∘⎕A)¨⍳⎕A⍳⎕

Çevrimiçi deneyin! (bir ek baytta ASCII sanat sürümüne sahiptir)

⎕ giriş istemi

⎕A⍳ bulmak ɩ nDex içinde bir lphabet

⍳ İlk olarak birçok nt ntegers

(… )¨ Her birine aşağıdaki yapışkan işlevi uygulayın:

 ⊃∘⎕A argümanının harfini A lphabet'ten seç.

 ⊢⍴ döngüsel olarak argüman uzunluğuna göre yeniden şekillendir

 ' ',¨⍨ her birine bir boşluk ekle

 ⍴∘'', bir argüman uzunluğu dizgesi hazırlayın (boşluklarla doldurulmuş)

 ∊ ε nlist (düzleştirmek)


ASCII sanat sürümünde ↑sol tarafta bir tane var; karakter dizisine dizelerin listesini karıştırın.


4

Perl 5 , 31 bayt

İçin 30 bayt kodu + 1 -l.

print$"x$-,"$_ "x++$-for A..<>

Çevrimiçi deneyin!


Bunu bayrak sayyerine kullanarak kesebilirsiniz -l: Çevrimiçi deneyin!
— Xcali

@Xcali Yıpranmışım -E/ -M5.01, saygeçmişte çokça kullandım ve muhtemelen sınırlı bir kaynak mücadelesinde sayalternatif olabileceği gerçeğini kötüye kullanacaktım print, belki de, ama -3 uğruna, Şimdilik olduğu gibi. Adil bir argüman için bu meta gönderiye bakın . Yine de girişi takdir edin!
— Dom Hastings,

3

Dyalog APL, 38 bayt

{↑{(y/' '),(2×y←⎕A⍳⍵)⍴⍵,' '}¨⎕A↑⍨⎕A⍳⍵}

Çevrimiçi deneyin!

Nasıl?

⎕A↑⍨ - alfabeye kadar

⎕A⍳⍵ - giriş karakteri

¨ - Her karakter için

    ⍵,' ' - char ve bir boşluk al

    (...)⍴ - yeniden şekillendirmek

    2×y←⎕A⍳⍵ - Alfabedeki karakterin iki katı

    (y/' ') - ve karakter dizini boşluklarını hazırla

↑ - sonra dümdüz


3

APL (Dyalog Klasik) , 26 bayt

{↑{(≠\⍵<⍳3×⍵)\⍵⊃⎕A}¨⍳⎕A⍳⍵}

Çevrimiçi deneyin!

açıklama

                      ⍳⎕A⍳⍵  generate indexes up to position of right arg ⍵
{                   }¨       on each index apply function
   (≠\⍵<⍳3×⍵)                generate boolean mask for expansion (each line has a length 3 times its index ⍵, starting with ⍵ blanks and then alternating letter blank)
             \⍵⊃⎕A          expand character in position ⍵
 ↑                            mix result into text matrix

İyilik ... 4 APL-er aynı anda aynı problemi çözüyor! :) Sana dış kaldırmak için izin konum codegolf düşünmek {}yerine ⍵sahip ⎕ve bir "tam programı" yerine bir işlev olduğunu iddia ederler. Bu, çözümünüzü şu ana kadar en iyi hale getirecektir.
— ngn

İyi bir işaret olmalı :) Öneriniz için teşekkürler. Yaptığımı gördüm ama çizgiyi nereye çizeceğinizden emin değildim. Sanırım kıvrıkları çıkarır ve karıştırırsam 3 bayt kurtarabilirim.
— Gil

3

V , 28, 26, 25 , 23 bayt ( Rekabetçi )

¬A[/a
lDÓ./& ò
ò-Ûä$Û>

Çevrimiçi deneyin!

Belirli özellikler eklemeyi planlamama rağmenUzun zamandan , bu zorluğun sonunda beni yapmaya ikna edebileceğini unutmayın.

Çıktı, her satırda bir satır aralığı ve sondaki bir satırsonu satırını içerir.

HexDump:

00000000: ac41 5b2f 1261 0a6c 44d3 2e2f 2620 f20a  .A[/.a.lD../& ..
00000010: f22d dbe4 24db 3e                        .-..$.>

Açıklama:

¬A[         " Insert 'ABCDEFGHIJKLMNOPQRSTUVWXYZ['
   /        " Search for...
    <C-r>a  "   The input
l           " Move one character to the right
 D          " And delete every character after the cursor
  Ó         " Search for...
   .        "   Any character
    /       " And replace it with...
     & ò    "   That character followed by a space and a newline
ò           " Recursively...
 -          "   Move to the beginning of the next line up
  Ûä$       "   Make *line number* copies of the current line
     Û>     "   And indent this line by *line number* spaces

1
Bu yarışıyor. Başlık notunu kaldırabilirsiniz.

Kendim gibi yeni metadan haberi olmayanlar için kullanışlıdır
— Conor O'Brien,


3

R, 94 88 bayt

Giuseppe sayesinde -6 bayt

function(x,l=LETTERS)for(i in 1:match(x,l))cat(rep(' ',i-1),rep(paste(l[i],' '),i),'\n')}

Ungolfed:

f=function(x,l=letters){
  for(i in 1:which(l==x)){
    A=paste(l[i],' ')
    cat(rep(' ',i-1),rep(A,i),'\n')
  }
}

88 bayt : anonim bir işlev döndürmek gayet iyi, ftek bir liner olduğu için parantezden kurtulabilirsiniz ve matchyerine whichbir bayt kazandırıyorsunuz.
— Giuseppe


Stdin'den girdi alan 68 bayt .
— Giuseppe

3

Haskell, 52 44 bayt

f k=[[" ",s:" "]>>=(['A'..s]>>)|s<-['A'..k]]

Satır listesini döndürür.

Çevrimiçi deneyin!

f k=                  -- main function is f, input parameter k
  [   |s<-['A'..k]]   -- for each s from ['A'..k]
     >>=              -- map (and collect the results in a single string) the function: 
         (['A'..s]>>) --  replace each element in ['A'..s] with
    [  ,  ]           --  over the list, containing
     " "              --   a single space to get the indent
        s:" "         --   s followed by space to get the letter sequence

Düzenleme: @jferard: üç bayt kaydedildi. Teşekkürler!


49 bayt:f k=[tail$[" ",s:" "]>>=(['A'..s]>>)|s<-['A'..k]]
— temmuz

@jferard: Çok teşekkürler. Meydan okumayı tekrar okuduğumda, hat başına öncü bir alana izin verildiğini fark ettim, bu yüzden buna ihtiyacımız yok tail$.
— nimi

2

JavaScript (ES8), 92 bayt

c=>(g=n=>n>9?[...g(n-1),`${n.toString(36)} `.repeat(n-=9).padStart(n*3)]:[])(parseInt(c,36))

Küçük harf kullanır. Satırların bir tane önde ve bir de arkada kalan alanı vardır Satır dizisini döndürür.

Test Parçacığı

let f=

c=>(g=n=>n>9?[...g(n-1),`${n.toString(36)} `.repeat(n-=9).padStart(n*3)]:[])(parseInt(c,36))

;O.innerText=f("k").join`\n`
<pre id=O></pre>


2

Kabuğu , 13 bayt

z+ḣ∞øzRNC1…'A

Tek tırnak içindeki bir karakteri komut satırı argümanı olarak alır, sonucu STDOUT'a yazdırır. Çevrimiçi deneyin!

açıklama

Husk'un dizelerin listelerini basma şeklinden yararlanıyorum: iç listelere boşluklarla ve dış listelerde yeni çizgilerle birleş.

z+ḣ∞øzRNC1…'A  Implicit input, say 'C'
          …'A  Range from A: "ABC"
        C1     Cut into strings of length 1: ["A","B","C"]
     z N       Zip with positive integers
      R        using repetition: x = [["A"],["B","B"],["C","C","C"]]
   ∞ø          The empty string repeated infinitely: ["","","",...
  ḣ            Prefixes: [[],[""],["",""],["","",""],...
z+             Zip with x using concatenation: [["A"],["","B","B"],["","","C","C","C"]]
               Implicitly join each inner list with spaces, join the resulting strings with newlines and print.

2

05AB1E , 15 14 13 bayt

Adnan sayesinde 1 bayt kaydedildi

A¹¡н«ƶ€S»¶¡āú»

Çevrimiçi deneyin! veya Ascii sanat versiyonu

açıklama

A                # push lowercase alphabet
 ¹¡              # split at input
   н             # get the first part
    «            # append the input
     ƶ           # repeat each a number of times corresponding to its 1-based index
      €S         # split each to a list of chars
        »        # join on spaces and newlines
         ¶¡      # split on newlines
           āú    # prepend spaces to each corresponding to its 1-based index
             »   # join on newlines

Biraz farklı ele aldık gibi gözüküyor : D
— Outgolfer Erik

@EriktheOutgolfer: Benzer şekilde yaptık, ancak kaldırmadan önce bir boşluk eklemek için çok güzel bir fikir, birleştirme ihtiyacını ortadan kaldırmak sizinkini kısalttı. Baştaki / sondaki boşlukları ve ne de çıktısını liste olarak okumamıştım, bu yüzden uygulamadan önce tüm mücadeleyi okumamı umarım: P
— Emigna

dr: vectorization: p
— Outgolfer Erik,

A¹¡н«ADIk>£çalışması gerekir yerine
— Adnan

@Adnan: Teşekkürler! Ben yaptım A¹¡нama dikkate almadı «o yeterince iyi değildi bu yüzden son harf için: P
— Emigna


2

QBasic, 79 74 72 bayt

Bayt tasarrufu için Taylor Scott'a teşekkürler (iki kez!)

FOR i=1TO ASC(INPUT$(1))-64
?TAB(i)
FOR j=1TO i
?CHR$(64+i)" ";
NEXT j,i

Büyük harf kullanır. Giriş, tuşa basılarak yapılır ve ekrana yansıtılmaz.

açıklama

Biz döngü igelen 1alfabesinde sınırlama Mektubun pozisyonuna kadar (1 tabanlı). Her biri için ekranın isütununa ; sonra, zaman, alfabenin inci harfini ve ardından bir boşluk yazarız.iTABii


Görünen o ki, INPUT$(1)komutu z$-2 baytlık bir delta değişkeni için doğrudan yerine kullanabilirsiniz
— Taylor Scott

@TaylorScott İyi fikir, teşekkürler!
— DLosc

2

Japt -R, 24 23 17 15 bytes

Outputs an array, includes a leading newline and a leading & trailing space on each line.

IòUc ÏçSiXd¹iYç

Test it

  • 1 byte saved with help from Oliver and a further 6 thanks to him pointing out a better way to generate the initial array.

1

Charcoal, 18 bytes

F⁺⌕αθ¹«P×⁺§αι ⁺ι¹↘

Try it online!


Nah, you can't let 05AB1E beat Charcoal... :P
— totallyhuman


Sadly arbitrary leading whitespace isn't allowed otherwise E…·?θ⁺× κ⪫× κι would do the job in 14 bytes.
— Neil

@Neil One leading whitespace is allowed, but I'm not sure how ? got in there. It should be A instead I think. Oh wait, ohhhhh I see what you mean.
— Erik the Outgolfer

1

Braingolf, 65 bytes

a#a-# 7-,-~vc<!?>[$_]:$_|&,(.#a-!?.>[# M]1+>[.M# M]:$_!@|v#
&@R);

Try it online!

Lowercase.

Contains 1 trailing space on each line, and a trailing newline at the end of output.



1

JavaScript, 102 94 bytes

2 bytes saved thanks to Neil

f=
a=>[...Array(parseInt(a,36)-9)].map((a,b)=>''.padEnd(b).padEnd(b*3+1,(b+10).toString(36)+' '))

console.log(f('k').join`\n`)


1

Retina, 51 bytes

^.
$&$&
}T`L`_L`^.
.
$.`$* $&$.`$* ¶
+`(\w) \B
$&$1

Try it online! Explanation:

^.
$&$&

Duplicate the (first) letter.

}T`L`_L`^.

Rotate it back 1 in the alphabet, or delete it if it's a duplicate A. Keep duplicating and rotating until we duplicate A, at which point the deletion undoes the duplication and the loop completes.

.
$.`$* $&$.`$* ¶

Replace each letter with a line with the letter padded on both sides.

+`(\w) \B
$&$1

Insert duplicate letters between all pairs of padding spaces to the right of existing letters.



1

Charcoal, 15 bytes

F…·AS«P⪫E…@ιι ↘

Try it online! Link is to verbose version of code. Explanation:

 …·AS           Inclusive character range from A to the input
F    «          Loop over each character
         …@ι    Exclusive range from @ to the current character
        E   ι   Replace each element with the current character
       ⪫        Join with spaces
      P         Print without moving the cursor.
              ↘ Move the cursor down and right.

If extra padding was legal, this would work for 14 bytes:

E…·?θ⁺× κ⪫× κι

Try it online! Link is to verbose version of code.


1

Mathematica, 70 bytes

(T=Table)[""<>{" "~T~i,T[Alphabet[][[i]]<>" ",i]},{i,LetterNumber@#}]&

lowercase

outputs a list

thanx @ngenisis for corrections

For version place Column@ at the beginning


1

Excel VBA, 72 Bytes

Anonymous VBE immediate window function that takes input from cell A1 and outputs to the VBE immediate window

For i=1To Asc([A1])-64:[B1]=i:?Space(i-1)[REPT(CHAR(B1+64)&" ",B1)]:Next

1

Pyth, 17 bytes

.e+*kd*+bdhk<GhxG

Try it here (pretty print version).


How does this work?

  • hxG - Takes the index of the input in the lowercase alphabet.

  • <G - Trims every character after the input from the alphabet.

  • .e - Enumerated Map. Maps over the trimmed alphabet with the indexes as k and the letters as b.

  • *kd - Append k spaces.

  • +bd - b + a space (the current letter + space).

  • *...hk - Repeat k+1 times.

  • +(...)(...) - Concatenate.


1
One of my favorite things about Pyth is writing an answer and finding that someone wrote the same answer, character for character. It hits that Python "there is a best answer" spot perfectly!
— Dave

@pizzakingme Yeah, I wonder if I can do better
— Mr. Xcoder

the space addition feels wrong, I think better is possible
— Dave

@pizzakingme I could get .e+*kdjd*bhk<GhxG as 17 bytes as well
— Mr. Xcoder

16 bytes: .e+*kd*+bdhkhcGQ
— Dave

1

C++ (gcc), 164 bytes

#include<iostream>
#define f for(int i=0;i<o-'`';i++)
using namespace std;int main(){char c;cin>>c;for(char o='a';o<=c;o++){f cout<<' ';f cout<<o<<' ';cout<<'\n';}}

My first attempt after a long time lurking!

Ungolfed code below:

#include <iostream>

using namespace std;
#define f for (auto i = 0; i < output - '`'; i++)

int main()
{
  char input;

  cin >> input;

  for (char output = 'a'; output <= input; output++)
  {
    f cout << ' ';

    f cout << output << ' ';

    cout << endl;
  }
}

Try it online!


I know there has to be a bunch of golfing things to do, but so far, that's the smallest I've gotten.
— Drise
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.