Inscriptio Labyrinthica


22

Nel luogo di sepoltura del re Silo delle Asturie c'è un'iscrizione che recita SILO PRINCEPS FECIT (il re Silo ha realizzato questo ).

SILO PRINCEPS FECIT

La prima lettera si trova nel mezzo, e da lì si legge andando in qualsiasi direzione non diagonale che si irradia verso l'esterno. La lettera finale si trova su tutti e quattro gli angoli. In questa sfida, generalizzerai il processo per realizzarli.

Ingresso

Una stringa ( o equivalente ) e un numero intero. È possibile formulare le seguenti ipotesi sull'input:

  • La stringa avrà una lunghezza dispari.
  • L'intero sarà un numero dispari compreso tra 1 e uno in meno del doppio della lunghezza della stringa.

Produzione

Un inscriptio labyrinthica per la stringa, usando il numero intero per l'altezza o la larghezza (vedi modelli per esempi di altezza). L'output dovrebbe essere ogni lettera senza spazi, interruzione di riga come impostazione predefinita per il sistema / lingua.

Casi test

Notare che un input di 1 o (lunghezza * 2 - 1) si tradurrà in un palindromo orizzontale o verticale.

 Input: FOO, 3    Input: BAR, 1    Input: BAR, 3    Input: BAR, 5

Output: OOO      Output: RABAR    Output: RAR       Output: R
        OFO                               ABA               A
        OOO                               RAR               B
                                                            A
                                                            R

 Input: ABCDE, 5   Input: ABCDE, 3   Input: *<>v^, 5

Output: EDCDE     Output: EDCBCDE           ^v>v^
        DCBCD             DCBABCD           v><>v
        CBABC             EDCBCDE           ><*<>
        DCBCD                               v><>v
        EDCDE                               ^v>v^

punteggio

Questo è quindi la risposta più breve in byte vince. Scappatoie standard vietate.



L'ingresso può contenere spazi? In tal caso, come devono essere gestiti?
Nitrodon,

1
Possiamo prendere input come un elenco di caratteri?
Robin Ryder,

1
@Charlie chiaramente ti sei perso tutte le mie risposte Perl6 :-) Mi aspetto anche una risposta da te poiché è ispirata al quinto re di Spagna (beh, di Asturies, ma Asturies ye España, y tolo demás ye tierra conquistao haha)
user0721090601

1
Possiamo prendere la larghezza anziché l'altezza?
attinat

Risposte:


6

J , 27 byte

