¡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.