Imprimez les N premiers caractères de votre code

21

Vous devez écrire un programme ou une fonction qui reçoit un entier positif Nen entrée et imprime les premiers Ncaractères de votre code. Si Nest plus grand que la longueur de votre code, vous devez continuer à produire votre code de manière cyclique.

La lecture de votre code source de quelque façon que ce soit et la lecture depuis un fichier, stdio, etc. sont interdites.

Exemples

(en supposant que votre code est yourcode)

Entrée => Sortie:

5=> yourc
10=> yourcodeyo
22=>yourcodeyourcodeyour

Clarification

Votre programme doit être d'au moins 1 octet.

randomra
la source
15
Félicitations pour avoir publié le 2000e défi de golf de code! :)
Martin Ender
3
Douglas Hofstadter adorerait ça!
Luis Mendo
1
@ MartinBüttner En fait, il y a plus de 300 questions [code-golf] supprimées. Mais assez proche;)
Poignée de porte
11
@ MartinBüttner Merci. Seulement 48 pour aller jusqu'à un nombre rond!
randomra
5
Il est peut-être temps que vous mentionniez explicitement que les programmes vides ne sont pas valides?
Martin Ender

Réponses:

10

> <> , 49 octets

'3d*}r0ff+0i:&0(?.~~a*&"0"-+60.&~:?!;1-&:o}&" "0.

La moitié du code convertit l'entrée d'une chaîne en un entier. Si nous sommes autorisés à utiliser le point de code d'un seul caractère lu à partir de STDIN, alors ce programme serait beaucoup plus court à 21 octets:

'3d*}ri:?!;1-&:o}&60.

Explication

Je vais utiliser le deuxième programme pour l'explication.

'démarre l'analyse de chaîne, en poussant chaque caractère jusqu'à ce qu'une citation de fermeture soit trouvée. Étant donné que le reste de la ligne n'a pas de 'guillemet, chaque caractère, sauf l'initiale, 'est poussé dans la pile.

Mais> <> est un langage 2D toroïdal, donc une fois la ligne terminée, le pointeur d'instruction revient au début, en appuyant de 'nouveau sur et arrête l' analyse de la chaîne. Le résultat est que nous avons poussé tout le nécessaire sauf la citation initiale, à savoir

3d*}ri:0=?;1-&:o}&60.

'est ASCII 39, nous poussons donc la citation initiale en appuyant sur 3d* = 3*13 = 39. On décale ensuite la pile vers la droite ( }) et l'inverse ( r), donnant:

.06&}o:&-1;?=0:ir}*d3'

Maintenant, nous sommes tous prêts à commencer l'impression. ilit un caractère d'entrée, mais> <> les caractères sont essentiellement des entiers. Dans le premier programme, le iest remplacé par une boucle qui convertit une chaîne de chiffres de STDIN en un entier.

Nous exécutons ensuite la boucle suivante pour imprimer les N premiers caractères:

:?!;               If the top of the stack (N) is 0, then terminate
                   Otherwise...
1-                 Subtract 1 from N
&                  Move N to the register temporarily
:o                 Output the next char in the program
}                  Shift the stack right
&                  Put N back on the stack
60.                Repeat loop by jumping back to the first :
Sp3000
la source
9

CJam, 34 17 16 octets

Cela peut être beaucoup joué au golf ..

{`"_~"+ri_@*<}_~

Expansion du code :

{`"_~"+ri_@*<}_~
{            }_~      "Put this code block on stack, take a copy and execute the copy";
 `                    "When executed, this block will the top element on stack to a string";
  "_~"                "Then put this string on stack";
      +               "Concat it to the the previous string on stack which ` created";
       ri             "Read an integer from STDIN";
         _@           "Copy the integer and put the concatinated string on top of stack";
           *          "Repeat the string input number of times";
            <         "Take the first input number of characters from the repeated string";

Enfin, tout ce qui se trouve sur la pile est automatiquement imprimé sur STDOUT

