Máquina de verdad extendida


17

Mucha gente sabe qué es una máquina de verdad en la programación. Pero es hora de poner las cosas a un nivel superior. ¡Presentamos la máquina de la verdad extendida! Una máquina de verdad extendida toma dos cosas como entrada, un entero ny una cadena no vacía s. Produce s ntiempos con espacios en blanco finales opcionales. Sin embargo, si nes igual a 0, debe salir shasta que el programa se detenga manualmente, es decir, nunca debe terminar.

Además, si nes un número negativo, entonces la cadena debe invertirse. Por ejemplo con s=helloy n=-1, la salida sería olleh.

Métodos estándar de entrada, cualquier tipo de salida, siempre que pueda manejar infinito. Si tiene una respuesta que no maneja infinito, siéntase libre de publicarla si es interesante o en un idioma que no puede manejar la salida infinita.

Casos de prueba

n, s, output

5, "hello world", "hello worldhello worldhello worldhello worldhello world"
0, "PPCG", "PPCGPPCGPPCGPPCG..."
-2, "truThY", "YhTurtYhTurt"
2000, "o", "oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo"

Este es el , ¡el código más corto gana!

Aquí está la publicación original de Sandbox. Se le han hecho modificaciones. Gracias a @ComradeSparklePony por crear la idea de este desafío.

Respuestas:


3

Haskell, 57 54 bytes

f 0=cycle
f n|n<0=f(-n).reverse|n>0=concat.replicate n

Explicación:

f 0           -- If n=0 ..
 =cycle       -- infinitely repeat the input
f n|n<0       -- Otherwise, if n<0 ..
 =f(-n)       -- call f with the negative of n ..
 .reverse     -- and the reverse of the input
 |n>0         -- Finally, if n>0 ..
 concat       -- concatenate the result of ..
 .replicate n -- repeating the input n times

-3 bytes gracias a @nimi


Puedes usar en -nlugar de abs n.
nimi


2

MATL , 37 bytes

jXJiXI0=?`1wtwDw]}I0>?I:"t]x}PI|:"t]x

Pruébalo en línea!

Explicación:

j            % input string
XJ           % copy to clipboard J
i            % input
XI           % copy to clipboard I
0            % number literal
=            % is equal? (element-wise, singleton expansion)
?            % if
  `          % do...while
    1        % number literal
    w        % swap elements in stack
    t        % duplicate elements
    w        % swap elements in stack
    D        % convert to string and display / string representation
    w        % swap elements in stack
  ]          % end
}            % else
  I          % paste from clipboard I
  0          % number literal
  >          % is greater than? (element-wise, singleton expansion)
  ?          % if
    I        % paste from clipboard I
    :        % range; vector of equally spaced values
    "        % for
      t      % duplicate elements
    ]        % end
    x        % delete
  }          % else
    P        % flip the order of elements
    I        % paste from clipboard I
    |        % absolute value / norm / determinant
    :        % range; vector of equally spaced values
    "        % for
      t      % duplicate elements
    ]        % end
    x        % delete
             % (implicit) end
             % (implicit) end
             % (implicit) convert to string and display

1

Python 3, 71 bytes

def f(n,s,k=1):
 if n<0:s=s[::-1];n=-n
 while n|k:print(end=s);n-=1;k=0

Pruébalo en línea!

La variable kgarantiza que el bucle siempre se ejecuta al menos una vez. Esto significa que si n=0, nserá negativo en la próxima iteración del ciclo, por lo que el ciclo continuará ejecutándose para siempre.


1

Matlab, 87 bytes

n=input('')
s=input('','s')
a=repmat(s,1,abs(n))
while~n s=[s s]
end
if n<0,flip(a)
end

¡Mi primer intento de code-golf! Cualquier sugerencia para jugar al golf es bienvenida.


Bienvenido al sitio! :)
DJMcMayhem

1

05AB1E , 17 16 14 bytes

