Imprime los primeros N caracteres de tu código

21

Debe escribir un programa o función que reciba un número entero positivo Ncomo entrada e imprima los primeros Ncaracteres de su código. Si Nes mayor que la longitud de su código, debe continuar generando su código cíclicamente.

La lectura de su código fuente de cualquier manera y la lectura de archivos, stdio, etc. no están permitidos.

Ejemplos

(suponiendo que su código sea yourcode)

Entrada => Salida:

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

Aclaración

Su programa debe tener al menos 1 byte de longitud.

randomra
fuente
15
¡Felicitaciones por publicar el código 2000 del desafío de golf de código! :)
Martin Ender
3
¡A Douglas Hofstadter le encantaría esto!
Luis Mendo
1
@ MartinBüttner En realidad, hay más de 300 preguntas [code-golf] eliminadas. Pero lo suficientemente cerca;)
Pomo de la puerta
11
@ MartinBüttner Gracias. ¡Solo quedan 48 hasta un número redondo!
randomra
55
¿Quizás es hora de que mencione explícitamente que los programas vacíos no son válidos?
Martin Ender

Respuestas:

10

> <> , 49 bytes

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

La mitad del código está convirtiendo la entrada de una cadena a un int. Si se nos permite usar el punto de código de una sola lectura de caracteres de STDIN, entonces este programa sería mucho más corto en 21 bytes:

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

Explicación

Usaré el segundo programa para la explicación.

'comienza el análisis de cadenas, presionando cada carácter hasta que se encuentre una cotización de cierre. Como el resto de la línea no tiene 'comillas, cada carácter, excepto el inicial, 'se coloca en la pila.

Pero> <> es un lenguaje 2D toroidal, por lo que una vez que la línea ha terminado, el puntero de instrucción vuelve al inicio, pulsa el botón 'nuevamente y detiene el análisis de cadenas. El resultado es que hemos presionado todo lo necesario, excepto la cita inicial, a saber

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

'es ASCII 39, entonces empujamos la cita inicial presionando 3d* = 3*13 = 39. Luego cambiamos la pila hacia la derecha ( }) y hacia atrás ( r), dando:

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

Ahora estamos listos para comenzar a imprimir. ilee en un carácter de entrada, pero los caracteres> <> son básicamente enteros. En el primer programa, ise reemplaza por un bucle que convierte una cadena de dígitos de STDIN en un número entero.

Luego ejecutamos el siguiente bucle para imprimir los primeros N caracteres:

:?!;               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
fuente
9

CJam, 34 17 16 bytes

Esto se puede jugar mucho golf ..

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

Expansión de código :