Essayez-le en ligne ici

Optimiseur
la source
5

Python 2, 117 octets

b=input();a=lambda x:(b*(2*(x+chr(34))+')'))[:b];print a("b=input();a=lambda x:(b*(2*(x+chr(34))+')'))[:b];print a(")

Life protip: ne pas exécuter list(itertools.cycle(x)). Pour une raison quelconque, je ne peux pas imaginer pourquoi, cela bloque l'interprète.

QuadmasterXLII
la source
1
itertools.cycle()est un générateur infini, donc à moins que votre ordinateur n'ait une mémoire infinie, vous allez avoir des problèmes :)
Sp3000
5

JavaScript (ES6), 65 52 50 47 41 39

q=n=>('q='+q).repeat(n/39+1).slice(0,n)

Utilise ES6 repeat()pour cloner le code, puis tranche. Utilise une longueur codée en dur.


Ancienne version (50):

q=n=>n>(l=(t='q='+q).length)?t+q(n-l):t.slice(0,n)

Crée une fonction q , en prenant un seul paramètre.

Il stringifie le texte de la fonction et appelle récursivement la fonction si n est supérieur à la longueur du texte. Sinon, il renvoie une sous-chaîne du texte.

Version non ES6 (65):

function q(n){return t=q+'',l=t.length,n>l?t+q(n-l):t.slice(0,n)}
Scimonster
la source
1
utiliser la récursivité, plutôt que celle de l'ES6 .repeat, pour les exigences cycliques était tout simplement génial.
Jacob
1
En fait, il semble que l'utilisation repeat()m'a permis de le réduire, alors je l'ai utilisé à la place.
Scimonster
Je n'ai pas vu ça. Quoi qu'il en soit - c'est une très bonne réponse
Jacob
pourquoi le /39+1? pourquoi ne pas simplement laisser une chaîne assez longue?
l4m2
1
q=n=>('q='+q).repeat(n).slice(0,n)fonctionne bien sur firefox
l4m2
5

J - 24 caractères

Prend un seul argument entier positif et crache une chaîne.

($],quote)&'($],quote)&'

J n'a pas d'astuces d'auto-référence, nous le faisons donc simplement de la manière la plus simple. Expliqué par l'explosion:

  ],quote                 NB. right arg prepended to quotation of right arg (quine)
 $                        NB. cyclically take left-arg characters from that
(        )&'($],quote)&'  NB. preload right arg with  ($],quote)&

Le dyadique $ opérateur dans J prend cycliquement les éléments de son argument de droite pour s'adapter aux dimensions spécifiées à gauche. Lorsque la dimension est un nombre unique, il s'agit d'une simple liste 1D de caractères, nous faisons donc exactement ce que la question pose.

Essayez - le pour vous - même à tryj.tk .

