Alfabeto semi-diagonale


35

Data una lettera dell'alfabeto inglese, il tuo compito è costruire un alfabeto semi-diagonale sull'input.

Come costruire un alfabeto semi-diagonale?

Breve descrizione : in primo luogo, prendi la posizione della lettera nell'alfabeto P(qui Pè 1-indicizzato). Quindi, stampi ogni lettera fino all'input (incluso) su una riga, preceduto da P-1e ripeti i Ptempi di quella lettera , interfacciandosi con gli spazi.

Esempi :

  • Dato F, il tuo programma dovrebbe produrre:

    UN 
     BB 
      CCC 
       DDDD 
        EEEEE 
         FFFFFF 
    
  • Dato K, il tuo programma dovrebbe produrre:

    UN
     BB 
      CCC 
       DDDD 
        EEEEE 
         FFFFFF 
          GGGGGGG 
           HHHHHHHH 
            IIIIIIIII 
             JJJJJJJJJJ 
              kkkkkkkkkkk 
    
  • Dato A, il tuo programma dovrebbe produrre:

    A
    

Regole

  • Puoi scegliere caratteri minuscoli o maiuscoli, ma ciò dovrebbe essere coerente.

  • Potresti avere spazi estranei come segue:

    • Uno spazio iniziale coerente (su ogni riga).
    • Una o più righe nuove o finali.
    • Spazi finali.
  • L'input e l'output possono essere presi con qualsiasi media standard e si applicano scappatoie predefinite.

  • È consentito invece generare un elenco di righe, purché si fornisca anche la versione .

  • Questo è , quindi vince il codice più corto in byte!

Ispirato da questa sfida .


L'output come elenco di stringhe è ok?
Adám,

2
Perché il downvote? Cosa posso migliorare?

1
Quando dici "P è 1-indicizzato qui", qui fai riferimento alla sfida o all'esempio?
Dave,

3
@pizzakingme No, non puoi.

1
Ho avuto per caso uno schema interessante mentre giocavo a
sergiol

Risposte:


10

Python 3 , 59 byte

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

Provalo online!

Python 3 , 61 byte

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

Provalo online! (collegamento alla versione piuttosto stampata)


8
Non vedo assolutamente alcun motivo per un downvote. @Downvoter può spiegare?
Mr. Xcoder,

1
Immagino che sia solo un errore, o forse qualcuno che non ama la mancanza di spiegazioni (quest'ultimo è abbastanza improbabile IMO)
Conor O'Brien,

Non mi piace Python e non posso implementare con Python, quindi la risposta non mi è utile? Sto solo scherzando, ma le descrizioni dei pulsanti probabilmente non si adattano alle regole di questo sito
Thomas Weller,

Sono solo io o dice che il signor Xcoder ha 1 rappresentante ...?
Stan Strum,



7

PowerShell , 45 42 byte

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

Provalo online!

Prende l'input come carattere letterale, quindi passa attraverso le maiuscole fino a quel punto, ogni iterazione antepone il numero appropriato di spazi e quindi l'ibrido char \ space.

Salvato 3 byte grazie a TessellatingHeckler.


@TessellatingHeckler Infatti. Ho giocato a golf "$args"così tanto, che non avrebbe funzionato qui, ho dimenticato il [0]metodo. Haha.
AdmBorkBork,

5

JavaScript (ES6), 85 byte

Funziona in minuscolo sia per input che per output. Emette uno spazio iniziale e uno spazio finale su ciascuna riga.

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

dimostrazione


`${s} `può essere sostituito da (s+"")per un risparmio di byte
Luca

@Luke Ho bisogno di questo spazio. Può essere sostituito da (s+" "), ma è altrettanto lungo.
Arnauld,

5

APL (Dyalog) , 26 byte

Richiede il carattere scalare. Stampa l'elenco delle righe.

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

Provalo online! (ha la versione di arte ASCII ad un byte aggiuntivo)

 richiesta di input

⎕A⍳ trova de ndex in una lettera

 prima che molti ɩ ntegers

(...  applica la seguente funzione tacita a ciascuno:

⊃∘⎕A scegli l'argomentazione lettera dell'alfabeto A

⊢⍴ ridisegnare ciclicamente la lunghezza dell'argomento

' ',¨⍨ aggiungere uno spazio a ciascuno

⍴∘'', anteporre una stringa di lunghezza argomento (riempita con spazi)

ϵ nlist (appiattisci)


La versione di arte ASCII ha solo un a sinistra; mescola l'elenco di stringhe in una tabella di caratteri.


4

Perl 5 , 31 byte

30 byte codice + 1 per -l.

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

Provalo online!


Puoi ridurlo usando sayinvece della -lbandiera: provalo online!
Xcali,

@Xcali Sono violento -E/ -M5.01, ho usato sayconsiderevolmente in passato e probabilmente abuserei del fatto che sayè un'alternativa a printuna sfida sorgente limitata o simile forse, ma per motivi di -3, terrò così com'è per ora. Vedi questo meta post per un corretto argomento . Apprezzo l'input però!
Dom Hastings,

3

Dyalog APL, 38 byte

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

Provalo online!

Come?

⎕A↑⍨ - prendi l'alfabeto fino al

⎕A⍳⍵ - il carattere di input

¨ - per ogni carattere

    ⍵,' ' - prendi il carattere e uno spazio

    (...)⍴ - rimodella in

    2×y←⎕A⍳⍵ - il doppio dell'indice del carattere nell'alfabeto

    (y/' ') - e anteporre spazi di indice di caratteri

- quindi appiattire


3

APL (Dyalog Classic) , 26 byte

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

Provalo online!

Spiegazione

                      ⍳⎕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

Bontà ... 4 APL-er risolvendo lo stesso problema allo stesso tempo! :) Penso che in codegolf ti sia permesso di rimuovere l'esterno {}, sostituirlo con , e rivendicare che è un "programma completo" piuttosto che una funzione. Ciò renderebbe la tua soluzione la migliore (finora).
ngn,

Deve essere un buon segno :) Grazie per il suggerimento. L'ho visto fatto, ma non ero sicuro di dove tracciare la linea. Immagino di poter salvare 3 byte se rimuovo i ricci e mescolo.
Gil,

