Dessine l'alphabet en dents de scie

42

Un simple aujourd'hui. Ecrivez le programme le plus court qui dessine un "alphabet en dents de scie" avec un entier positif pour la hauteur. Vous devez écrire le nom de votre langage de programmation lorsque vous arrivez à la lettre par laquelle il commence.

Par exemple, si votre langage est Python et que l’entrée est 1la sortie, elle devrait être:

ABCDEFGHIJKLMNOPythonQRSTUVWXYZ

Si l'entrée est 2la sortie devrait être:

 B D F H J L N Python R T V X Z
A C E G I K M O      Q S U W Y

Si l'entrée est 4la sortie devrait être:

   D     J     Python     V
  C E   I K   O      Q   U W
 B   F H   L N        R T   X Z
A     G     M          S     Y

Remarques

  • A commence toujours en bas à gauche.
  • L'entrée peut être via stdin ou appel de fonction ou similaire. Sortie sur stdout.
  • L'entrée ci 26- dessus n'a pas besoin de fonctionner.
  • Pas d'espaces de fuite.
Les passe-temps de Calvin
la source
9
Les langages de programmation avec des noms à une lettre sont-ils autorisés? (C, J, K, etc.)
jeudi
@isaacg Bien sûr. J'imagine que cela pourrait être plus facile en eux.
Les passe-temps de Calvin
1
Peut-on simplement s’attendre à ce que l’entrée soit stockée dans une variable?
Martin Ender
@ MartinBüttner Oui, c'est bien.
Les passe-temps de Calvin
13
Au fait, ce n'est pas une onde en dents de scie, c'est une onde triangulaire: P
qwr

Réponses:

14

si n tient la hauteur:

Codes d'échappement C +: 81

x;main(y){for(y=n--;x<26;x++)printf("\033[%d;%dH%c",n?x/n&1?y++:y--:y,x+1,x+65);}

C: 110

x;char a[702]={[0 ...701]=32};main(y){for(y=--n;x<26;a[x*27-1]=10)a[27*(n?x/n&1?y++:y--:y)+x]=x+++65;puts(a);}
bebe
la source
5
J'admets la défaite. Quoi sur terre? : D
Martin Ender
Puis-je demander des instructions de compilation? ccdonne l'erreur "<bebe.c: 1: 17: erreur: 'n' non déclaré (première utilisation dans cette fonction)”.
manatwork
2
Eh bien, c'est bien pire qu'il n'y parait. tout d'abord, le second contient des espaces de fin, ensuite, ils s'appuient tous les deux sur nune variable globale définie sur le nombre de votre choix (comme l'a déjà demandé Martin).
bebe
Oh, je dois donc fournir n de toutes les manières possibles. Lol. Toujours impressionné.
manatwork
19

C, 134

n,m,c,p;
main(r){
for(scanf("%d",&n),m=--n?n*2:1;n+r--;puts(""))
for(c=-1,p=1;c++<25;)
p+=(c-n-r)%m*((c-n+r)%m)?1:1-printf("%*c",p,c+65);
}

Compile sur gcc avec quelques avertissements. Les nouvelles lignes ne sont pas incluses dans le nombre de caractères.

122 caractères si l'entrée est déjà stockée dans n.

Merci à user2992539 , tolos et edc65 pour des améliorations.

