Inscriptio Labyrinthica


22

Dans le lieu de sépulture du roi Silo des Asturies, il y a une inscription qui lit SILO PRINCEPS FECIT (le roi Silo a fait cela ).

SILO PRINCEPS FECIT

La première lettre se trouve au milieu, et de là on lit en allant dans n'importe quelle direction non diagonale rayonnant vers l'extérieur. La lettre finale se trouve aux quatre coins. Dans ce défi, vous généraliserez le processus pour les réaliser.

Contribution

Une chaîne ( ou équivalent ) et un entier. Vous pouvez faire les hypothèses suivantes sur l'entrée:

  • La chaîne aura une longueur impaire.
  • L'entier sera un nombre impair compris entre 1 et un de moins de deux fois la longueur de la chaîne.

Sortie

Un inscriptio labyrinthica pour la chaîne, en utilisant l'entier pour la hauteur ou la largeur (voir les modèles pour des exemples de hauteur). La sortie doit être chaque lettre sans espace, saut de ligne par défaut pour votre système / langue.

Cas de test

Notez qu'une entrée de 1 ou (longueur * 2 - 1) entraînera un palindrome horizontal ou vertical.

 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^

Notation

C'est le donc la réponse la plus courte en octets gagne. Failles standard interdites.



L'entrée peut-elle contenir des espaces? Si oui, comment devraient-ils être traités?
Nitrodon

1
Pouvons-nous prendre la saisie comme une liste de caractères?
Robin Ryder

1
@Charlie, vous avez clairement manqué toutes mes réponses Perl6 :-) J'attends une réponse de vous aussi car elle est inspirée par le cinquième roi d'Espagne (enfin, des Asturies, mais Asturies ye España, y tolo demás ye tierra conquistao haha)
user0721090601

1
Pouvons-nous prendre la largeur au lieu de la hauteur?
attinat

Réponses:


6

J , 27 octets

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

Essayez-le en ligne!

Un exemple clarifiera l'approche de haut niveau.

Considérer 'ABCDE' f 3

Nous remarquons que ce que nous recherchons est simplement la table "d'addition croisée" de 1 0 1et 3 2 1 0 1 2 3, qui ressemble à ceci:

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

Nous extrayons ensuite les indices de la chaîne d' origine: [{~.

Tout le reste du code est juste une arithmétique ennuyeuse et l'utilisation de i:pour construire les arguments 1 0 1et 3 2 1 0 1 2 3.


6

Gelée , 12 octets

Uṡṛ‘HɗŒBŒḄZY

Essayez-le en ligne!

Un lien dyadique prenant la chaîne comme gauche et la hauteur comme argument de droite. Renvoie une chaîne avec des sauts de ligne. Si une liste de chaînes était acceptable pour la sortie, je peux supprimer l' Yenregistrement final d'un octet. Fait intéressant, le «SILO PRINCEPS FECIT» me ressemble à l'art ASCII d'un diamant 3D quand je le regarde sur TIO.

Explication

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
J'ai cliqué sur l'essayer juste pour voir et oui, en effet, il fait de la 3D. Bizarre mais cool.
user0721090601

6

R , 93 91 87 octets

-2 octets grâce à Giuseppe. -4 octets en saisissant la largeur plutôt que la hauteur, comme le permet OP.

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

Essayez-le en ligne!

Prend la saisie comme vecteur de caractères. La partie clé est 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

(nous devons ensuite ajouter 1 car R est indexé sur 1.) Le 0 au centre est l'endroit où doit aller la première lettre de l'entrée.

Le reste est formaté.


5

Fusain , 25 19 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

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

Dessinez un quart de l'inscription.

‖O←↑

Réfléchissez pour terminer l'inscription.


1
Impressionnant! Je suis nouveau sur le site, je m'excuse à l'avance si ce qui suit sont quelques questions stupides. 1. Ce sont certainement 19 caractères, mais sont-ils également 19 octets? et 2. Dans quel encodage ce texte prendrait 19 octets?
damix911

Oui, encodé en UTF-8, cela prendra 19 caractères , mais en fait 51 octets. Avec UTF-16, cela prend encore 39 octets pour encoder.
ruohola

1
@ damix911 Charcoal a son propre encodage, qui peut être trouvé sur son wiki. Je pense que les caractères en dehors de la page de codes coûtent 3 octets. Le déverbosificateur essaie de calculer la longueur correcte mais cela ne dérange pas de transcrire le codage réel, ce qui est ennuyeux.
Neil

1
@Neil Okey, semble légitime!
ruohola

3

Japt -R , 19 16 octets

z
ò@VÔtXUaVÊ)êÃê

Essayez-le

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 octets

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

Essayez-le en ligne!

Prend la largeur en entrée.


1
@lirtosiast alors le premier gn'est pas évalué la première fois que la fonction est appelée. Essayez-le en ligne!
attinat

Intéressant, une idée de pourquoi cela semble fonctionner lorsque vous utilisez @@ ou @@@?
lirtosiast

@lirtosiast Il pense Print/@f[...]-> Print/@Transpose[g[...]]-> Transpose[Print@g[...]], par lequel le temps gest défini.
attinat

2

Japt -R , 10 octets

Ôã°Vz)mê ê

Prend de la largeur au lieu de la hauteur.

Essayez-le

Pseudocode (U est une chaîne, V est un entier):

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

Agréable! Je n'ai jamais pensé à essayer de le construire sur le côté.
Shaggy


2

Python 3, 104 octets

Je n'ai pas joué au golf depuis si longtemps ... Je suis sûr que cela pourrait être plus court.

Détails

Ce code définit une fonction qui prend deux arguments (la chaîne et la hauteur) et donne le résultat sur la sortie standard.

L'index dans la chaîne est la distance de Manhattan du centre de la grille. Pour une grille de largeur wet de hauteur h, la distance de la cellule à (x, y)est abs(x - (w - 1) / 2) + abs(v - (h - 1) / 2).

La largeur de la grille doit être telle que la distance Manhattan des coins (disons (0, 0)) soit inférieure de un à la longueur de la chaîne. En substituant (0, 0)à ce qui précède et en simplifiant, nous constatons que la largeur est simple 2 * len(s) - h.

Code

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

Essayez-le en ligne!



1

Pyth , 19 octets

L+_btbjyyM.:Q-lQ/E2

Essayez-le en ligne!

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 octets

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

Essayez-le en ligne!

La réponse la plus longue depuis si longtemps. :-) Il utilise la distance de Manhattan au centre de la place. Il doit cependant y avoir un chemin plus court.


1

Tcl , 188 170 162 octets

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

Essayez-le en ligne!

Il semble y avoir un million de mauvaises façons de résoudre ce problème dans TCL. Ce n'est pas le pire d'entre eux.

Économisé 18 octets minimum en convertissant en lambda (peut économiser jusqu'à 13 de plus si la valeur de retour d'une liste de lignes est acceptable)

Enregistré 8 supplémentaires depuis l'itérateur lmap a servi de constante supplémentaire


1

Toile , 18 octets

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

Essayez-le ici!

Canvas ne fait pas de sous-chaînes, je dois donc le traiter comme un objet d'art et obtenir une sous-section de cette façon. J'ai l'impression que cela me coûte 2 octets, mais bon, que pouvez-vous faire?

Il semble que cela ne fonctionne pas comme je le pensais: les fonctions de palindromisation de Canvas reflètent certains caractères (par exemple, V en miroir vertical devient ^), et je ne peux pas désactiver cela exactement ... eh bien, je suppose


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.