Vaia! Um Desafio de Golfe do Halloween Code

15

Escreva um programa que use uma string de entrada com 2 ou mais caracteres e inclua a string ~BOO!~ (essa string possui um espaço inicial e final) em um local aleatoriamente uniforme na string que não está em nenhuma das extremidades.


Entradas de amostra não permitidas : 2ou (uma entrada vazia)

Saídas de amostra não permitidas : Hello ~BOO!~ ou ~BOO!~ Hellopara a entradaHello

Entrada de amostra :Hello, World!

Saídas de amostra : Hel ~BOO!~ lo, World!ouHello, Worl ~BOO!~ d!


Isso é código de golfe, pessoal. Aplicam-se regras padrão. O código mais curto em bytes vence.


Parabéns a Dennis por ter o programa mais curto e assustador! Feliz Dia das Bruxas!

Arcturus
fonte
Um argumento da linha de comando seria bom ou precisa ser stdin?
DLosc
Qualquer coisa que pegue uma entrada e imprima essa saída com a modificação é aceitável. Eu uso o STDIN por padrão, porque é o único termo com o qual estou familiarizado.
quer

Respostas:

6

Pitão, 19 18 bytes

j" ~BOO!~ "cz]OtUz

Graças a @Jakube por jogar fora 1 byte!

Experimente online.

Como 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.
Dennis
fonte
4

GML, 91 bytes

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

Simples o suficiente - pegue uma string, insira a subcadeia, produza a string. Feito.

Niet, o Escuro Absol
fonte
Nunca pensei que veria o GML no codegolf.
Steffan Donal
3

Python 3, 60 bytes

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

Nota:

O módulo de hash()será distribuído uniformemente ao longo do comprimento da corda. Se você acha que isso está distorcendo as regras, observe que, devido à randomização de hash do python, isso é realmente aleatório: execuções repetidas com a mesma entrada fornecerão resultados diferentes.

alexis
fonte
2

CJam, 20 bytes

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

Experimente online

Explicação:

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.
Reto Koradi
fonte
2

Pip, 19 bytes

Recebe entrada da linha de comando. Se a entrada tiver espaços ou outros caracteres especiais, ela precisará ser colocada entre aspas.

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

Explicação:

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
DLosc
fonte
Você quer dizer que a entrada precisa ser passada como um único argumento de linha de comando ou você realmente precisa passar aspas para Pip?
Dennis
1
@Dennis O primeiro. As aspas são para impedir a expansão do shell e impedir que itens com espaços sejam tratados como vários argumentos da linha de comando.
DLosc
1

Julia, 70 bytes

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

Ungolfed:

# 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])
Alex A.
fonte
1

APL, 27 bytes

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

O APL não possui uma função de inserção, portanto, giramos a string.

{                          }    ⍝ 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

Exemplo de entrada no TryAPL

lirtosiast
fonte
1

Vitsy, 19 bytes

Observe que ze Zforam editados hoje, mas não para esse desafio.

I1-R1 + \ i "~ OOB ~" zZ
I1- Obter o comprimento da entrada, menos 1
   R Empurre um número aleatório de 0 para o item superior da pilha.
    1+ Adicione um a ele - agora é um número aleatório de 1 a entrada
                      comprimento - 1.
      \ i Consiga muitos itens de entrada.
        "~ OOB ~" Pressione '~ BOO ~' para a pilha.
                 z Obtenha o restante da entrada.
                  Z Mostra tudo.
Addison Crump
fonte
1

Lua, 75 bytes

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

Python 3, 79 bytes

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

Experimente online

Muito auto-explicativo - leia uma sequência, escolha um número inteiro aleatório entre 1 e o comprimento da sequência e imprima a sequência com ' ~BOO!~ 'inserida.

Mego
fonte
Minha solução exatamente . Para a carta .
Arcturus
@Mego Ver um <code> ~ BOO! ~ </code> aleatório aparecer no seu programa é bastante assustador.
Arcturus
Como vários argumentos printsão impressos separados por espaço, você pode cortar os espaços com print(s[:n],'~BOO!~',s[n:]).
Xnor
1

Perl, 35 bytes

Código de 34 bytes + linha de comando de 1 byte

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

Uso:

perl -p entry.pl
Jarmex
fonte
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 solução pressupõe que a cadeia seja passada como o primeiro parâmetro da linha de comandos. Isso não é usual para C # (stdin é mais normal), então eu também incluí uma solução 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!~ "));
    }
}
Timwi
fonte
(veja comentários, argumentos estão ok) static void Main(string[] x) {Console.Write(x[0].Insert (...) x[0].Length (...)diminuirá seu 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)]);

Inserir uma string no meio de um índice no MATLAB é caro em termos de bytes. Se houvesse uma maneira simples de fazer isso, eu poderia economizar uma quantia razoável, passando para uma função anônima, mas não consigo encontrar uma. Ah bem.

Basicamente, ele obtém um número aleatório entre 1 e o comprimento da string menos 1. Em seguida, ele exibe tudo, inclusive esse índice, seguido pelo ~Boo!~, e tudo depois do índice até o final.


Também funciona com o Octave , para que você possa testá-lo online aqui .

Tom Carpenter
fonte
0

Bash / GNU, 61 bytes

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

Pega a string de entrada como argumento

Fabian Schmengler
fonte
0

Ruby, 46 bytes

$><<gets.insert(rand(1..$_.size-2),' ~BOO!~ ')
Peter Lenkefi
fonte
0

JavaScript, 79

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

É para o console do navegador; divirta-se apenas colocando isso.

ManaMan
fonte
0

Java 8, 158 154 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));}}

Experimente aqui.

EDIT: Somente agora lendo o programa em vez da função / programa padrão na descrição do desafio. Adicionamos o código de borda com a interface e o método principal.

Se uma função fosse permitida, seria ( 99 95 bytes )

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

Experimente aqui.

Explicação:

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
Kevin Cruijssen
fonte
0

Chaîne , 23 bytes

{il1-R1+`} ~BOO!~ {<$/}
Conor O'Brien
fonte
-1

TeaScript, 30 bytes

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

Muito direto.

Downgoat
fonte
-1

CJam, 19 bytes

q_,mr)/(" ~BOO!~ "@
nomedeusuario.ak
fonte
Isso falhará quando mrretornar 0ou 1, porque nem -1nem 0são válidos para dividir uma string /.
Martin Ender
Então deve ser)
username.ak
Agora ele pode colocar BOOno final da string, você também precisaria de um (antes mr. Mas é idêntico a esta resposta: codegolf.stackexchange.com/a/62355/8478
Martin Ender
Eu uso q (lê todas as entradas, incluindo novas linhas), ele usa l (lê apenas 1 linha)
username.ak
Ah, tudo bem, então você deve especificar que seu código espera que a entrada tenha um avanço de linha à direita (porque não necessariamente tem um, nesse caso qe lé sinônimo).
Martin Ender