0‹iR}¹Ä×¹_i[²?

Pruébalo en línea!

Explicación:

0‹iR}¹Ä×¹_i[²?
0‹             Is the input negative?
  iR}          If so, reverse the second input.
     ¹Ä        Get the absolute value of the first input.
       ×       Repeat the string that many times.
        ¹_     Boolean NOT the first input. (Is the first input 0?)
          i    If so...
           [   Do forever...
            ²? Print the second input without a newline.

Guardado 2 bytes gracias a @EriktheOutgolfer


Puede reemplazar '-åcon 0‹y 0Qcon _.
Erik the Outgolfer

@EriktheOutgolfer Gracias, editado.
Camarada SparklePony

1

Cubix , 41 Cuarenta y cuatro 45 bytes

Toma entrada como <N> <String>

.uq.sB.p$IA;p?;ouu(..!q/o()uq?..@<w?q<<_)

Pruébalo en línea!

Cubified:

      . u q
      . s B
      . p $
I A ; p ? ; o u u ( . .
! q / o ( ) u q ? . . @
< w ? q < < _ ) . . . .
      . . .
      . . .
      . . .

Míralo correr

Todavía hay una cantidad de no-ops en el código de las que podría obtener algunos bytes más, pero quería obtener esto antes de romperlo.

El procedimiento básico es

  • I obtener contador de entrada
  • A tomar el resto de la entrada como caracteres
  • ;p? eliminar el espacio, subir el número y probarlo
    • psuqB$)Si el contador es negativo, invierta la pila. Esto implica manejar el número de entrada y el marcador EOI (-1). Incrementa el contador.
    • ;p;ouqu Si el contador es cero, quite el contador y el marcador EOI e inicie el ciclo de salida perpetua.
    • ( si disminuye positivamente el contador
  • <<q?/o()uEl bucle de salida. Esto generará cada carácter de la pila hasta que se alcance el marcador EOI (-1).
  • ... _ ... ?wq!en el marcador EOI final, rodee el cubo y reflexione de nuevo sobre el ?, cambie de carril, suelte el marcador EOI en la parte inferior y pruebe el contador.
  • @ si es cero, deténgase
  • ?u( si el cambio de sentido es positivo y disminuye, el golpe termina al principio del ciclo
  • ? ... <) si es negativo, rodee el cubo hacia el otro lado, redirija al comienzo del ciclo mientras pasa sobre un incremento.
  • /)< si el incremento negativo y continuar al bucle de salida

¿No deja de funcionar esto si la cadena comienza con un número?
Destructible Lemon

@DestructibleLemon solucionado
MickyT

0

JavaScript (ES6), 79 bytes

 f=(n,s)=>n<0?f(-n,[...s].reverse().join``):(alert(!n?s:s.repeat(n)),!n&&f(n,s))

Retazo:

f=(n,s)=>n<0?f(-n,[...s].reverse().join``):(alert(!n?s:s.repeat(n)),!n&&f(n,s))

f(5, "hello world")
//f(0, "PPCG")  //uncomment this at your peril!!!
f(-2, "truThY")
f(2000, "o")


Estaba tratando de hacer algo recursivo como este, pero no pensé !n&&en hacer un bucle infinito. Sin embargo, ¿esto finalmente llegará a un StackOverflow? it should never terminate.
Stephen

Alertará a la cadena PPCG repetidamente. En Chrome (al menos), tengo que matar el navegador para detenerlo.
Rick Hitchcock

Entiendo tu punto. Creo que mi código aprovecharía la optimización de recursión de llamadas de cola en los navegadores que lo admiten.
Rick Hitchcock

Pruébelo con console.log. Me sale un error
Stephen