grc
la source
3
Vous pouvez utiliser puts("")au lieu de printf("\n").
Somnium
2
Enregistrer 4 caractères avec p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);au lieu deif((c-...
1
Désolé pour le commentaire précédent (supprimé). J'avais tort. Jouer avec les signes et abuser du fait que le premier argument de main est 1 s'il n'y a pas de paramètre: 134n,m,c,p; main(r){ for(scanf("%d",&n),m=--n?n*2:1;n+r--;puts("")) for(c=-1,p=1;c++<25;) p+=(c-n-r)%m*((c-n+r)%m)?1:1-printf("%*c",p,c+65); }
edc65
13

TI-BASIC - 148 octets (texte brut), 186 octets (graphique)

En réponse au PO, la merveilleuse TI-83 (et plus récente) est livrée avec une taille de 16 x 8 (en utilisant seulement le texte large standard) ou avec une taille de 94 x 62 pixels (qui avec un petit texte vaut environ 10 lignes ).

Maintenant, cela a un petit problème (pour lequel je voudrais des éclaircissements). Les impositions de taille ne peuvent pas être "ignorées" par l'interprète; en d'autres termes, si nous essayions de régler la hauteur de la dent de scie à 20, cela produirait une erreur empêchant l'exécution complète du code. Je pourrais écrire du code qui, dans un environnement infini, produirait la sortie correcte, à moins qu'il ne s'exécute pas sur la machine.

Ceci étant dit, je vous présente les versions (en cours d'exécution) des programmes. Ils dépendent tous de la variable Nétant définie à la hauteur souhaitée dans les lignes avant d'exécuter:

  • Approche texte brut

    :ClrHome
    :"ABCDEFGHIJKLMNOPQRSTI-BASICUVWXYZ"→Str1
    :8→R
    :For(C,1,16
    :If N=1
    :Then
    :0→F
    :Else
    :If R<2 or 10-R>N
    :1→F
    :If R>7
    :-1→F
    :End
    :If C≠20
    :Then
    :Output(R,C,sub(Str1,C,1
    :Else
    :Output(R,C,sub(Str1,C,8
    :C+7→C
    :End
    :R+F→R
    :End
    

    Pour faire ce travail quel que soit le terminal, le changement For(C,1,16de For(C,1,33et retirer le contrôle majorant ( R<2 or). Voici la sortie avec 5→N:

    entrez la description de l'image ici

  • Approche graphique (cela peut aussi nécessiter AxisOffde la clarté)

    :ClrDraw
    :N*6→N
    :"ABCDEFGHIJKLMNOPQRSTI-BASICUVWXYZ"→Str1
    :57→R
    :For(C,1,56
    :If N=6
    :Then
    :0→F
    :Else
    :If R<7 or 64-R>N
    :6→F
    :If R>51
    :-6→F
    :End
    :If C≠20
    :Then
    :If C>50
    :Then
    :Text(R,C,sub(Str1,C-23,1
    :Else
    :Text(R,C,sub(Str1,C,1
    :End
    :Else
    :Text(R,C,sub(Str1,C,8
    :C+30→C
    :End
    :R+F→R
    :End
    

    Celui-ci fonctionne bien, avec deux bizarreries mineures. La hauteur est toujours un problème, bien que la largeur ne soit pas. Cependant, je n'ai pas espacé les lettres, de sorte que dans certains cas (lorsque la lettre commence à remonter ou à diminuer en dents de scie), les lettres peuvent être découpées par leurs successeurs. Pour que cela fonctionne quel que soit le terminal, supprimez la coche de la limite supérieure ( R<7 or). Suit ensuite le graphique:

    entrez la description de l'image ici

Doktoro Reichard
la source
Maintenant, je dois porter ceci sur ma calculatrice graphique
Liam McInroy le
Commentaire rapide: Au lieu de 0→Fvous pouvez faire Delvar Fce qui enregistre 1 octet une fois tokenisé. Aussi, je suis sûr que vous pouvez factoriser la sortie / le texte vers la fin grâce à une condition de test booléen en ligne pour la coordonnée, et pour le C+7→C, écrivez-le dans un court si (no then / else / end)
Adriweb
11

Pure Bash (no coreutils), 181 octets

m=$1
for l in A Bash {C..Z};{
((m))||s=++
((m>$1-2))&&s=--
for((m=$1==1?1:m,m$s,i=0;i<$1;i++));{
((i-m))&&a[i]+=${l//?/ }||a[i]+=$l
}
}
shopt -s extglob
printf %s\\n "${a[@]%%+( )}"

Sortie:

Piped to cat -Ejuste pour prouver qu'il n'y a pas de saut de ligne.

$ ./sawtooth.sh 1 | cat -E
ABashCDEFGHIJKLMNOPQRSTUVWXYZ$
$ ./sawtooth.sh 5 | cat -E
       E       M       U$
      D F     L N     T V$
     C   G   K   O   S   W$
 Bash     H J     P R     X Z$
A          I       Q       Y$
$ 
Trauma numérique
la source
10

JavaScript (ES6) 231 244

Éditer le correctif, une nouvelle commande et une façon différente de gérer height == 1
De plus, changé pour une fonction comme cela est autorisé par l'OP, donc pas d'invite () pour l'entrée

Aucun changement à l'algorithme général qui n'est probablement pas le meilleur pour ce défi

F=h=>{for(p=s=[i=z=b=t=''];++p<h;)i=1,z=b=' ',s[p]=t;for(p=--h,k=64;++k<91;)s[p]+=t+String.fromCharCode(k),k-74||(s=s.map((x,q)=>x+(p-q?'         ':'avascript'))),p-=i,p<0|p>h?(i=-i,p-=i+i,t=z,b=t+t):t+=b;console.log(s.join('\n'))}

A expliqué

F=h=>{
  // row in s for output must be initialized to ''. In the same step I make other initializations
  for(p=s=[i=z=b=t='']; ++p < h;) // initialize for height 1, all increment and spacing can be null
    i=1,z=b=' ',s[p]=t; // the for body is entered only if height > 1, initializing spacing and increment to the right values
  for(p=--h,k=64;++k<91;)
    s[p]+=t+String.fromCharCode(k),
    k-74||(s=s.map((x,q)=>x+(p-q?'         ':'avascript'))), // if 'J' modify each line of output adding the name or spacing
    p-=i,p<0|p>h?(i=-i,p-=i+i,t=z,b=t+t):t+=b; // index bouncing
  console.log(s.join('\n'))
}

Exemples

1

ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ

3 monter

  C   G            K   O   S   W
 B D F H Javascript L N P R T V X Z
A   E   I            M   Q   U   Y

4 sur le dessus

   D     Javascript     P     V
  C E   I          K   O Q   U W
 B   F H            L N   R T   X Z
A     G              M     S     Y

7 descendant

      G                    S
     F H                  R T
    E   I                Q   U
   D     Javascript     P     V
  C                K   O       W
 B                  L N         X Z
A                    M           Y
edc65
la source
9

JAVA (393)

Comme toujours une excellente langue pour le golf:

public class P{public static void main(String[]a){int h=Integer.valueOf(a[0]);String x="ABCDEFGHIJKLMNOPQRSTUVWXYZ";String[]l=new String[h];Arrays.fill(l,"");int i=h-1;int d=-1;for(char c:x.toCharArray()){for(int n=0;n<l.length;n++){String k=(n==i)?(c=='J')?"Java":c+"":(c=='J')?"    ":" ";l[n]+=k;}if(i==0&&d==-1)d=1;if(i==h-1&&d==1)d=-1;if(h>1)i+=d;}for(String s:l){System.out.println(s);}}}
Thomas Rüping
la source
2
Malheureusement, vous avez oublié l'importation pour java.util.Arrays;. :-(
Justin
Mais vous pouvez importer votre code: éliminez String x="ABC...Z";et remplacez l'en- for(char c...tête de la boucle par for (char c=65;++c<91;){, j'adore les caractères en Java =)
flawr le
En outre, vous pouvez remplacer c=='J'par c==74, enregistre deux octets supplémentaires au total.
Flawr
2
Je suis sûr que vous pouvez faire encore mieux si vous condensez les si vous utilisez des XOR pour ces instructions if, mais voici ma version améliorée: (325) public class p{public static void main(String[]a){int h=Integer.valueOf(a[0]),i=h-1,d=-1,n;String[]l=new String[h];for(n=0;n<h;l[n++]="");for(char c=64;++c<91;){for(n=0;n<h;n++){String k=n==i?c==74?"Java":c+"":c==74?" ":" ";l[n]+=k;}if(i==0&d==-1)d=1;if(i==h-1&d==1)d=-1;i+=h>1?d:0;}for(String s:l)System.out.println(s);}}@Quincunx: plus besoin de importer.util.Arrays; =)
flawr
9

Ruby, 112 octets

o="#{' '*29}
"*h
26.times{|i|o[(h-i%(h<2?1:2*h-2)-1).abs*30+i+(i>17?3:0)]=(i+65).chr}
puts o.gsub('R   ','Ruby')

S'attend à ce que l'entrée soit stockée dans h.

Faites-moi savoir si cela nécessite une clarification.

Martin Ender
la source
Très mineur mais vous pouvez supprimer l'espace après %.
Les passe-temps de Calvin
@ Calvin'sHobbies Ha, je n'avais pas confiance en ma syntaxe soulignant: D. Va le réparer plus tard.
Martin Ender
Vous pouvez remplacer puts o...par $><<o....
Jordanie
6

J: 75 octets

NB. without IO |:26([:u:65+i.@[)`(($(,|.@}.@}:)@i.)<"1@,.i.@[)`(' '$~,~)}5
2(1!:2)~|.26([:u:65+i.@[)`(($(,|.@}.@}:)@i.)<"1@,.i.@[)`(' '$~,~)}".1!:1[1

Utilisation de la merveilleuse modification Amend . Comme d'habitude, les entrées-sorties sont laides et maladroites, sans entrer dans les détails. La solution de base prend 3 gérondages (une sorte de verbe nominal).

  • a) générer l'alphabet
  • b) générer les indices
  • c) générer la matrice pour compenser

    x (a bc}) y

a) est une recherche assez triviale dans la table ascii

c) est encore plus trivial

b) est l'intéressant. Le moral est que les indices horizontaux sont censés commencer à partir de 0 et passer à y-1, puis redescendre, ce qui est répété 26 fois. Par exemple. pour y == 4:

0 1 2 3 2 1 0 1 2 3 2 1 ...

La mise en œuvre de ceci donne pour b):

($(,|.@}.@}:)@i.) <"1@,. i.@[)       NB. is equivalent too
(tine0 tine1 tine2)                  NB. a fork with tines defined as
tine0 =: 
  hook0 =: hook0_0 hook0_1           NB. a dyadic hook: x (g h) y -: x g h y
     hook0_0 =: $                    NB. reshape
     hook0_1 =: (hook1_0 hook1_1)@i. NB. do hook1 after making 0-y
       hook1_0=: ,                   NB. append to self
       hook1_1=: |.@}.@}:            NB. rotated version of y after beheading and curtailing
tine2 =: i.@[                  NB. generate 0-x
tine1 =: <"1@,.                NB. glue together coordinates.

Et oui, fait pratique: le nom de J est ... "J".

jpjacobs
la source
Vaut-il la peine d’utiliser Amend? Il me semble plus facile de dire quelque chose comme 3 :'|:(26$1+(i.1=y),}:|i:<:y)|.@{."+u:65+i.26'La partie laide de cette solution concerne les 8 caractères correspondant à la taille 1, mais cela peut probablement être un peu raccourci.
b_jonas
Merci pour la suggestion! Le vôtre est en effet beaucoup plus court, et modifier est probablement excessif. Puisque c'est si différent, vous voudrez peut-être l'afficher vous-même comme solution?
jpjacobs
La spécification dit "pas d'espaces de fin" et ma solution imprime les espaces de fin.
b_jonas
5

R (204)

f=function(x) {
  m=matrix(" ",x,26)
  i=x
  d=ifelse(x==1,0,-1)
  for (j in 1:26) {
    m[i,j]=LETTERS[j]
    if (!((i+d) %in% 1:x)) d=-d
    i=i+d
  }
  for (i in 1:x) cat(m[i,],"\n",sep="")
}

Résultat

> f(1)
ABCDEFGHIJKLMNOPQRSTUVWXYZ
> f(2)
 B D F H J L N P R T V X Z
A C E G I K M O Q S U W Y 
> f(3)
  C   G   K   O   S   W   
 B D F H J L N P R T V X Z
A   E   I   M   Q   U   Y 
> f(7)
      G           S       
     F H         R T      
    E   I       Q   U     
   D     J     P     V    
  C       K   O       W   
 B         L N         X Z
A           M           Y 
Djhurio
la source
Je vois ce que tu as fait là! Très intelligent ...
Kroltan
1
+1 Neat! Vous pouvez cependant vous débarrasser des espaces autour de vos fordéclarations ( for(i in 1:x)cat(...par exemple) ou de celui qui les entoure %in%.
Plannapus
3

Javascript - 248 224 235

z=~~prompt(),y="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");y[9]="Javascript";for(w=[],v=0;v<z;v++)w[v]="\n";v--;for(i=0;i<26;i++){for(j=0;j<z;j++)w[j]+=j-v?i-9?" ":"          ":y[i];~~(i/(z-1))%2?v++:v--;}if(z==1)w=y;console.log(w.join(""))

Voici un lien vers le jsfiddle, où vous pouvez le tester.
edit: Création d'un journal de console pour une police à espacement fixe et suppression des virgules si une entrée == 1.

Izlin
la source
Suggestions: 1: parseInt et Math.floor peuvent être tous deux modifiés avec une opération de contrainte de type entier telle que |0ou ~~. 2: il est plus court de construire le tableau w directement, sans split. for(w=[],v=0;v<z;v++)w[v]="\n";
Edc65
... et il n'y a pas d'instruction de sortie (console.log ou ce que vous utilisez dans votre violon, cela fait partie du nombre de caractères)
edc65
@ edc65 Merci pour les conseils. Vous aviez raison, j'avais oublié la sortie ici, j'ai donc ajouté une alerte, mais il n'y a pas de police mono-espacée, donc ça a l'air plutôt chaotique.
izlin le
@izlin Au lieu de (i==9?" ":" ")vous pourriez utiliser (i^9?" ":" "), ce qui enregistre un caractère.
rev
1
AIDEZ-MOI! quelqu'un peut-il expliquer? (Pourquoi est - il deux fois <code> v = 0 </ code>?)
flawr
3

Perl 119

$s.=/26/?++$r&&$/:$m-1&&$r-abs$_%(2*$m-2)+1-$m?$"x(1+3*/15/):/15/?Perl:(A..Z)[$_]for(0..26)x($m=<>);print$s=~s/\s+$//rg

Ce programme prend l’entrée de STDINet affiche le résultat dans STDOUT.

Et bonus - une version qui va à l’encontre des règles car elle affiche des espaces de fin, mais ajoute une interaction:

#!/usr/bin/perl -p
$r=0;$_=join'',map{/26/?++$r&&$/:$m-1&&$r-abs$_%(2*$m-2)+1-$m?$"x(1+3*/15/):/15/?Perl:(A..Z)[$_]}(0..26)x($m=$_)

... et quelques tests ci-dessous:

1
ABCDEFGHIJKLMNOPerlQRSTUVWXYZ
2
 B D F H J L N Perl R T V X Z
A C E G I K M O    Q S U W Y
4
   D     J     Perl     V
  C E   I K   O    Q   U W
 B   F H   L N      R T   X Z
A     G     M        S     Y
6
     F         Perl         Z
    E G       O    Q       Y
   D   H     N      R     X
  C     I   M        S   W
 B       J L          T V
A         K            U
core1024
la source
3

J, 67 57 61 caractères

echo@dtb"1@|.@|:@(26&,$(u:65+i.26)#~1 j.26$(0#~1=]),<:#-&0 2)

Utiliser comme fonction:

   echo@dtb"1@|.@|:@(26&,$(u:65+i.26)#~1 j.26$(0#~1=]),<:#-&0 2)
   D     J     P     V
  C E   I K   O Q   U W
 B   F H   L N   R T   X Z
A     G     M     S     Y

Explication: cette solution utilise une approche différente de l’autre solution J. Au lieu de générer une onde en dents de scie 0 1 2 3 2 1 0 1 ... , j'ai examiné l'espacement entre les lettres consécutives. Par exemple, pour n = 4, si vous passez du A au maximum, passez à la deuxième colonne et atteignez B, vous trouverez quatre espaces entre A et B. Ce modèle d’espacement entre les lettres est très régulier: pour n = 4, le motif est 4 4 4 2 2 2 4 4 4 ... .

L’idée est donc d’abord de construire le tableau aplati (et transposé), puis de le remodeler et de le retourner afin qu’il ait l’air juste. La routine de sortie est simple (pour être J, au moins): dtb est "supprime les blancs" et "1"opère sur chaque ligne". dtb et echo sont tous deux fournis par la bibliothèque standard.

Merci à Zsbán Ambrus pour son aide au golf.

Luciole
la source
3

MetaPost (207)

numeric h,d,y;h=5;d=-1;y=1;u=5mm;pair p;string s;for x=1upto26:p:=(x,y)*u;s:=char(x+64);if x=13:s:="MetaPost";elseif x>13:p:=(x+2,y)*u;fi;label.rt(s,p);if(y=h)or(y=1):d:=d*-1;fi;if h=1:d:=0;fi;y:=y+d;endfor;

entrez la description de l'image ici

Vous pouvez l'essayer ici.

flawr
la source
2

Bash (213) (223)

read i
p=0
d=1
printf '\n%.0s' `seq $i`
for l in {A..Z}
do (($p==$i-1))&&((p=$p*-1))
(($i==1))&&p=0
(($p!=0))&&echo -en "\033[s\033[${p#-}A"
[[ "$l" == "B" ]]&&l="Bash"
echo -en $l"\033[s\033[${p#-}B"
((p++))
done

Réglages mineurs et nous sommes à 213.

L'original avait un bug mineur. Testé et confirmé pour fonctionner sur la version 4.2.37 de Bash.

Merci à @manatwork pour avoir signalé le bogue et quelques astuces.

Ok
la source
J'ai modifié votre message en y ajoutant la surbrillance syntaxique, mais je vois maintenant qu'il a mal mis en évidence une partie de votre code en tant que commentaire. Je l'ai donc restauré. Je viens de dire ceci au cas où vous vous demandiez pourquoi je l'ai annulée :)
ProgramFOX
@ProgramFOX C'est bon. Merci quand même!
Ok
Je pense qu'il y a un bug mineur quelque part, car la sortie décroît lentement. (Au moins dans Bash 4.3.) Quelques améliorations mineures visant à réduire la taille à 194 caractères: omettez le sigil dans l'évaluation arithmétique, n'essayez pas de faire une double citation à l'intérieur d'une chaîne entre guillemets: pastebin.com/zKa3zdwR
manatwork
Pouvez-vous utiliser des nouvelles lignes au lieu de quelques unes ;simplement pour le rendre un peu plus lisible? Cela n'affectera pas votre score au golf
Digital Trauma
2

Haskell - 432 octets (malheureusement ...)

Cela s'est avéré être beaucoup plus difficile que ce à quoi je m'attendais, donc le nombre d'octets important. Je suis sûr que je (ou quelqu'un) pourrait faire mieux, mais j'ai passé trop de temps là-dessus. La version golfée est la suivante:

import Data.Matrix
import Data.Vector(toList)
r=repeat
s h=y h$l(take 26(case h of 1->r 1;_->concat$r$[h,h-1..1]++[2..h-1]))['A'..'Z']$matrix h 32(const ' ')<|>matrix h 1(const '\n')
l _[]m=m
l(x:i)(r:e)m=l i e$u m(let z=26-length i in if z<9 then z else z+6)x r
l _ _ m=m
u m c r h=case h of 'H'->t c r"Haskell"m;_->setElem h(r,c)m
t _ _[]m=m
t c r(x:i)m=t(c+1)r i$setElem x(r,c)m
y h m=concat[toList$getRow x m|x<-[1..h]]

Pour exécuter, charger le code dans ghciet exécuter putStr $ s IntIntest la hauteur désirée. Vous pouvez aussi ajouter

import System.Environment
main :: IO ()
main = fmap (s . read . head) getArgs >>= putStr

sous le imports dans un fichier texte, compilez-le avec ghcet passez la hauteur en argument de ligne de commande. Version non-golfée:

import System.Environment
import Data.Matrix
import Data.Vector (toList)

main :: IO ()
main = fmap (sawtooth . read . head) getArgs >>= putStr

type M = Matrix Char

sawtooth :: Int -> String
sawtooth height = let mat     = matrix height 32 (const ' ') <|> matrix height 1 (const '\n')
                      numbers = take 26 (case height of 1 -> repeat 1
                                                        _ -> concat $ repeat $ [height,height-1..1]++[2..height-1])
                      chars   = ['A'..'Z']
                  in toString height $ makeMatrix numbers chars mat

makeMatrix :: [Int] -> String -> M -> M
makeMatrix []     []     mat = mat
makeMatrix (x:xs) (s:ss) mat = makeMatrix xs ss $ updateMatrix
                                                    mat (let z = 26 - length xs in if z < 9 then z else z + 6) x s
makeMatrix _      _      mat = mat

updateMatrix :: M -> Int -> Int -> Char -> M
updateMatrix mat col row char = case char of 'H' -> insertHaskell col row "Haskell" mat
                                             _   -> setElem char (row, col) mat

insertHaskell :: Int -> Int -> String -> M -> M
insertHaskell _   _   []     mat = mat
insertHaskell col row (x:xs) mat = insertHaskell (col+1) row xs $ setElem x (row, col) mat

toString ::Int -> M -> String
toString height mat = concat [ toList $ getRow x mat | x <- [1..height] ]
DrJPepper
la source
Je crois que vous pouvez remplacer constpar pure(en utilisant l'instance Applicative pour les fonctions) pour économiser quelques octets.
Fruit Esolanging
2

C # / LINQ:

using System;
using System.Linq;

namespace SawtoothAlphabet
{
    class Program
    {
        static void Main(string[] args)
        {
            int N = Int32.Parse(args[0]);   // eg 4
            Console.WriteLine(
                String.Join(Environment.NewLine, Enumerable.Range(0, N).Select(line =>
                    String.Concat(Enumerable.Range(0, 26).Select(i =>
                        line == Math.Abs(i % (2 * (N - 1)) - (N - 1))
                            ? (i == 2) ? "C#" : Char.ConvertFromUtf32(i + 'A')
                            : (i == 2) ? "  " : " ")
            ).TrimEnd())));
        }
    }
}

Brève explication: Enumerable.Range(0, N).Select(...)une chaîne est générée pour chaque ligne qui est finalement concaténée en une seule chaîne avec String.Join(Environment.NewLine, ...). Pour chaque ligne, nous parcourons les 26 caractères avec Enumerable.Range(0, 26).Select(...), le test au début de l'expression lambda détermine s'il faut générer un caractère ou un espace pendant que le i==2contrôle de "C" et le convertit en "C #" ou en deux espaces en fonction de la ligne. . Le String.Concat(...)convertit le résultat IEnumerable<char>pour chaque ligne en une chaîne avant de la passer afin TrimEnd(...)d'éliminer proprement tous les espaces finaux.

Mark Feldman
la source
1

PHP (216) (205)

Nouvelle version:

$b=array_fill(65,26,' ');$b[80]='   ';$b=array_fill(0,$i,$b);for($j=--$i,$x=64;++$x<91;$i||$j=0){$b[$j][$x]=chr($x);$x==80&&$b[$j][$x]='PHP';$j+=($d=$j<($d?$i:1))*2-1;}echo join("\n",array_map('join',$b));

Ancienne version:

$b=array_fill(0,$i,array_fill(0,28,' '));for($j=--$i,$x=-1;++$x<28;$i||$j=0){$q=&$b[$j];$q[$x]=chr($x-($x&16)/8+65);$x==15&&($q[++$x]='H')*$q[++$x]='P';$j+=($d=$j<($d?$i:1))*2-1;}echo join("\n",array_map('join',$b));

s'attend à ce que la variable $ i soit à la hauteur.

Christoph
la source
1

C, 214 169 octets, pas d'espaces de fin

Merci à @ edc65 et @tolos pour leurs suggestions utiles.

#define C ((c-i+n-65)%z&&(c+i+n-67)%z)
n,i,m,c,z;main(){scanf("%d",&n);z=n<2?1:2*n-2;for(;i++<n;){for(m=c=64;c++<90;)m=C?m:c;for(c=64;c++<m;)putchar(C?32:c);puts("");}}
un terrain
la source
3
C'est une bataille perdue, mais je persiste: #include <stdio.h> n'est pas nécessaire dans de nombreux cas, que ce soit gcc ou tout autre compilateur. C'est standard et valide C de toute façon.
Edc65
2
@ edc65: Cela dépend de ce que vous considérez comme "un C valide". C’est une référence AFAIK valide, mais ANSI / ISO C exige que les prototypes de fonctions variadiques (qui incluent scanfet printf), sinon vous obtiendrez un comportement indéfini. #include <stdio.h>est, bien sûr, le moyen le plus rapide de donner un prototype à la fois scanfet printf.
celtschk
@celtschk valide K & R me suffit en code golf. Et «dans de nombreux cas» (lorsqu’on utilise seulement des options de vente) correspond à C89. Ce que je veux souligner, c’est que ce n’est pas un comportement étrange de gcc. (Merci pour la note sur les fonctions variadiques, quand même)
edc65
1
Les globales sont de type int et initialisées à zéro. Autant renoncer à la intdéclaration de main si vous ne retournez rien. Peut laisser tomber des parens supplémentaires, remplacer ' 'par 32et if(!C)m=cavec une déclaration ternarny, et comme je viens de l’apprendre (ci-dessus), remplacer printf("\n")par puts("")pour 18 caractères:n,i,m,c,z;main(){;scanf("%d",&n);z=n<2?1:2*n-2;for(;i<n;i++){for(m=c=65;c<91;c++)m=C?m:c;for(c=65;c<=m;c++)printf("%c",C?32:c);puts("");}}
1

Javascript ( 204 185 150)

h=m=4;d=h>1?-1:0;o=[];for(a=0;a<35;a++){for(r=h;r;r--)o[r]=(o[r]||"")+(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(a<9||a>17){m+=d;if(m<2||m==h)d=-d}}console.log(o.join("\n"))

MODIFIER

Sauvegardé 13 octets en ne construisant pas de tableau et .join ("\ n"). Obligatoire de retourner les boucles for. Puis, avec l’aide de fils de codage C, le code est devenu trop intelligent pour économiser 12 octets supplémentaires.

Voici la version lisible montrant le changement de logique.

for (row = height; row; row--) {
    rowOfNextActiveLetter = 1;
    direction = height > 1 ? -1 : 0;
    output = "";
    for (a = 0; a < 35; a++) {
        output += (row == rowOfNextActiveLetter ? "ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a] : "");
        if (a < 9 || a > 17) {
            rowOfNextActiveLetter -= direction;
            if (rowOfNextActiveLetter < 2 || rowOfNextActiveLetter == height)direction = -direction
        }
    }
    console.log(output)
}

Golfé (161):

for(r=h;r;r--){m=1;d=h>1?-1:0;o="";for(a=0;a<35;a++){o+=(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(a<9||a>17){m-=d;if(m<2||m==h)d=-d}}console.log(o)}

Golfé et obscurci (149):

for(r=h;r;r--,console.log(o))for(m=1,d=h>1?1:0,o="",a=0;a<35;)if(o+=r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ",a<9|a++>17)d=(m+=d)<2|m==h?-d:d
John Nowlin
la source
J'aime ça même si je ne le comprends pas à fond. Mais de toute façon, vous pouvez couper 9 caractères en enlevant le substrat et en utilisant un index direct .substr(a,1)=>[a]
edc65
Vous pouvez le réduire davantage en utilisant des opérateurs au niveau des bits et des itérateurs coalescents pour 182: h=m=4;d=1<h?-1:0;o=[];for(a=0;35>a;a++){for(r=h;r;r--)o[r]=(o[r]||"")+(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(9>a|17<a)if(m+=d,2>m||m==h)d=-d}console.log(o.join("\n"))
WallyWest
whoops, nettoyé un trop d'espaces
John Nowlin
1

K, 60 octets

`0:'{+{x!y}.'+(26#{(!x),|1_!x-1}x;(((x-1)#" "),)'`c$65+!26)}

Assez simple, et il semble que je viens de sortir de la solution J. :)

Tout d'abord, générez un alphabet:

  `c$65+!26
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Et une onde en dents de scie de longueur appropriée:

  26#{(!x),|1_!x-1}5
0 1 2 3 4 3 2 1 0 1 2 3 4 3 2 1 0 1 2 3 4 3 2 1 0 1

Tapotez chaque lettre de l'alphabet en commençant par les espaces:

  (((5-1)#" "),)'"ABC"
("    A"
 "    B"
 "    C")

Compressez l’alphabet et l’onde carrée, et faites pivoter chaque ligne:

  +(0 1 2;("  A";"  B";"  C"))
((0
  "  A")
 (1
  "  B")
 (2
  "  C"))

  {x!y}.'+(0 1 2;("  A";"  B";"  C"))
("  A"
 " B "
 "C  ")

Et la transposition de cela est notre réponse:

  +{x!y}.'+(0 1 2;("  A";"  B";"  C"))
("  C"
 " B "
 "A  ")

Essayez-le ici à OK .

JohnE
la source
0

C: 142 139 caractères

Extrêmement long, je pense pouvoir le raccourcir un peu:

char a[26][27],i,j,p,d;main(n){for(scanf("%d",&n);i<26;d^=!p^p+2>n,p+=d-(d^n>1),i++)for(j=n;j--;a[j][i]=p^j?32:i+65);while(n)puts(a[--n]);}

Un peu plus lisible:

char a[26][27], i, j, p, d;
main(n) {
    for (
        scanf("%d", &n);
        i < 26;
        d ^= !p ^ p + 2 > n,
        p += d - (d ^ n > 1),
        i++
    )
        for (
            j = n;
            j--;
            a[j][i] = p ^ j
                ? 32
                : i + 65
        );

    while (n)
        puts(a[--n]);
}

Edit: J'ai raté la règle "pas d'espaces", mais je serai de retour.

Fors
la source
0

Scala, 246 octets

def f(h:Int)={val a=Seq.fill(h)(Array.fill(32)(' '));var(r,x,d)=(h-1,0,if(h==1)0 else-1);def p(c:Char){a(r)(x)=c;x+=1};for(c<-'A'to'Z'){p(c);if(c==83)"cala"foreach p;r+=d;if(r==0|r==h-1)d*= -1};for(z<-a)println(new String(z)replaceAll(" +$",""))}

reformaté et commenté:

def f(h: Int) = {
  val a = Seq.fill(h)(Array.fill(32)(' '));
  // r - row; x - x coordinate, column; d - direction
  var (r, x, d) = (h - 1, 0, if(h==1) 0 else -1); 
  def p(c: Char) { // p for "put the character"
    a(r)(x) = c;
    x += 1
  };
  for(c <- 'A' to 'Z') { 
    p(c);
    if(c == 83)      // 83 == 'S'
      "cala" foreach p;
    r += d;
    if(r == 0 | r == h - 1)     // | is shorter than || 
      d *= -1
  };
  for(z <- a)
    println(new String(z) replaceAll (" +$", ""))  // trimming trailing whitespace
}

Résultats:

scala> f(4)
   D     J     P         V
  C E   I K   O Q       U W
 B   F H   L N   R     T   X Z
A     G     M     Scala     Y

scala> f(5)
    E       M           U
   D F     L N         T V
  C   G   K   O   Scala   W
 B     H J     P R         X Z
A       I       Q           Y

scala> f(1)
ABCDEFGHIJKLMNOPQRScalaTUVWXYZ
Karol S
la source
0

Python - 137

Entrée à stocker dans ieg i=8

l=[""]*h;k=j=0;y=h-1;exec'l[y]+=" "*(j-len(l[y]))+chr(k+65)+"ython"*(k==15);j=len(l[y]);y-=1^k/(h-(h>2))%2*-2;k+=1;'*26;print"\n".join(l)
Vectorisé
la source
0

Raquette

Voici une version fonctionnelle épurée: des suggestions pour le raccourcir sont les bienvenues.

(define (sawtooth n)
  (define (ST i d m lns)
    (if (null? m) 
        lns
        (let* ([v (first m)]
               [spc (make-string (string-length v) #\space)]
               [I (+ i d)])
          (ST I
              (if (or (zero? I) (= (sub1 n) I)) (* d -1) d)
              (rest m)
              (for/list ([ln lns] [j n])
                       (~a ln (if (= i j) v spc)))))))
  (displayln
   (string-join 
    (ST (sub1 n)
        (if (= n 1) 0 -1) 
        (string-split "A B C D E F G H I J K L M N O P Q Racket S T U V W X Y Z")
        (make-list n "\n")))))

Sortie

> (sawtooth 1)
ABCDEFGHIJKLMNOPQRacketSTUVWXYZ

> (sawtooth 2)
 B D F H J L N P Racket T V X Z 
A C E G I K M O Q      S U W Y 

> (sawtooth 8)
       H                  V     
      G I                U W    
     F   J              T   X   
    E     K            S     Y  
   D       L     Racket       Z 
  C         M   Q               
 B           N P                
A             O  
utilisateur29983
la source