Si vous n'êtes pas familier avec le hacker typer, consultez hackertyper.net . En bref, c'est un programme qui produit un morceau d'une base de code par frappe pour un effet comique. MAIS, la version hackertyper.net est beaucoup trop facile à implémenter. Il produit simplement trois caractères à la fois à partir d'un morceau de code arbitraire . Pour ce défi, un programme doit produire son propre code source et imprimer un morceau de code délimité par espace par frappe.
Détails
- On ne peut pas coder en dur un nom de fichier pour le programme; il doit déterminer son nom dynamiquement. Si le programme compile en un exécutable, il peut ajouter l'extension de fichier standard au nom de l'exécutable (à l'exclusion du .exe si vous utilisez Windows) et supposer que le fichier source se trouve dans le répertoire de l'exécutable. Par exemple, si un exécutable C est nommé "hacker", il doit extraire son code source d'un fichier nommé "hacker.c" dans son même répertoire. Si un programme compilé a une extension, elle doit être supprimée avant de déterminer le nom de son code source ("typer.exe" -> "typer.cs").
- Les programmes doivent contenir au moins 5 espaces, avec au moins un caractère entre chaque espace. Cela signifie que la taille la plus petite possible pour ce défi est de 9 octets. Les espaces ne doivent pas être cruciaux pour le fonctionnement du programme.
- Tout formatage (retrait, nouvelles lignes, etc.) doit être conservé dans la sortie. Cette mise en forme peut être imprimée avec le code qui la procède ou la suit, ce qui importe est que la mise en forme soit maintenue.
- Évitez d'utiliser des commentaires pour satisfaire aux 5 exigences d'espace, sauf s'il n'existe aucun autre moyen d'implémenter les espaces dans la langue de votre choix.
EDIT : De nouvelles lignes peuvent être utilisées à la place ou en plus des espaces comme séparateurs de blocs.
Réponses:
bash, 51
58la source
2: read: Illegal option -s
)cat $0
et tildes avec$(<$0)
IFS=\
vraiment nécessaire si vous omettez le shebang? IFS par défaut est quelque chose comme çaIFS=$'\n\t '
, et comme vous n'avez plus de nouvelle ligne, je ne pense pas que vous ayez besoin de la limiter à l'espace.for w in `<$0`;{ read \-sn1;printf $w\ ;}
HTML et JavaScript, 123
Cela fonctionne de manière similaire au hacker typer, mais avec son propre code source. Faites-moi savoir si j'ai mal compris les règles.
Et voici une version stylisée (170 caractères):
J'ai fait une démo . Il est modifié parce que JS Bin ajoute beaucoup de code supplémentaire, mais l'idée générale est la même.
la source
<head>
est que le navigateur l'ajoutera s'il n'est pas là, donc il sera toujours affiché. J'ai oublié<html>
cependant.Perl + Term :: ReadKey, 56 octets
Merci à ThisSuitIsBlackNot pour l'inspiration originale, et à primo pour avoir suggéré
open 0
et<0>
.Notez que la nouvelle ligne après
for
n'est en fait pas nécessaire, sauf que j'ai besoin d'inclure une nouvelle ligne supplémentaire quelque part pour porter le nombre d'espaces au minimum spécifié de cinq.Notez également que, comme la soumission de ThisSuitIsBlackNot, ce programme nécessite le module Term :: ReadKey du CPAN. Sur Debian / Ubuntu Linux, ce module, s'il n'est pas déjà présent, peut être facilement installé avec la commande
sudo apt-get install libterm-readkey-perl
.De plus, pour enregistrer quelques caractères, ce programme ne restaure pas le mode d'entrée à la normale à la sortie, vous pouvez donc vous retrouver incapable de voir ce que vous tapez par la suite. L'exécution de la commande shell
stty sane
oureset
devrait résoudre ce problème. Ce problème pourrait être résolu, au prix de 10 octets supplémentaires, avec:Bonus: Pure quine, 81 octets
Encore une fois, la nouvelle ligne après la virgule n'est nécessaire que pour respecter le minimum de cinq espaces blancs.
Contrairement au programme de 56 octets ci-dessus, cette version n'a pas réellement besoin de lire son propre code source, car il est basé sur une quine - en particulier, sur cette quine:
La bonne chose à propos de ce quine est qu'il peut facilement transporter une "charge utile" arbitraire dans le
q{ }
bloc, sans avoir à le répéter. Bien qu'il ne puisse pas tout à fait battre<0>
dans la brièveté, il se rapproche assez.Remarque: Ce programme utilise la fonctionnalité Perl 5.10+
say
et doit donc être appelé avec le commutateur de ligne de commande-M5.010
(ou-E
). Selon un consensus établi sur la méta, ces commutateurs utilisés pour activer les fonctionnalités du langage moderne ne comptent pas comme des caractères supplémentaires . La solution la plus courte sans laquelle je peux trouversay
est de 83 octets:Les deux peuvent également être rendus plus conviviaux pour les terminaux en (joignant les deux dernières lignes et) en insérant:
avant le dernier
}
.la source
stty sane
au lieu dereset
(ce qui pourrait, sur certains systèmes d'exploitation, faire quelque chose de plus que simplement réinitialiser certains paramètres terminaux ^^)open F,$0
et<F>
pourrait être remplacé paropen 0
et<0>
. De plus, je dirais qu'un poste dans la méta ne constitue pas vraiment un consensus. L'option "-M5.01
n'amène pas la langue à un point spécifique" , comme le suggère l'auteur, elle active des fonctionnalités. Il n'y a pas de version de perl pour laquelle ces fonctionnalités sont activées par défaut.ruby golfscript.rb foo.gs
compte comme une commande valide pour exécuter un programme écrit en GolfScript,perl -M5.010 foo.pl
devrait alors compter comme une commande valide pour exécuter un programme écrit en "Perl 5.10". Mais ces arguments appartiennent vraiment à la méta, pas ici.)Python 3 - 124 octets - 7 espaces
Code:
Non golfé:
Version stylée:
la source
Rubis,
85, 71Dommage que cela
IO#raw
ne fasse pas partie de la bibliothèque standard.Amélioration
Celui-ci élimine l'appel à la sortie du noyau # et utilise des variables globales pour raccourcir le code.
la source
Befunge - 21
Je suis assez content de cela, car je viens de découvrir Befunge. Si cela ne vous dérange pas de "taper" dans une fenêtre contextuelle, vous pouvez l'exécuter ici ou ici jusqu'à ce que je trouve un meilleur interprète en ligne.
la source
Powershell, 89
la source
Python 3 - 299
C'est une quine. Raccourci de 507 en utilisant
exec
et en déplaçant certaines déclarations.la source
C,
211186 octetsMa solution en C en utilisant la bibliothèque curses. Elle peut être plus longue que l'autre solution C, mais c'est une quine. Bien que cela ne soit pas requis par la question, c'est quand même assez agréable. Cela fonctionne aussi très bien:
Une version plus lisible avec des commentaires et des trucs:
compiler avec:
la source
C -
136 135132 octets (Windows uniquement)Remarque: il y a un espace à la fin du programme, qui ne s'affichera probablement pas.
Je ne peux pas garantir que ce programme fonctionnera sur un seul ordinateur autre que le mien car il est incroyablement hacky. Les choses auraient été beaucoup plus simples lorsque tout le monde n'avait que des machines 32 bits. Ensuite, je n'aurais pas besoin de m'inquiéter d'
sizeof(int*)
avoir 8 ans (ce qui est certainement le cas; je l'ai imprimé pour être sûr) alors qu'il asizeof(int)
4 ans.Heureusement, le nom de l'exécutable est stocké dans la première chaîne dans argv.
Cependant, mettre un pointeur comme argument sur une fonction signifie que je dois spécifier explicitement le type de TOUS les arguments de la fonction - ce qui signifie que je devrais taperHeureusement, j'ai trouvé une solution de contournement. J'ai eu le deuxième argument à mainint
deux fois - un énorme gaspillage de caractères.q
, être juste un autre int. Puis attribuerq
à une variable de type aint**
réussi à récupérer tous les octets nécessaires de la pile.Je n'ai pas réussi à trouver de telles astuces pour interpréter le type de retour de
fopen
comme un pointeur sans déclarer la fonction.Edit: J'ai remarqué que je devrais utiliser à la
~fscanf(*v,"%s",b)
place defscanf(*v,"%s",b)>0
car le retour est -1 lorsque EOF est atteint.la source
void **v;
) au lieu du prototypagefopen()
.fopen
. Je ne vois pas pourquoi le remplacement de void par int devrait faire une différence, car tous les pointeurs sont de la même taille de toute façon.b[1<<20];main(int *c,char **v){strcpy(b,*v);strcat(b,".c");c=fopen(b,"r");for(;fscanf(c,"%s",b)>0;printf("%s ",b))getch();}
(je devais remplacergetchar()
pourgetch()
bien).*fopen()
au lieu de*fopen(a,b)
?Perl - 87 octets
Je n'ai rien vu dans les règles sur ce qu'il faut faire une fois que le fichier a été lu jusqu'à la fin, il reste donc simplement en attente d'entrée après l'impression du dernier morceau.
la source
node.js avec LiveScript:
version asynchrone:
la source
Cobra - 147
CobraCore.exePath
est tellement utile!la source
Javascript ES6, 154
Firefox 154 :
Chrome 175 :
Les deux 274 :
Non golfé (chrome):
A deux versions, car Chrome ne gère pas la fonction flèche et la console n'est pas effacée avec la même méthode
Firefox fonctionne avec firebug, il semble que la console développeur par défaut ne puisse pas être effacée d'un script.
la source
Groovy - 379
Puisqu'il n'y a pas
getch()
ou l'équivalent dans les langages Java et Java-esque comme Groovy ... fondamentalement, mon code ne gère pas les pressions de touches. C'est tout: Dla source
C, 248 caractères
True quine
Fonctionne uniquement sous Unix, dans Windows, il serait implémenté à l'aide de _getch.
la source
HTML et Javascript, 232 octets
Le quine Javascript traditionnel, mais modifié.
JSFiddle ici .
la source
SmileBASIC,
7975 octetsIl est très facile d'obtenir une LIGNE spécifique d'un programme dans SmileBASIC, donc je mets juste les espaces avant chaque saut de ligne.Je pensais que j'étais si intelligent, en mettant les espaces avant chaque saut de ligne, mais apparemment, nous sommes autorisés à utiliser des sauts de ligne au lieu d'espaces ...Explication:
la source
Haskell
la source