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!


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.

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.


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.


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.

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

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])

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


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.

1

Lua, 75 bajtów

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

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.


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

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!~ "));
    }
}

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


0

Bash / GNU, 61 bajtów

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

Bierze ciąg wejściowy jako argument



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.


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


-1

TeaScript, 30 bajtów

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

Bardzo prosto.


-1

CJam, 19 bajtów

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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.