3

V , 28, 26, 25 , 23 byte (in competizione )

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

Provalo online!

Nota che, anche se ho intenzione di aggiungere alcune funzionalità per molto tempo, questa sfida è stata ciò che mi ha convinto a farlo finalmente.

L'output contiene uno spazio iniziale su ogni riga e una nuova riga finale.

hexdump:

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

Spiegazione:

¬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
Questo è in competizione. È possibile rimuovere l'osservazione del titolo.

È utile per coloro che non erano a conoscenza della nuova meta, come me
Conor O'Brien,


3

R, 94 88 byte

-6 byte grazie a Giuseppe

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 byte : la restituzione di una funzione anonima va bene, è possibile eliminare le parentesi graffe poiché fè un liner e utilizzare matchinvece di whichsalvare un byte.
Giuseppe,


68 byte prendendo input da stdin.
Giuseppe,

3

Haskell, 52 44 byte

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

Restituisce un elenco di righe.

Provalo online!

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

Modifica: @jferard: salvato tre byte. Grazie!


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

@jferard: grazie mille. Rileggendo la sfida ho notato che è consentito uno spazio iniziale per riga, quindi non è necessario tail$.
nimi,

2

JavaScript (ES8), 92 byte

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

Usa lettere minuscole. Le linee hanno uno spazio iniziale e uno finale. Restituisce una matrice di linee.

Test dello snippet

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

Buccia , 13 byte

z+ḣ∞øzRNC1…'A

Prende un carattere tra virgolette singole come argomento della riga di comando, stampa il risultato su STDOUT. Provalo online!

Spiegazione

Sto sfruttando il modo in cui Husk stampa elenchi di elenchi di stringhe: unisce elenchi interni con spazi e elenchi esterni con nuove righe.

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 byte

Salvato 1 byte grazie ad Adnan

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

Provalo online! o la versione artistica di Ascii

Spiegazione

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


@EriktheOutgolfer: l'abbiamo fatto in modo abbastanza simile, ma la tua idea molto carina di aggiungere uno spazio prima di sollevare, eliminando la necessità di unire il tuo abbreviato. Non avevo letto che gli spazi iniziali / finali né l'output come elenco erano a posto, quindi spero che mi insegnino a leggere l'intera sfida prima di implementare: P
Emigna,

tl; dr: vectorization: p
Erik the Outgolfer

A¹¡н«invece di ADIk>£funzionare
Adnan,

@Adnan: grazie! Avevo, A¹¡нma non avevo preso in considerazione «l'
idea


2

QBasic, 79 74 72 byte