algorithmshark
la source
Quel est le but général du quoteverbe?
randomra
@randomra Sa définition dans la bibliothèque standard est ''''&,@(,&'''')@(#~ >:@(=&'''')), ou en anglais, "doublez n'importe quel 'caractère, puis ajoutez-en un au début et à la fin." J utilise des littéraux de chaîne de type Ada donc cela échappe à la chaîne.
algorithmshark
4

k2 - 7 caractères

{x#$_f}

En anglais, il s'agit d'une fonction avec argument xdont la définition est " xtake string self".

  • Self (le nom _f) est la fonction la plus interne en cours d'exécution. Ici, c'est la fonction {x#$_f}.
  • String (monadic $) convertit son argument en chaîne. Dans le cas d'une fonction, il crée une chaîne avec la définition d'origine de la fonction.
  • Take (dyadique #) prend les éléments d' argument de gauche de la liste dans l' argument de droite . Dans le cas d'une chaîne, les éléments sont des caractères, donc cela fait exactement ce que nous voulons.

Cela ne fonctionnera pas dans l'open source Kona, car il semble créer des trous noirs qui dévorent toutes les tentatives de les utiliser comme arguments pour quoi que ce soit. Je ne suis pas sûr de la bonne sémantique de k3, mais ils ne sont probablement pas beaucoup plus gentils.

En Q, c'est {x#string .z.s}et en k4 {x#2_$.z.s}. Nous devons utiliser 2_pour supprimer deux caractères initiaux en k4, pour des raisons que seule une mère pourrait aimer.

algorithmshark
la source
3

Rubis, 66 64 63 octets

eval s=%q(puts"eval s=%q(#{s})".chars.cycle.take(gets.to_i)*'')

La même chose en utilisant une fonction pour éviter d'appeler getsest un peu plus longue (81 octets):

def f(i);eval s=%q(puts"def f(i);eval s=%q(#{s});end".chars.cycle.take(i)*'');end

Les versions Lambda du même sont 69 et 65 octets:

l=->i{eval s=%q(puts"l=->i{eval s=%q(#{s})}".chars.cycle.take(i)*'')}
->i{eval s=%q(puts"->i{eval s=%q(#{s})}".chars.cycle.take(i)*'')}
Denis de Bernardy
la source
1
.cycleest bien, je dois m'en souvenir. :) Vous pouvez probablement raccourcir .joinen *''.
Martin Ender
Vous pouvez enregistrer quelques caractères en utilisant String#formatau lieu de l'interpolation:eval s="$><<('eval s=%p'%s).chars.cycle.take(gets.to_i)*''"
Ventero
3

Mathematica, 65 octets

Print[StringTake[StringJoin @@ Table[ToString[#0], {#1}], #1]] & 

Tous les espaces sont nécessaires pour en faire un quine approprié, y compris celui qui suit. Il s'agit d'une fonction pure, que vous pouvez utiliser comme suit:

Print[StringTake[StringJoin @@ Table[ToString[#0], {#1}], #1]] & [75]

qui imprime

Print[StringTake[StringJoin @@ Table[ToString[#0], {#1}], #1]] & Print[Stri

Malheureusement, l' application ToStringd'une fonction ne la fonction, donc je ne peux pas donner exactement la façon dont vous avez entré raccourcir en supprimant les espaces, ce qui réduit #1à #ou en utilisant la notation préfixe pour les appels de fonction.

Martin Ender
la source
"raccourcir #à #1"?
undergroundmonorail
@undergroundmonorail dans l'autre sens, merci
Martin Ender
3

MATLAB, 319 141 caractères

J'ai réussi à extraire quelques octets de l'original:

function d=g(n);d='gvodujpo!e>h)o*<e>(<e>\e)2;2:*.2-e-e)2:;foe*.2^<e>e)2,npe)1;o.2-252**<';d=[d(1:19)-1,d,d(19:end)-1];d=d(1+mod(0:n-1,141));
knedlsepp
la source
Très bonne réponse...! Je ne sais pas comment ça marche :-)
Luis Mendo
3

JavaScript, 34 octets

f=n=>n&&('f='+f+f(n-1)).slice(0,n)

Fonction récursive qui répète les ntemps de code , puis tranche le résultat.

Yair Rand
la source
3

Japt , 2 octets

îî

Essayez-le en ligne!

La première îest une méthode numérique qui prend un paramètre et le répète à longueur n. Parce que c'est la première méthode, ndevient l'entrée. Le second îest jeté dans une chaîne et répété.

Cela se traduit par:

n.î("î")-> Répéter "î"jusqu'à ce qu'il atteigne la longueurn

Solution de 8 octets

îQi"îQi"

Essayez-le en ligne!

îQi"îQi" transpile vers n.î(Qi"îQi")

n.î(Qi"îQi")
      "îQi"    // String "îQi"          -> îQi
    Qi         // Insert "              -> îQi"
n.î            // Repeated to length n  -> îQi"îQi"îQi"  (n=12)
Oliver
la source
1
Belle dans sa simplicité!
Shaggy
2

R, 203 octets

Lorsque N = 203, le code s'imprime entièrement.

(f <- function(N){
str <- paste0("(f <- function(N)", paste0(as.character(body(f)), collapse = "\n"), ")}(", N, ")")
cat(rep(str, floor(N/nchar(str))), sep = "")
cat(substr(str, 1, N%%nchar(str)))})(203)

Lorsque N = 50, le code se coupe lui-même.

(f <- function(N){
str <- paste0("(f <- function(N

Lorsque N = 300, le code se répète partiellement.

(f <- function(N){
str <- paste0("(f <- function(N)", paste0(as.character(body(f)), collapse = "\n"), ")}(", N, ")")
cat(rep(str, floor(N/nchar(str))), sep = "")
cat(substr(str, 1, N%%nchar(str))))}(300)(f <- function(N){
str <- paste0("(f <- function(N)", paste0(as.character(body(f)), collapse = "\
Kun Ren
la source
Essayez ceci:(f=function(N){s=paste0("(f=",paste0(capture.output(f),collapse=""),")");cat(rep(s,N%/%nchar(s)),substr(s,1,N%%nchar(s)),sep="")})(200)
Thomas
2

Matlab (57)

function s=f(n);s=evalc('type f');s=s(mod(1:n,nnz(s))+1);

L' 1index initial (au lieu de 0) dans la dernière ligne est dû au fait que la fonction de Matlab typeintroduit un saut de ligne initial, qui doit être supprimé. Merci à Dennis pour sa correction (dernier index) et pour sa suggestion ( nnzplus courte que numel).

Luis Mendo
la source
J'ai peur que cela ne fasse pas ce à quoi je m'attendais (f (4) renvoie 'fun'), la bonne nouvelle est que vous pouvez le corriger en enregistrant 2 caractères. (retirez le -1). - Je pense que vous pouvez également supprimer le deuxième saut de ligne et d' échanger sur numelpour nnz.
Dennis Jaheruddin du
@Dennis Merci pour ces deux idées! J'ai édité pour incorporer les deux
Luis Mendo
Hm, je ne veux pas être un buzzkill, mais la type fpartie ne s'oppose-t-elle pas à l'exigence de lire votre code source de quelque manière que ce soit et de lire à partir d'un fichier, stdio, etc. ne sont pas autorisés ?
knedlsepp
@knedlsepp Je pense que vous avez raison. J'avais aussi ce soupçon. typeaccède probablement au disque dur. Pensez-vous que je devrais supprimer la réponse?
Luis Mendo
@LuisMendo: Je pense que personne ne s'en soucie vraiment. :-) Je voulais juste essayer ce problème hier, car j'avais déjà échoué à produire une quine similaire à cela quelques fois auparavant. Et bien sûr, j'ai dû vérifier s'il y avait déjà une solution Matlab. :-) En fin de compte, cela m'a donné suffisamment de motivation pour creuser assez profondément pour finalement trouver une solution. (J'ai d'ailleurs volé votre modidée d'indexation.)
knedlsepp
2

Unaire (version 1-8) , 23855 octets

Prend l'entrée comme unaire de '1, et le code est 23855' 1 ( ,[.,])

l4m2
la source
1
Qu'est-ce que cela signifie aussi?
DJMcMayhem
@DJMcMayhem C'est un chat
l4m2
Maintenant, trouvez une langue qui a un sens unaire et un programme à 1 caractère fait cat
l4m2
2

Japt , 40 28 octets


"îR+Q+V+Q+R+V"
îR+Q+V+Q+R+V

La première fois que vous écrivez un quine, cela peut probablement être un peu raccourci. D'un autre côté, je suis assez content de l'avoir fait fonctionner du tout.

Début de ligne intentionnel, la deuxième ligne est des données et le reste déballe les données, puis répète toute la chaîne résultante jusqu'à ce qu'elle atteigne une longueur égale à l'entrée.

Rasé un énorme 12 octets grâce à Oliver .

Essayez-le en ligne!

Lente
la source
Nice :) vous pouvez remplacer tTUpar ¯Uet vous pouvez utiliser îà la place de pen le déplaçant vers l'avant: Essayez-le en ligne
Oliver
À la réflexion, je ne pense pas que vous ayez besoin de le couper du tout. îR+Q+V+Q+R+Vdevrait fonctionner très bien.
Oliver
@Oliver Oh c'est intelligent, je ne savais pas î, c'est très pratique. Merci beaucoup!
Nit
Je ne suis pas trop bon avec les quines non plus, mais je pense que cela devrait fonctionner pendant 24 octets.
Shaggy
1

C ++, 305

int L=305;string s="int main(){string t=\"string s=\";int n;cin>>n;t+=s;t+=\"\";\";t+=s;while(n>0){if(n>L){cout<<t;n-=L;}else{cout<<t.substr(0,n);}return 0;}";
int main(){string t="int L=305;string s=\"";int n;cin>>n;t+=s;t+="\";";t+=s;while(n>0){if(n>L){cout<<t;}else{cout<<t.substr(0,n);}n-=L;}return 0;}

Explication À part le caractère d'échappement, tous les autres caractères sont imprimés. La méthode principale se trouve à l'intérieur de la chaîne s et à l'intérieur de la chaîne principale, la chaîne complète est construite et imprimée sur stdout

bacchusbeale
la source
1

Pyth, 15 13 14 octets

<jN*Q]"<jN*Q]"

Essayez-le en ligne!

Version modifiée du quine Pyth standard .

hakr14
la source
@ l4m2 Comment ça? Veuillez expliquer, je ne vois rien de mal ...
hakr14
29 devrait être <jN*Q]"<jN*Q]<jN*Q]"<jN*Q]<jNfaux?
l4m2
@ l4m2 Ah, c'est vrai. Je l'ai corrigé.
hakr14
<jN*Q]"<jN*Q]"semble fonctionner?
l4m2
Ouais, je l'ai réalisé. Merci pour l'aide, en passant!
hakr14
1

Hoon , 185 octets

=/(f "=/(f k |=(n=@ =+((trim 5 f) `tape`(scag n `tape`(zing (reap n :(weld p <f> (slag 1 q))))))))" |=(n=@ =+((trim 5 f) `tape`(scag n `tape`(zing (reap n :(weld p <f> (slag 1 q))))))))

Définissez fle code du programme sous forme de bande, mais avec "k" pour lui-même. Divisez la bande au caractère 5, en définissant des variables [p=left q=right]. Soudez ensemble les cordes p, la chaîne d'origine fet tout ce qui se trouve après le 1er caractère de q. Répétez cette chaîne nfois, puis renvoyez-en les premiers ncaractères.

Cela a été légèrement gêné par le fait que stdlib de Hoon n'a pas de fonction de formatage ou de recherche et remplacement ... De plus, je ne sais pas pourquoi nous avons besoin d'une autre distribution après le scag, car il devrait conserver les informations de type. Alors ça va.

RenderSettings
la source
1

Gol> <> , 12 octets

"r2ssIFLko|;

Essayez-le en ligne!

Comment ça marche

"r2ssIFLko|;

"..."   Push the chars in reverse order
r2ss    Reverse the stack, then push `"`
IF...|  Input n, and repeat the following n times...
  L     Push the loop counter (0 to n-1)
   k    Pop x and copy x-th from the top
    o   Pop and print as char
;       Halt

k peut encapsuler un certain nombre de fois, nous n'avons donc pas besoin de dupliquer la pile entière en fonction de l'entrée.

Bubbler
la source
1

SmileBASIC, 106 66 octets

INPUT N?MID$(("+CHR$(34))*3,23,N)INPUT N?MID$(("+CHR$(34))*N,23,N)
12Me21
la source
0

KSFTgolf - 4 caractères, 6 octets

KSFTgolf si une langue que j'ai essayé de concevoir pour le golf de code. Je l'ai beaucoup changé, donc cela ne devrait probablement pas vraiment compter.

☃\@2
KSFT
la source
Quelle langue est-ce ? Des liens? Spec? explication ..
Optimizer
@Optimizer Ah, à droite. J'ai oublié cela. C'est un langage que j'ai conçu pour le golf de code. C'est finalement un défi où (si je corrige tous les bugs), il pourrait réellement gagner.
KSFT
1
De plus, pour autant que je puisse voir, le langage a été créé il y a environ 10 minutes, donc techniquement, c'est une réponse non concurrente :). De plus, je suppose que c'est le bloc correspondant à votre code, qui ressemble tout à fait quelque chose qui a été fait spécialement pour ce défi (car il n'y a pas d' autres blocs de code à base de unicode dans votre fichier entier).
Optimizer
@Optimizer Cette instruction était en fait dans la langue précédente (bien qu'un commit qui l'a légèrement modifiée ait été poussé après la publication du défi), qui a été créé il y a quelques jours. Parce que je ne pense pas que cela fonctionnerait dans la version de la langue qui était publique lorsque le défi a été publié, cependant, je ne pense pas que cette réponse devrait réellement compter, comme je l'ai dit dans ma réponse.
KSFT
4
Veux-tu construire un bonhomme de neige?
flawr le
0

J, 41 octets

Maintenant, c'était un casse-tête!

((,quote,')$~'"_)'((,quote,'')$~''"_)')$~

Explication:

((,quote,')$~'"_)'((,quote,'')$~''"_)')$~  | Expression taking 1 argument
                                       $~  | Reshape left argument to fit right, taking cyclically.
(                                     )    | One large expression that evaluates to a string
                 '((,quote,'')$~''"_)'     | String literal containing the code to the left of it
 (,quote,'$)~'"_)                          | A 4-Hook:
         '$)~'"_                           | The string '$)~'
   quote,                                  | Appended to the quoted version of the string
  ,                                        | Appended to the raw string

Exemples:

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 10
((,quote,'

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 20
((,quote,')$~'"_)'((

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 30
((,quote,')$~'"_)'((,quote,'')

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 41
((,quote,')$~'"_)'((,quote,'')$~''"_)')$~

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 50
((,quote,')$~'"_)'((,quote,'')$~''"_)')$~((,quote,
Bolce Bussiere
la source
0

Java 10, 193 176 octets

n->{var s="n->{var s=%c%s%1$c;s=s.format(s,34,s);for(int i=n;i>0;i/=176)s+=s;return s.substring(0,n);}";s=s.format(s,34,s);for(int i=n;i>0;i/=176)s+=s;return s.substring(0,n);}

Explication:

Essayez-le en ligne.

n->{                       // Method with integer parameter and String return-type
  var s="n->{var s=%c%s%1$c;s=s.format(s,34,s);for(int i=n;i>0;i/=176)s+=s;return s.substring(0,n);}";
                           //  Unformatted source code
  s=s.format(s,34,s);      //  Create the formatted quine
  for(int i=n;i>0;         //  Loop `i` as long as it's not 0
      ;                    //    After every iteration:
       i/=176)             //     int-divide `i` by the hardcoded length of the source code
    s+=s;                  //   Exponentially enlarge the source code
  return s.substring(0,n);}//  Return the first `n` characters of the source code

-part:

  • Le var scontient le code source non formaté.
  • %sest utilisé pour entrer cette chaîne en elle-même avec le s.format(...).
  • %c, %1$cEt34 sont utilisés pour formater les guillemets doubles.
  • s.format(s,34,s) met tout cela ensemble.

Partie défi:

  • for(int i=n;i>n;i/=176)boucles ceil(n/176)fois, où 176est la longueur du code source.
  • s+=s;augmente de façon exponentielle la taille de la chaîne de code source. ( abdevient abab; ababdevient abababab; ababababdevient abababababababab; etc.)
  • s.subtring(0,n);prend les premiers ncaractères de la chaîne.
Kevin Cruijssen
la source