¡Abucheo! Un desafío de golf de Halloween Code


15

Escriba un programa que tome una cadena de entrada de longitud de 2 o más caracteres y agregue la cadena ~BOO!~ (esa cadena tiene un espacio inicial y final) en un punto uniforme al azar en la cadena que no está en ninguno de los extremos.


Entradas de muestra no permitidas : 2o (una entrada vacía)

Salidas de muestra no permitidas : Hello ~BOO!~ o ~BOO!~ Hellopara la entradaHello

Entrada de muestra :Hello, World!

Resultados de muestra : Hel ~BOO!~ lo, World!oHello, Worl ~BOO!~ d!


Este es el código de golf, amigos. Aplican reglas estándar. El código más corto en bytes gana.


¡Felicitaciones a Dennis por tener el programa más corto y espeluznante! ¡Feliz Halloween!


¿Estaría bien un argumento de línea de comandos o tiene que ser stdin?
— DLosc

Cualquier cosa que tome una entrada e imprima esa salida con la modificación es aceptable. Uso STDIN de forma predeterminada porque es el único término con el que estoy familiarizado.
— Arcturus el

Respuestas:


6

Pyth, 19 18 bytes

j" ~BOO!~ "cz]OtUz

¡Gracias a @Jakube por jugar golf en 1 byte!

Pruébalo en línea.

Cómo funciona

                    (implicit) Store the input in z.
                Uz  Compute [0, ... len(z)-1].
               t    Remove the first element.
              O     Select an integer, pseudo-randomly.
             ]      Wrap it in an array.
           cz       Split the input string at that point.
j" ~BOO!~ "         Join the split string, using " ~BOO!~ " as separator.

4

GML, 91 bytes

