Gwizd! Golfowe wyzwanie na Halloween

15

Napisz program, który pobiera ciąg wejściowy o długości 2 lub więcej znaków i dodaje ciąg ~BOO!~ (ten ciąg ma spację początkową i końcową) w jednolicie losowym miejscu ciągu, który nie znajduje się na żadnym końcu.


Niedozwolone próbki danych wejściowych : 2lub (puste dane wejściowe)

Niedozwolone próbki danych wyjściowych : Hello ~BOO!~ lub ~BOO!~ Hellodane wejścioweHello

Przykładowe dane wejściowe :Hello, World!

Przykładowe wyniki : Hel ~BOO!~ lo, World!lubHello, Worl ~BOO!~ d!


To jest golf golfowy, chłopaki. Obowiązują standardowe zasady. Najkrótszy kod w bajtach wygrywa.


Gratulacje dla Dennisa za najkrótszy, najstraszniejszy program! Wesołego Halloween!

Arktur
źródło
Czy argument wiersza poleceń byłby w porządku, czy też powinien być ustawiony na standardowe?
DLosc
Wszystko, co wymaga danych wejściowych i drukuje dane wyjściowe z modyfikacją, jest dopuszczalne. Domyślnie używam STDIN, ponieważ jest to jedyny termin, który znam.
Arcturus

Odpowiedzi:

6

Pyth, 19 18 bajtów

j" ~BOO!~ "cz]OtUz

Dzięki @Jakube za grę w golfa z 1 bajtu!

Wypróbuj online.