{`"_~"+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";

Finalmente, cualquier cosa en la pila se imprime en STDOUT automáticamente

Pruébalo en línea aquí

Optimizador
fuente
5

Python 2, 117 bytes

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

Vida protip: no ejecutes list(itertools.cycle(x)). Por alguna razón, no puedo imaginar por qué, se bloquea el intérprete.

QuadmasterXLII
fuente
1
itertools.cycle()es un generador infinito, así que a menos que su computadora tenga memoria infinita, tendrá problemas :)
Sp3000
5

JavaScript (ES6), 65 52 50 47 41 39

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

Utiliza ES6 repeat()para clonar el código y luego lo corta. Utiliza una longitud codificada.


Versión anterior (50):

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

Crea una función q, tomando un solo parámetro.

Cadena el texto de la función y recursivamente llama a la función si nes mayor que la longitud del texto. De lo contrario, devuelve una subcadena del texto.

Versión no ES6 (65):

function q(n){return t=q+'',l=t.length,n>l?t+q(n-l):t.slice(0,n)}
Scimonster
fuente
1
El uso de la recursión, en lugar de ES6 .repeat, para los requisitos cíclicos fue simplemente genial.
Jacob
1
En realidad, parece que usar repeat()me permitió cortarlo un montón, así que lo usé en su lugar.
Scimonster
No vi eso. De todos modos, esta es una muy buena respuesta
Jacob
por qué el /39+1? ¿Por qué no dejar una cuerda lo suficientemente larga?
l4m2
1
q=n=>('q='+q).repeat(n).slice(0,n)funciona bien en firefox
l4m2
5

J - 24 char

Toma un único argumento entero positivo y escupe una cadena.

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

J no tiene ningún truco de autorreferencia, por lo que lo hacemos a la perfección. Explicado por explosión:

  ],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)&

El $operador diádico en J toma cíclicamente elementos de su argumento derecho para ajustarse a las dimensiones especificadas a la izquierda. Cuando la dimensión es un número único, se trata de una simple lista 1D de caracteres, por lo que hacemos exactamente lo que la pregunta nos pide.

Pruébelo usted mismo en tryj.tk .

Algoritmo de tiburón
fuente
¿Cuál es el propósito general del quoteverbo?
randomra 01 de
@randomra Su definición en la biblioteca estándar es ''''&,@(,&'''')@(#~ >:@(=&'''')), o en inglés, "duplicar cualquier 'carácter, luego agrega uno al principio y al final". J usa literales de cadena similares a Ada, por lo que se escapa de la cadena.
algorithmshark
4

k2 - 7 caracteres

{x#$_f}

En inglés, esta es una función con argumento xcuya definición es " xtake string self".

  • Self (el sustantivo _f) es la función más interna en ejecución actualmente. Aquí está la función {x#$_f}.
  • Cadena (monádico $) convierte su argumento en una cadena. En el caso de una función, crea una cadena con la definición original de la función.
  • Take (dyadic #) toma elementos de izquierda-arg de la lista en derecha-arg . En el caso de una cadena, los elementos son caracteres, por lo que esto está haciendo exactamente lo que queremos.

Esto no funcionará en el código abierto de Kona, porque parece crear agujeros negros que se comen todos los intentos de usarlos como argumentos de cualquier cosa. No estoy seguro de la semántica k3 adecuada, pero probablemente no sean mucho más amables.

En Q, esto es {x#string .z.s}y en k4 {x#2_$.z.s}. Tenemos que usar 2_para soltar dos caracteres iniciales en k4, por razones que solo una madre podría amar.

Algoritmo de tiburón
fuente
3

Ruby, 66 64 63 bytes

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

Lo mismo usando una función para evitar llamar getses un poco más largo (81 bytes):

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

Las versiones de Lambda de la misma son 69 y 65 bytes:

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
fuente
1
.cycleestá bien, tengo que recordar eso. :) Probablemente se puede acortar .joina *''.
Martin Ender
Puede guardar algunos caracteres mediante el uso en String#formatlugar de la interpolación:eval s="$><<('eval s=%p'%s).chars.cycle.take(gets.to_i)*''"
Ventero
3

Mathematica, 65 bytes

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

Todos los espacios son necesarios para hacer de este un quine adecuado, incluido el final. Esta es una función pura, que puede usar de la siguiente manera:

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

que imprime

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

Por desgracia, la aplicación ToStringde una función no produce exactamente la forma en que ha introducido la función, así que no puedo acortar mediante la eliminación de espacios en blanco, el acortamiento #1de #o usando la notación de prefijo para llamadas a funciones.

Martin Ender
fuente
"acortar #a #1"?
undergroundmonorail
@undergroundmonorail al revés, gracias
Martin Ender
3

MATLAB, 319 141 caracteres

Logré exprimir algunos bytes del 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
fuente
Gran respuesta...! No tengo idea de cómo funciona :-)
Luis Mendo
3

JavaScript, 34 bytes

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

Función recursiva que repite los ntiempos del código , luego corta el resultado.

Yair Rand
fuente
3

Japt , 2 bytes

îî

Pruébalo en línea!

El primero îes un método numérico que toma un parámetro y lo repite a la longitud n. Porque es el primer método, se nconvierte en la entrada. El segundo se îconvierte en una cadena y se repite.

Esto se transmite a:

n.î("î")-> Repita "î"hasta que alcance la longitudn

Solución de 8 bytes

îQi"îQi"

Pruébalo en línea!

îQi"îQi" transpila a n.î(Qi"îQi")

n.î(Qi"îQi")
      "îQi"    // String "îQi"          -> îQi
    Qi         // Insert "              -> îQi"
n.î            // Repeated to length n  -> îQi"îQi"îQi"  (n=12)
Oliver
fuente
1
Hermosa en su simplicidad!
Shaggy
2

R, 203 bytes

Cuando N = 203, el código se imprime completamente.

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

Cuando N = 50, el código se recorta solo.

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

Cuando N = 300, el código se repite parcialmente.

(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
fuente
Prueba esto:(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);

El 1índice inicial (en lugar de 0) en la última línea se debe a que la función de Matlab typeintroduce un avance de línea inicial, que debe eliminarse. Gracias a Dennis por su corrección (último índice) y por su sugerencia ( nnzmás corta que numel).

Luis Mendo
fuente
Me temo que esto no hace lo que esperaría (f (4) devuelve 'diversión'), la buena noticia es que puede solucionarlo guardando 2 caracteres. (eliminar el -1). - Creo que también puede eliminar el segundo salto de línea y de intercambio a cabo numelpor nnz.
Dennis Jaheruddin
@ Dennis ¡Gracias por estas dos ideas! He editado para incorporar ambos
Luis Mendo
Hm, no quiero ser un buzzkill, pero ¿no type fchoca la parte con el requisito Leer su código fuente de alguna manera y leer desde el archivo, stdio, etc. no están permitidos ?
knedlsepp
@knedlsepp Creo que tienes razón. Yo también tenía esa sospecha. typeprobablemente accede al disco duro. ¿Crees que debería eliminar la respuesta?
Luis Mendo
@LuisMendo: No creo que a nadie realmente le importe. :-) Solo quería intentar este problema ayer, ya que no había podido producir una quine similar a esta unas pocas veces antes. Y, por supuesto, tuve que verificar si ya había una solución de Matlab. :-) Al final, esto me dio la motivación suficiente para profundizar lo suficiente como para finalmente producir una solución. (Por modcierto, robé su idea de indexación)
Knedlsepp
2

Unario (versión 1-8) , 23855 bytes

Toma la entrada como unario de '1's, y el código es 23855' 1's ( ,[.,])

l4m2
fuente
1
¿Qué diablos se traduce esto también?
DJMcMayhem
@DJMcMayhem Es un gato
l4m2
Ahora encuentre un lenguaje que tenga sentido para la entrada unaria y algún programa de 1 char hace cat
l4m2
2

Japt , 40 28 bytes


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

Primera vez que escribe un quine, por lo que esto probablemente se puede acortar un poco. Por otro lado, estoy bastante feliz de haberlo hecho funcionar.

Liderando la nueva línea intencionalmente, la segunda línea son datos y el resto desenvuelve los datos, luego repite toda la cadena resultante hasta que alcanza una longitud igual a la entrada.

Afeitado 12 bytes gracias a Oliver .

Pruébalo en línea!

Liendre
fuente
Agradable :) se puede reemplazar tTUcon ¯Uy se puede utilizar îen lugar del pmoviéndola hacia la parte delantera: Pruébelo en línea
Oliver
Pensándolo bien, no creo que necesites cortarlo en absoluto. îR+Q+V+Q+R+Vdebería funcionar bien.
Oliver
@ Oliver Oh, eso es inteligente, no lo sabía î, eso es muy útil. ¡Muchas gracias!
Nit
Tampoco soy muy bueno con las quines, pero creo que esto debería funcionar para 24 bytes.
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;}

Explicación Además del carácter de escape, se imprimen todos los demás caracteres. El método principal está dentro de la cadena sy dentro de la cadena principal, la cadena completa se construye e imprime en stdout

bacchusbeale
fuente
1

Pyth, 15 13 14 bytes

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

Pruébalo en línea!

Versión modificada del estándar Pyth quine .

hakr14
fuente
@ l4m2 ¿Cómo es eso? Por favor explique, no veo nada malo ...
hakr14
29 debería estar <jN*Q]"<jN*Q]<jN*Q]"<jN*Q]<jNequivocado?
l4m2
@ l4m2 Ah, tienes razón. Lo he arreglado
hakr14
<jN*Q]"<jN*Q]"parece trabajo?
l4m2
Sí, me di cuenta de eso. Gracias por la ayuda por cierto!
hakr14
1

Hoon , 185 bytes

=/(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))))))))

Establezca fel código del programa como una cinta, pero con "k" para sí mismo. Divida la cinta en el carácter 5, estableciendo variables [p=left q=right]. Suelde las cuerdas p, la cadena original fy todo lo que sigue al primer carácter de q. Repita esa cadena nveces, luego devuelva los primeros ncaracteres de la misma.

Hacer esto se vio ligeramente obstaculizado por el hecho de que stdlib de Hoon no tenía una función de formato o buscar y reemplazar ... Además, no estoy seguro de por qué necesitamos otro reparto después del scag, ya que debería mantener la información de tipo. Así que va.

RenderSettings
fuente
1

Gol> <> , 12 bytes

"r2ssIFLko|;

Pruébalo en línea!

Cómo funciona

"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 puede ajustarse cualquier cantidad de veces, por lo que no necesitamos duplicar toda la pila dependiendo de la entrada.

Bubbler
fuente
1

SmileBASIC, 106 66 bytes

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

KSFTgolf - 4 caracteres, 6 bytes

KSFTgolf si es un lenguaje que he estado intentando diseñar para el golf de código. Lo he estado cambiando mucho, por lo que esto probablemente no debería contar.

☃\@2
KSFT
fuente
Qué lenguaje es este ? Cualquier enlace? Especificaciones ? explicación ..
Optimizador
@Optimizer Ah, cierto. Me olvide de eso. Es un lenguaje que he estado diseñando para el golf de código. Finalmente, este es un desafío en el que (si soluciono todos los errores) en realidad podría ganar.
KSFT
1
Además, por lo que puedo ver, el lenguaje se creó hace unos 10 minutos, por lo que técnicamente, esta es una respuesta no competitiva :). Además, supongo este es el bloque correspondiente a su código, que se parece totalmente a algo que se ha hecho específicamente para este desafío (ya que no hay otros bloques de código basados ​​en Unicode en todo su archivo).
Optimizador
@Optimizer Esa instrucción ya estaba en el idioma anterior (aunque se envió un commit que lo cambió ligeramente después de que se publicó el desafío), que se creó hace unos días. Sin embargo, debido a que no creo que esto funcione en la versión del lenguaje que era público cuando se publicó el desafío, no creo que esta respuesta realmente cuente, como dije en mi respuesta.
KSFT
44
¿Quieres hacer un muñeco de nieve?
falla
0

J, 41 bytes

¡Eso sí que era un desafío para la mente!

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

Explicación:

((,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

Ejemplos:

   ((,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
fuente
0

Java 10, 193 176 bytes

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

Explicación:

Pruébalo en línea.

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

-parte:

  • los var s contiene el código fuente sin formato.
  • %sse utiliza para ingresar esta cadena en sí misma con el s.format(...).
  • %c, %1$cY la34 se usan para formatear las comillas dobles.
  • s.format(s,34,s) lo pone todo junto

Parte del desafío:

  • for(int i=n;i>n;i/=176)ceil(n/176)tiempos de bucles , donde176 es la longitud del código fuente.
  • s+=s;aumenta exponencialmente el tamaño del código fuente String. (se abconvierte abab; se ababconvierte abababab; se ababababconvierte abababababababab; etc.)
  • s.subtring(0,n);toma los primeros ncaracteres de la cadena.
Kevin Cruijssen
fuente