s=get_string("","")
show_message(string_insert(" ~BOO!~ ",s,irandom(string_length(s)-2)+1);

Suficientemente simple: obtenga una cadena, inserte la subcadena en ella y envíe la cadena. Hecho.


Nunca pensé que vería GML en codegolf.
— Steffan Donal

3

Python 3, 60 bytes

s=input();n=1+hash(s)%(len(s)-1);print(s[:n],'~BOO!~',s[n:])

Nota:

El módulo de hash()se distribuirá uniformemente a lo largo de la cuerda. Si cree que eso está doblando las reglas, tenga en cuenta que debido a la aleatorización de hash de Python, esto es realmente aleatorio: las ejecuciones repetidas con la misma entrada darán resultados diferentes.


2

CJam, 20 bytes

l_,(mr)/(" ~BOO!~ "@

Pruébalo en línea

Explicación:

l       Get input.
_,      Calculate length.
(       Decrement, since the number of possible positions is 1 less than length.
mr      Generate random number between 0 and length-2
)       Increment, giving random number between 1 and length-1.
/       Split. Note that this splits repeatedly, but this will not do any harm.
        We will only really use the first split.
(       Peel off the first fragment after the split.
" ~BOO!~ "
        Push the magic string.
@       Rotate the list with the remaining fragments to the top.

2

Pip, 19 bytes

Toma información de la línea de comandos. Si la entrada tiene espacios u otros caracteres especiales, deberá colocarse entre comillas.

a^@1RR#aJ" ~BOO!~ "

Explicación:

a                    Command-line arg
 ^@                  Split at index...
   1RR#a             ...random integer >= 1 and < length(a) (Python randrange)
        J" ~BOO!~ "  Join on that string and autoprint

¿Quiere decir que la entrada debe pasarse como un único argumento de línea de comandos, o realmente tiene que pasar comillas a Pip?
— Dennis

1
@Dennis El primero. Las comillas son para evitar la expansión de la shell y para evitar que las cosas con espacios se traten como múltiples argumentos de línea de comandos.
— DLosc

1

Julia, 70 bytes

print((s=readline())[1:(r=rand(2:length(s)-2))]," ~BOO!~ ",s[r+1:end])

Sin golf:

# Read a line from STDIN
s = readline()

# Define a random integer within the bounds of s
r = rand(2:length(s)-2)

# Print to STDOUT with boo in there somewhere
print(s[1:r], " ~BOO!~ ", s[r+1:end])

1

APL, 27 bytes

{(-⌽' ~BOO!~ ',⍵⌽⍨⊢)?¯1+⍴⍵}

APL no tiene una función de inserción, por lo que rotamos la cadena en su lugar.

{                          }    ⍝ Monadic function:
                     ?¯1+⍴⍵     ⍝ Place to insert string, let's say it's X
 (                  )           ⍝ Monadic train:
               ⍵⌽⍨⊢            ⍝ Rotate input by X (⊢) to the left
    ' ~BOO!~ ',                 ⍝ Concatenate ' ~BOO!~ '
  -                             ⍝ -X
   ⌽                            ⍝ Rotate that by X to the right

Ejemplo de entrada en TryAPL


1

Vitsy, 19 bytes

Tenga en cuenta que zy Zfueron editados hoy, pero no para este desafío.

I1-R1 + \ i "~ OOB ~" zZ
I1- Obtenga la longitud de la entrada, menos 1
   R Empuja un número aleatorio del 0 al elemento superior de la pila.
    1+ Agregue uno: ahora es un número aleatorio del 1 para ingresar
                      longitud - 1.
      Obtengo tantos elementos de entrada.
        "~ OOB ~" Empuje '~ BOO ~' a la pila.
                 z Obtenga el resto de la entrada.
                  Z Salida de todo.

1

Lua, 75 bytes

s=io.read()m=math.random(2,#s/2);return s:sub(1,m).." ~BOO!~ "..s:sub(m,#s)

1

Python 3, 79 bytes

from random import*;s=input();n=randint(1,len(s)-1);print(s[:n],'~BOO!~',s[n:])

Pruébalo en línea

Se explica por sí mismo: lea una cadena, elija un número entero aleatorio entre 1 y la longitud de la cadena e imprima la cadena con ' ~BOO!~ 'insertada.


Mi solución exactamente . Al pie de la letra .
— Arcturus el

@Mego Ver un <code> ~ BOO! ~ </code> aleatorio en tu programa es bastante espeluznante.
— Arcturus el

Dado que printse imprimen varios argumentos separados por espacios, puede cortar los espacios con print(s[:n],'~BOO!~',s[n:]).
— xnor

1

Perl, 35 bytes

Código de 34 bytes + línea de comando de 1 byte

$-=rand y///c-2;s/..{$-}\K/~BOO!~/

Uso:

perl -p entry.pl

1

C #, 125 bytes

using System;class X{static void Main(string[]a){Console.Write(a[0].Insert(new Random().Next(a[0].Length-2)+1," ~BOO!~ "));}}

Expandido:

using System;
class X
{
    static void Main(string[] a)
    {
        Console.Write(a[0].Insert(new Random().Next(a[0].Length - 2) + 1, " ~BOO!~ "));
    }
}

Esta solución supone que la cadena se pasa como el primer parámetro de línea de comandos. Esto no es habitual para C # (stdin es más normal), por lo que también he incluido una solución que usa stdin normal:

C #, 139 bytes

using System;class X{static void Main(){var x=Console.In.ReadToEnd();Console.Write(x.Insert(new Random().Next(x.Length-2)+1," ~BOO!~ "));}}

Expandido:

using System;
class X
{
    static void Main()
    {
        var x = Console.In.ReadToEnd();
        Console.Write(x.Insert(new Random().Next(x.Length - 2) + 1, " ~BOO!~ "));
    }
}

(ver comentarios, los argumentos están bien) static void Main(string[] x) {Console.Write(x[0].Insert (...) x[0].Length (...)acortará su código
— Jan 'splite' K.

0

MATLAB, 69 bytes

i=input('');a=randi(nnz(i)-1,1);disp([i(1:a) ' ~Boo!~ ' i(a+1:end)]);

Insertar una cadena a mitad de cadena en un índice dado en MATLAB es costoso en términos de bytes. Si hubiera una manera simple de hacerlo, podría ahorrar una buena cantidad al pasar a una función anónima, pero no puedo encontrar una. Ah bueno.

Básicamente, obtiene un número aleatorio entre 1 y la longitud de la cadena menos 1. Luego muestra todo hasta ese índice, incluido el índice, seguido de ~Boo!~, y luego todo después del índice hasta el final.


También funciona con Octave , por lo que puede probarlo en línea aquí .


0

Bash / GNU, 61 bytes

echo $1|sed "s/.\{`shuf -i1-$((${#1}-1)) -n1`\}/\0 ~BOO!~ /"

Toma la cadena de entrada como argumento



0

JavaScript, 79

r=Math.random()*((x=prompt()).length-1)+1;x.substr(0,r)+" ~BOO!~ "+x.substr(r);

Es para la consola del navegador; diviértete con eso.


0

Java 8, 158154 bytes

interface M{static void main(String[]a){int i=a[0].length()-2;System.out.println(a[0].substring(0,i=1+(i*=Math.random()))+" ~BOO!~ "+a[0].substring(i));}}

Pruébalo aquí.

EDITAR: solo ahora lee el programa en lugar de la función / programa predeterminado en la descripción del desafío. Así que agregó el código de borde con la interfaz y el método principal.

Si se permitiera una función, sería ( 99 95 bytes )

s->{int i=s.length()-2;return s.substring(0,i=1+(i*=Math.random()))+" ~BOO!~ "+s.substring(i);}

Pruébalo aquí.

Explicación:

s->{                        // Method with String as both parameter and return-type
  int i=s.length()-2;       //  The length of the input - 2
  return s.substring(0,i=1  //  Return the first part of the input from index 0 to 1
    +(i*=Math.random()))    //    + a random integer between 0 and length-2
   +" ~BOO!~ "              //   appended with the literal " ~BOO!~ "
   +s.substring(i);         //   appended with the rest of the input-String
}                           // End of method


-1

TeaScript, 30 bytes

xh(j=N(xn-1)+1)+' ~BOO!~ '+xS(j)

Muy sencillo.


-1

CJam, 19 bytes

q_,mr)/(" ~BOO!~ "@

Esto fallará cuando mrregrese 0o 1, porque ni -1ni 0son válidos para dividir una cadena con /.
— Martin Ender

Entonces debe ser)
— username.ak

Ahora se puede poner BOOal final de la cadena, también necesitarías un (antes mr. Pero entonces es idéntico a esta respuesta: codegolf.stackexchange.com/a/62355/8478
— Martin Ender

Uso q (lee todas las entradas, incluida la nueva línea), él usa l (lee solo 1 línea)
— username.ak

Ah, está bien, entonces debe especificar que su código espera que la entrada tenga un salto de línea final (porque no necesariamente tiene uno, en cuyo caso qy lson sinónimos).
— Martin Ender
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.