Hmm, tienes toda la razón: (
Rick Hitchcock

0

JavaScript (ES6), 98 94 91 83 bytes

n=>s=>{s=n<0?[...s].reverse().join``:s;while(!n)l(s);l(s.repeat(n<0?-n:n))}

-4, -5 bytes gracias a Arjun

-3 bytes gracias a Rick Hitchcock

Comenzó diferente a la respuesta de Java , pero rápidamente se volvió muy similar después del golf. La alerta es infinita, pero si quieres que se vea bien, cambia a console.log. l=alert;y escribir alertson de la misma longitud, pero si cambia a console.logmás corto para redefinirlo.


1
while(!n)l(s)en lugar de if(!n)for(;;)l(s).
Arjun

2
[...s].reverse()en lugar des.split''.reverse()
Rick Hitchcock

@RickHitchcock Siempre me olvido de eso :(
Stephen

l(s.repeat(Math.abs(n)))en lugar de forbucle por fin.
Arjun

0

QBIC , 36 bytes

Hay mucho aquí, y QBIC / QBasic simplemente no tiene la sintaxis para lidiar con tales condiciones con elegancia.

~:<0|;=_fA}[abs(a)|Z=Z+A]~a|_X}{?A';

Explicación:

~:<0|       IF cmd line arg 'a' is negative
  ;=_fA         Make cmd line arg A$ into its reverse
}           Close the IF (this eliminates the need for a | fuction terminator on _f)
[abs(a)|    FOR b = 1 to (abs(a) (hammering out negatives)
  Z=Z+A         Add A$ to Z$ (on exit, Z$ is printed explicitly)
]           NEXT
~a|_X       IF a is non-zero, terminate the program
}           END IF
{?A';       If we're here, just start a DO-loop and keep on printing the input.

0

Java (OpenJDK 8) , 137 bytes

void f(String[] a){for(long n=Long.valueOf(a[0]),i=0;n==0|i++<Math.abs(n);)System.out.print(n<0?new StringBuilder(a[1]).reverse():a[1]);}

Pruébalo en línea!


Esto parece un fragmento en lugar de un programa completo, lo cual no está permitido por el consenso de la comunidad .
Esolanging Fruit

Según la publicación que vinculó, "El valor predeterminado debe ser 'programas o funciones'" . Por lo tanto, dado que OP no declaró explícitamente que querían un programa completo , actualicé mi respuesta. Ahora consiste en un método .
Bashful Beluga

0

str , 30 bytes

I#Lbd0<[_u_][d0='e'u#?]#?xo;db

Pruébalo en línea!

Explicación

I#Lbd0<[_u_][d0='e'u#?]#?xo;db
...........................;      preamble
I                                 read number
 #L                               read rest of STDIN
   b                              buffer the STDIN
    d                             duplicate number
     0<[   ]           #?         if the number is less than zero
        _                         negate that number
         u_                       and reverse STDIN from buffer
            [         ]           otherwise
             d0='e  #?            if its 0, push the empty string
                  'u              otherwise, push the unbuffered STDIN untouched
                         x        repeat STDIN by the TOS
                          o       and output
                           ;..    main program (only activates when input = 0)
                            d     duplicate the implicitly unbuffered STDIN
                             b    and rebuffer it
                                  implicitly displayed

0

C (gcc) , 115 112 109 107 104 bytes

f(n,s,l,p,d)char*s;{d=n<0?-1:1;do for(l=1,p=0;p>=0;p+=l)s[p]?d==l&&putchar(s[p]):l--;while(!n||(n-=d));}

Pruébalo en línea!

¿Quién dijo que necesitamos strlen?

C (gcc) , 115 bytes (134 con #include<string.h>delante)

#include<string.h>
f(n,s)char*s;{int l=strlen(s),d=n<0?0:2,m=d--,p;do for(p=m?0:l-1;p!=(m?l:-1);p+=d)putchar(s[p]);while(!n||(n-=d));}

Pruébalo en línea!

Sin #include<string.h>nosotros, obtenemos un prototipo implícito para strlenque regrese int, pero strlenes size_t(al menos hoy en día, no estoy completamente seguro acerca de k & r o c89, pero creo que regresó inten los viejos tiempos).

Lo que falta #include <stdio.h>no es un problema, porque debido a la promoción de enteros, el prototipo predeterminado será int putchar(int)exactamente lo que queremos.


0

Retina , 49 bytes

/¶-/&V`^.+
/¶0/&//+>G0`
~`(.+)¶-*(\d+)
.-$2+>K`$1

Formato de entrada: toma la cadena, seguida de una nueva línea, seguida del número.

Pruébalo en línea!

Explicación:

/¶-/&V`^.+

El /¶-/&corre esta línea sólo si el número es negativo. Ves la etapa inversa, y se invierte ^.+, que coincide con la cadena ( .coincide con todos los caracteres excepto las nuevas líneas)

/¶0/&//+>G0`

El /¶0/&corre esta línea sólo si el número es 0. //+>comienza un bucle infinito, que imprime la cadena de trabajo después de cada iteración. G0toma la cadena y descarta el número; lo hace infinitamente, imprimiendo siempre.

~`...

Esto marca el código que generará una cadena; el programa evalúa la cadena como código Retina después.

(.+)¶-*(\d+)
.-$2+>K`$1

(.+)¶-*(\d+) coincide con la cadena completa y coloca la cadena en el grupo de captura 1 y el número en el grupo de captura 2. .-$2+>K ` $1genera el código Retina que se ejecutará: . desactiva la salida implícita (de lo contrario, la cadena se imprimiría n + 1 veces), -$2+establece un ciclo de repetición que se repite {capturando el grupo 2} veces. El menos al principio convierte el número en un número negativo, ya que esto deshabilita la funcionalidad de convergencia en el bucle, lo que lo detendría después de la primera iteración. >establece este ciclo para imprimir después de cada iteración. El resto del código es solo para imprimir la cadena.


0

Perl 6 , 44 bytes

{[$^s.flip,$s,$s Zxx-$^n,Inf,$n][$n.sign+1]}

Pruébalo en línea!

Bloque de código anónimo que toma un número y una cadena y devuelve una lista (posiblemente infinita)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.