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 1
la sortie, elle devrait être:
ABCDEFGHIJKLMNOPythonQRSTUVWXYZ
Si l'entrée est 2
la 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 4
la 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.
Réponses:
si n tient la hauteur:
Codes d'échappement C +: 81
C: 110
la source
cc
donne l'erreur "<bebe.c: 1: 17: erreur: 'n' non déclaré (première utilisation dans cette fonction)”.n
une variable globale définie sur le nombre de votre choix (comme l'a déjà demandé Martin).C, 134
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.
la source
puts("")
au lieu deprintf("\n")
.p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);
au lieu deif((c-...
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); }
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
Pour faire ce travail quel que soit le terminal, le changement
For(C,1,16
deFor(C,1,33
et retirer le contrôle majorant (R<2 or
). Voici la sortie avec5→N
:Approche graphique (cela peut aussi nécessiter
AxisOff
de la clarté)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:la source
0→F
vous pouvez faireDelvar F
ce 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 leC+7→C
, écrivez-le dans un court si (no then / else / end)Pure Bash (no coreutils), 181 octets
Sortie:
Piped to
cat -E
juste pour prouver qu'il n'y a pas de saut de ligne.la source
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
A expliqué
Exemples
1
3 monter
4 sur le dessus
7 descendant
la source
JAVA (393)
Comme toujours une excellente langue pour le golf:
la source
java.util.Arrays;
. :-(String x="ABC...Z";
et remplacez l'en-for(char c...
tête de la boucle parfor (char c=65;++c<91;){
, j'adore les caractères en Java =)c=='J'
parc==74
, enregistre deux octets supplémentaires au total.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; =)Ruby, 112 octets
S'attend à ce que l'entrée soit stockée dans
h
.Faites-moi savoir si cela nécessite une clarification.
la source
%
.puts o...
par$><<o...
.J: 75 octets
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).
c) générer la matrice pour compenser
x (a
b
c}) ya) 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:
La mise en œuvre de ceci donne pour b):
Et oui, fait pratique: le nom de J est ... "J".
la source
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.R (204)
Résultat
la source
for
déclarations (for(i in 1:x)cat(...
par exemple) ou de celui qui les entoure%in%
.Javascript -
248224235Voici 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.
la source
|0
ou~~
. 2: il est plus court de construire le tableau w directement, sanssplit
.for(w=[],v=0;v<z;v++)w[v]="\n";
(i==9?" ":" ")
vous pourriez utiliser(i^9?" ":" ")
, ce qui enregistre un caractère.Perl 119
Ce programme prend l’entrée de
STDIN
et affiche le résultat dansSTDOUT
.Et bonus - une version qui va à l’encontre des règles car elle affiche des espaces de fin, mais ajoute une interaction:
... et quelques tests ci-dessous:
la source
J,
67 5761 caractèresUtiliser comme fonction:
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.
la source
MetaPost (207)
Vous pouvez l'essayer ici.
la source
Bash (213)
(223)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.
la source
;
simplement pour le rendre un peu plus lisible? Cela n'affectera pas votre score au golfHaskell - 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:
Pour exécuter, charger le code dans
ghci
et exécuterputStr $ s Int
oùInt
est la hauteur désirée. Vous pouvez aussi ajoutersous le
import
s dans un fichier texte, compilez-le avecghc
et passez la hauteur en argument de ligne de commande. Version non-golfée:la source
const
parpure
(en utilisant l'instance Applicative pour les fonctions) pour économiser quelques octets.C # / LINQ:
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 avecString.Join(Environment.NewLine, ...)
. Pour chaque ligne, nous parcourons les 26 caractères avecEnumerable.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 lei==2
contrôle de "C" et le convertit en "C #" ou en deux espaces en fonction de la ligne. . LeString.Concat(...)
convertit le résultatIEnumerable<char>
pour chaque ligne en une chaîne avant de la passer afinTrimEnd(...)
d'éliminer proprement tous les espaces finaux.la source
PHP
(216)(205)Nouvelle version:
Ancienne version:
s'attend à ce que la variable $ i soit à la hauteur.
la source
C,
214169 octets, pas d'espaces de finMerci à @ edc65 et @tolos pour leurs suggestions utiles.
la source
scanf
etprintf
), sinon vous obtiendrez un comportement indéfini.#include <stdio.h>
est, bien sûr, le moyen le plus rapide de donner un prototype à la foisscanf
etprintf
.int
déclaration de main si vous ne retournez rien. Peut laisser tomber des parens supplémentaires, remplacer' '
par32
etif(!C)m=c
avec une déclaration ternarny, et comme je viens de l’apprendre (ci-dessus), remplacerprintf("\n")
parputs("")
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("");}}
Javascript (
204 185150)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.
Golfé (161):
Golfé et obscurci (149):
la source
.substr(a,1)
=>[a]
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"))
K, 60 octets
Assez simple, et il semble que je viens de sortir de la solution J. :)
Tout d'abord, générez un alphabet:
Et une onde en dents de scie de longueur appropriée:
Tapotez chaque lettre de l'alphabet en commençant par les espaces:
Compressez l’alphabet et l’onde carrée, et faites pivoter chaque ligne:
Et la transposition de cela est notre réponse:
Essayez-le ici à OK .
la source
C:142139 caractèresExtrêmement long, je pense pouvoir le raccourcir un peu:Un peu plus lisible:
Edit: J'ai raté la règle "pas d'espaces", mais je serai de retour.
la source
Scala, 246 octets
reformaté et commenté:
Résultats:
la source
Python - 137
Entrée à stocker dans ieg
i=8
la source
Raquette
Voici une version fonctionnelle épurée: des suggestions pour le raccourcir sont les bienvenues.
Sortie
la source