([{~]+/&(|@i:)#@[-1+])-:@<:

Provalo online!

Un esempio chiarirà l'approccio di alto livello.

Ritenere 'ABCDE' f 3

Notiamo che quello che cerchiamo è semplicemente la tabella "addizione incrociata" di 1 0 1e 3 2 1 0 1 2 3, che assomiglia a questo:

4 3 2 1 2 3 4
3 2 1 0 1 2 3
4 3 2 1 2 3 4

Abbiamo poi tirare tali indici dalla stringa originale: [{~.

Tutto il resto del codice è solo noiosa aritmetica e l'uso di i:per costruire gli argomenti 1 0 1e 3 2 1 0 1 2 3.


6

Gelatina , 12 byte

Uṡṛ‘HɗŒBŒḄZY

Provalo online!

Un collegamento diadico che prende la stringa come sinistra e l'altezza come argomento destro. Restituisce una stringa con interruzioni di riga. Se un elenco di stringhe fosse accettabile per l'output, posso rimuovere il Ysalvataggio finale di un byte. È interessante notare che l'originale "SILO PRINCEPS FECIT" mi sembra l'arte ASCII di un diamante 3D quando lo guardo su TIO.

Spiegazione

U            | Reverse input
 ṡ   ɗ       | All overlapping substrings of the length given by:
  ṛ          | - The right argument
   ‘         | - Incremented by 1
    H        | - Halved
      ŒB     | Concatenate to the reverse, keeping a single copy of the last character (so creating a palindrome)
        ŒḄ   | Do the same, but this time using the lists of characters generated by the last atom
          Z  | Transpose
           Y | Join with newlines

2
Ho cliccato su provalo solo per vedere e sì, anzi, fa 3D. Strano ma fico.
user0721090601

6

R , 93 91 87 byte

-2 byte grazie a Giuseppe. -4 byte inserendo la larghezza anziché l'altezza, come consentito da OP.

function(s,W,w=W%/%2,h=length(s)-w-1)write(s[1+outer(abs(-w:w),abs(-h:h),`+`)],1,W,,"")

Provalo online!

Accetta input come vettore di caratteri. La parte chiave è s[1+outer(abs(-w:w),abs(-h:h),'+')].

wh(2w+1)×(2h+1)

(i,j)1+|ih|+|jw|abs(-w:w)abs(-h:h)abs(-h:h)[h,h1,h2,,2,1,0,1,2,,h1,h]outer(abs(-2:2), abs(-1:1), '+')

32123
21012
32123

(dobbiamo quindi aggiungere 1 perché R è indicizzato 1). Lo 0 al centro è dove dovrebbe andare la prima lettera dell'input.

Il resto sta formattando.


5

Carbone , 25 19 byte

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η‖O←↑

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

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η

Disegna un quarto dell'iscrizione.

‖O←↑

Rifletti per completare l'iscrizione.


1
Impressionante! Sono nuovo sul sito, mi scuso in anticipo se ciò che segue sono un paio di domande stupide. 1. Sono sicuramente 19 caratteri, ma sono anche 19 byte? e 2. In quale codifica quel testo richiederebbe 19 byte?
damix911,

Sì, codificato in UTF-8 questo richiederà 19 caratteri , ma in realtà 51 byte. Con UTF-16, questa codifica richiede ancora 39 byte .
ruohola,

1
@ damix911 Charcoal ha una sua codifica, che può essere trovata sul suo wiki. Penso che i caratteri al di fuori della code page costino 3 byte. Il deverbosificatore tenta di calcolare la lunghezza corretta ma non si preoccupa di trascrivere la codifica effettiva, il che è fastidioso.
Neil

1
@Neil Okey, sembra legittimo!
ruohola,

3

Japt -R , 19 16 byte

z
ò@VÔtXUaVÊ)êÃê

Provalo

z\nò@VÔtXUaVÊ)êÃê     :Implicit input of integer U & string V
z                     :Floor divide U by 2
 \n                   :Reassign result to U
   ò                  :Range [0,U]
    @                 :Map each X
     VÔ               :  Reverse V
       tX             :  Substring from index X to index ...
         Ua           :    Absolute difference between U and ...
           VÊ         :    Length of V
             )        :  End substring
              ê       :  Palindromise
               Ã      :End map
                ê     :Palindromise
                      :Implicit output, joined by newlines

2

Wolfram Language (Mathematica) , 57 54 byte

(g=Reverse@Rest@#~Join~#&)@BlockMap[g,#,⌈#2/2⌉,1]&

Provalo online!

Accetta la larghezza come input.


1
@lirtosiast quindi il primo gnon viene valutato la prima volta che viene chiamata la funzione. Provalo online!
attinat

Interessante, hai idea del perché sembra funzionare quando usi @@ o @@@?
Lirtosiast

@lirtosiast Pensa Print/@f[...]-> Print/@Transpose[g[...]]-> Transpose[Print@g[...]], con cui gviene definito il tempo .
attinat

2

Japt -R , 10 byte

Ôã°Vz)mê ê

Accetta larghezza anziché altezza.

Provalo

Pseudocodice (U è stringa, V è intero):

U.Reverse().AllSubstringsOfLength(++V / 2).Map(Palindromize).Palindromize

Bello! Non mi è mai venuto in mente di provare a costruirlo lateralmente.
Shaggy,


2

Python 3, 104 byte

Non gioco a golf da così tanto tempo ... Sono sicuro che potrebbe essere più breve.

Dettagli

Questo codice definisce una funzione che accetta due argomenti (la stringa e l'altezza) e fornisce il risultato sull'output standard.

L'indice nella stringa è la distanza di Manhattan dal centro della griglia. Per una griglia di larghezza we altezza h, la distanza per la cella (x, y)è abs(x - (w - 1) / 2) + abs(v - (h - 1) / 2).

La larghezza della griglia deve essere tale che la distanza di Manhattan degli angoli (diciamo, (0, 0)) sia inferiore alla lunghezza della corda. Sostituendo (0, 0)quanto sopra e semplificando, scopriamo che la larghezza è semplicemente 2 * len(s) - h.

Codice

def b(s,h):
 w=2*len(s)-h
 for y in range(h):print(''.join(s[abs(x-w//2)+abs(y-h//2)]for x in range(w)))

Provalo online!



1

Pyth , 19 byte

L+_btbjyyM.:Q-lQ/E2

Provalo online!

L+_btbjyyM.:Q-lQ/E2   Implicit: Q=string, E=height
L                     Define a function, y(b):
  _b                    Reverse b
 +  tb                  Append all be first element of b
                      y is now a palindromisation function
              lQ      Length of Q
             -  /E2   Subtract floored division of E by 2
          .:Q         All substrings of Q with the above length
        yM            Palindromise each substring
       y              Palindromise the set
      j               Join on newlines, implicit print



1

C # (.NET Core) , 146 byte

s=>n=>{int w=s.Length*2-n,i=0,j;var r=new char[n,w];for(;i<n;i++)for(j=0;j<w;)r[i,j]=s[System.Math.Abs(n/2-i)+System.Math.Abs(w/2-j++)];return r;}

Provalo online!

La risposta più lunga così a lungo. :-) Usa la distanza di Manhattan dal centro della piazza. Tuttavia, ci deve essere un modo più breve.


1

Tcl , 188 170 162 byte

{{w s} {join [lmap C [lrepeat $w string] {join [$C reverse [set y [$C range $s [set x [expr abs($w/2+1-[incr i])]] end-[expr $w/2-$x]]]][$C range $y 1 end]}] \n}} bytes

Provalo online!

Sembra che ci siano un milione di modi sbagliati per golfare questo problema in TCL. Questo non è il peggiore.

Risparmiato almeno 18 byte convertendo in lambda (è possibile salvare fino a 13 in più se il valore di ritorno di un elenco di righe è accettabile)

Ne sono stati salvati altri 8 poiché l'iteratore lmap ha funzionato come costante aggiuntiva


1

Tela , 18 byte

±X↕┌L╵┌-Y{x;1y1@]┼

Provalo qui!

Canvas non esegue sottostringhe, quindi ho bisogno di trattarlo come un oggetto d'arte e ottenere una sottosezione in quel modo. Sento che questo mi costa 2 byte, ma hey, cosa puoi fare.

Sembra che in realtà non funzioni come pensavo: le funzioni palindromize di Canvas rispecchiano determinati caratteri (ad es. V specchiata verticalmente diventa ^), e non riesco proprio a disabilitarlo ... vabbè, immagino


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.