Grazie a Taylor Scott per il risparmio di byte (due volte!)

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

Usa lettere maiuscole. L'ingresso avviene premendo il tasto e non viene ripetuto sullo schermo.

Spiegazione

Passiamo idalla 1posizione della lettera limite all'alfabeto (basato su 1). Per ognuno i, ci spostiamo nella colonna idello schermo usando TAB; poi, ivolte, stampiamo la ilettera dell'alfabeto seguita da uno spazio.


A quanto pare puoi usare il INPUT$(1)comando come sostituto diretto della variabile z$per un delta di -2 byte
Taylor Scott

@TaylorScott Buona idea, grazie!
DLosc,

2

Japt -R , 24 23 17 15 byte

Emette un array, include una nuova riga iniziale e uno spazio iniziale e finale su ciascuna riga.

IòUc ÏçSiXd¹iYç

Provalo

  • 1 byte salvato con l'aiuto di Oliver e altri 6 grazie a lui che ha indicato un modo migliore per generare l'array iniziale.

1

Carbone , 18 byte

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

Provalo online!


No, non puoi permettere a 05AB1E di battere Charcoal ...: P
totalmente umano il


Spazi bianchi iniziali purtroppo arbitrari non sono ammessi, altrimenti E…·?θ⁺× κ⪫× κιfarebbe il lavoro in 14 byte.
Neil,

@Neil È consentito uno spazio bianco principale, ma non sono sicuro di come ?ci sia entrato. Dovrebbe essere Ainvece penso. Oh aspetta, ohhhhh capisco cosa intendi.
Erik the Outgolfer,

1

Braingolf , 65 byte

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

Provalo online!

Minuscolo.

Contiene 1 spazio finale su ogni riga e una riga finale alla fine dell'output.



1

JavaScript, 102 94 byte

2 byte salvati grazie a 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 byte

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

Provalo online! Spiegazione:

^.
$&$&

Duplica la (prima) lettera.

}T`L`_L`^.

Ruotalo indietro di 1 nell'alfabeto o eliminalo se è un duplicato A. Continua a duplicare e ruotare fino a quando non dupliciamo A, a quel punto la cancellazione annulla la duplicazione e il ciclo si completa.

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

Sostituisci ogni lettera con una linea con la lettera imbottita su entrambi i lati.

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

Inserisci lettere duplicate tra tutte le coppie di spazi di riempimento a destra delle lettere esistenti.



1

Carbone , 15 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

 …·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.

Se il padding extra fosse legale, questo funzionerebbe per 14 byte:

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

Provalo online! Il collegamento è alla versione dettagliata del codice.


1

Mathematica, 70 byte

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

minuscolo

genera un elenco

grazie @ngenisis per le correzioni

Per la versione , posizionare Column@all'inizio


1

Excel VBA, 72 byte

Funzione di finestra immediata VBE anonima che accetta input dalla cella A1e output nella finestra immediata di VBE

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

1

Pyth , 17 byte

.e+*kd*+bdhk<GhxG

Provalo qui (bella versione stampata).


Come funziona?

  • hxG - Prende l'indice dell'input nell'alfabeto minuscolo.

  • <G - Taglia ogni carattere dopo l'inserimento dell'alfabeto.

  • .e- Mappa enumerata. Mappa sopra l'alfabeto ritagliato con gli indici come ke le lettere come b.

  • *kd- Aggiungi kspazi.

  • +bd- b+ uno spazio (la lettera corrente + spazio).

  • *...hk- Ripeti i k+1tempi.

  • +(...)(...) - Concatenare.


1
Una delle mie cose preferite di Pyth è scrivere una risposta e scoprire che qualcuno ha scritto la stessa risposta, personaggio per personaggio. Colpisce che Python "c'è una risposta migliore" spot perfettamente!
Dave,

@pizzakingme Sì, mi chiedo se posso fare di meglio
Mr. Xcoder il

l'aggiunta di spazio sembra sbagliata, penso che sia meglio possibile
Dave,

@pizzakingme Potrei ottenere .e+*kdjd*bhk<GhxGanche 17 byte
Mr. Xcoder il

16 byte:.e+*kd*+bdhkhcGQ
Dave,

1

C ++ (gcc) , 164 byte

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

Il mio primo tentativo dopo tanto tempo in agguato!

Codice non registrato di seguito:

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

Provalo online!


So che ci sono molte cose da fare sul golf, ma finora è la più piccola che ho avuto.
Drise,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.