Jak to działa

                    (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
źródło
4

GML, 91 bajtów

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

Dość proste - weź ciąg, wstaw do niego podciąg i wyślij ciąg. Gotowy.

Niet the Dark Absol
źródło
Nigdy nie myślałem, że zobaczę GML na codegolf.
Steffan Donal
3

Python 3, 60 bajtów

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

Uwaga:

Moduł hash()będzie równomiernie rozmieszczony na całej długości łańcucha. Jeśli uważasz, że to nagina reguły, zwróć uwagę, że z powodu losowej funkcji skrótu Pythona jest to w rzeczywistości losowe: wielokrotne wykonywanie z tymi samymi danymi wejściowymi da różne wyniki.

Alexis
źródło
2

CJam, 20 bajtów

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

Wypróbuj online

Wyjaśnienie:

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
źródło
2

Pip, 19 bajtów

Pobiera dane z wiersza polecenia. Jeśli dane wejściowe zawierają spacje lub inne znaki specjalne, należy je umieścić w cudzysłowach.

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

Wyjaśnienie:

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
źródło
Czy masz na myśli, że dane wejściowe muszą być przekazywane jako pojedynczy argument wiersza poleceń, czy faktycznie musisz przekazywać cudzysłowy do Pipa?
Dennis
1
@Dennis Były. Cytaty mają zapobiegać rozszerzaniu się powłoki i zapobiegać traktowaniu elementów ze spacjami jako wielu argumentów wiersza poleceń.
DLosc
1

Julia, 70 bajtów

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

Nie golfowany:

# 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.
źródło
1

APL, 27 bajtów

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

APL nie ma funkcji wstawiania, więc zamiast tego obracamy ciąg.

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

Przykładowe dane wejściowe na TryAPL

lirtosiast
źródło
1

Vitsy, 19 bajtów

Należy pamiętać, że zi Zbyły edytowane dzisiaj, ale nie na to wyzwanie.

I1-R1 + \ i "~ OOB ~" zZ
I1- Uzyskaj długość wejścia minus 1
   R Naciśnij losową liczbę od 0 do najwyższej pozycji na stosie.
    1+ Dodaj jeden do niego - jest to teraz losowa liczba od 1 do wejścia
                      długość - 1.
      \ I Zdobądź tyle elementów wejściowych.
        „~ OOB ~” Wciśnij „~ BOO ~” na stos.
                 z Uzyskaj resztę danych wejściowych.
                  Z Wydrukuj wszystko.
Addison Crump
źródło
1

Lua, 75 bajtów

s=io.read()m=math.random(2,#s/2);return s:sub(1,m).." ~BOO!~ "..s:sub(m,#s)
Digital Veer
źródło
1

Python 3, 79 bajtów

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

Wypróbuj online

Całkiem zrozumiałe - przeczytaj ciąg, wybierz losową liczbę całkowitą od 1 do długości ciągu i wydrukuj ciąg z ' ~BOO!~ 'wstawionym.

Mego
źródło
Dokładnie moje rozwiązanie . Do listu .
Arcturus
@Mego Oglądanie losowego <code> ~ BOO! ~ </code> pojawiającego się w twoim programie jest dość przerażające.
Arcturus
Ponieważ wiele argumentów do printwydrukowania jest oddzielonych spacjami, możesz wycinać spacje za pomocą print(s[:n],'~BOO!~',s[n:]).
xnor 31.10.15
1

Perl, 35 bajtów

34 bajtowy kod + 1 bajtowy wiersz poleceń

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

Stosowanie:

perl -p entry.pl
Jarmex
źródło
1

C #, 125 bajtów

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

Rozszerzony:

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

To rozwiązanie zakłada, że ​​ciąg jest przekazywany jako pierwszy parametr wiersza polecenia. Nie jest to normalne w przypadku C # (standardowe wejście jest bardziej normalne), więc dołączyłem również rozwiązanie, które używa normalnego standardowego wejścia:

C #, 139 bajtów

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

Rozszerzony:

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
źródło
(patrz komentarze, argumenty są w porządku) static void Main(string[] x) {Console.Write(x[0].Insert (...) x[0].Length (...)skróci Twój kod
Jan „splite” K.
0

MATLAB, 69 bajtów

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

Wstawienie ciągu środkowego ciągu w danym indeksie w MATLAB jest kosztowne pod względem bajtów. Gdyby istniał prosty sposób, można by zaoszczędzić sporo, przechodząc do funkcji anonimowej, ale nie mogę jej znaleźć. Ach tak.

Zasadniczo otrzymuje losową liczbę między 1 a długością ciągu minus 1. Następnie wyświetla wszystko aż do tego indeksu włącznie, a następnie ~Boo!~, a potem wszystko po indeksie do końca.


Działa również z Octave , więc możesz wypróbować go online tutaj .

Tom Carpenter
źródło
0

Bash / GNU, 61 bajtów

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

Bierze ciąg wejściowy jako argument

Fabian Schmengler
źródło
0

Rubinowy, 46 bajtów

$><<gets.insert(rand(1..$_.size-2),' ~BOO!~ ')
Peter Lenkefi
źródło
0

JavaScript, 79

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

To jest na konsolę przeglądarki; baw się dobrze po prostu wpadając.

ŽaMan
źródło
0

Java 8, 158 154 bajtów

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

Wypróbuj tutaj.

EDYCJA: Dopiero teraz odczytuje program zamiast domyślnej funkcji / programu w opisie wyzwania. Dodano kod kreskowy z interfejsem i główną metodą.

Jeśli funkcja byłaby dozwolona, ​​byłaby to ( 99 95 bajtów )

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

Wypróbuj tutaj.

Wyjaśnienie:

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
źródło
0

Chaîne , 23 bajty

{il1-R1+`} ~BOO!~ {<$/}
Conor O'Brien
źródło
-1

TeaScript, 30 bajtów

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

Bardzo prosto.

Downgoat
źródło
-1

CJam, 19 bajtów

q_,mr)/(" ~BOO!~ "@
nazwa_użytkownika.ak
źródło
Nie powiedzie się to po mrpowrocie 0lub 1, ponieważ ani -1nie 0są ważne do dzielenia łańcucha /.
Martin Ender,
To musi być)
username.ak
Teraz można umieścić BOOna końcu łańcucha, będziesz również potrzebował (wcześniej mr. Ale to jest identyczne z odpowiedzią: codegolf.stackexchange.com/a/62355/8478
Martin Ender
Używam q (czyta wszystkie dane wejściowe, w tym znak nowej linii), używa l (czyta tylko 1 linię)
username.ak
No dobrze, powinieneś określić, że twój kod oczekuje, że dane wejściowe będą miały końcowy kanał (ponieważ niekoniecznie taki ma, w takim przypadku qi lsą synonimami).
Martin Ender,