ssTTsSTtRrriinInnnnNNNIiinngg


18

Вызов

Для каждого символа строки, кроме последнего, выполните следующие действия:

  • Выведите текущий символ.

  • Затем следует случайный вывод из следующего списка случайного числа раз от 1 до 5 (включительно):

    • Текущий персонаж
    • Следующий символ строки
    • Версия переключателя персонажа, на котором вы сейчас находитесь
    • Версия switchcase следующего символа строки.

Тестовые случаи

String -> SSSTSStrTrIiinIIngn

, . , . , . Hello world! -> ,,, .. , ,, .... , , .. .. . HHH HHEeelLlLllooO wwOworOOrrrRllDd!!D

Programming Puzzles and Code Golf -> PrPPrRrOooooogggRgGraAraaaMMMmmmimMIiininGGgG PPPPuZzZZzZzzZzllLLEEeEsEsssS a aANnNddD C COCoooOOdeDe E GGGoOllFFf

Примечания

  • Вам нужно только применить версию символа переключения, если символ является частью алфавита (AZ и az).
  • Ваша случайная функция не обязательно должна быть однородной, но она все же должна иметь шанс вернуть любой элемент в указанном списке.
  • Вам разрешено использовать любой стандартный формат ввода / вывода.
  • Вы можете предположить, что длина ввода больше или равна двум.
  • Вы можете предположить, что ввод состоит только из символов ASCII.
  • Заголовок не является контрольным примером (он непреднамеренный, если он является допустимым контрольным примером).
  • Switchcase означает переводить символ в нижний регистр, если он является прописным, и переводить его в верхний регистр, если он строчный.

В дополнение к «... не обязательно должен быть однородным», я думаю, что вы, вероятно, хотите указать, что при некотором вводе все конечные допустимые выводы в принципе должны быть сгенерированы (в противном случае мое неоднородное случайное целое число в [1 , 2,3,4,5] всегда будет равно 2, и я просто выведу исходную строку).
Час Браун

@ChasBrown Да, я отредактирую вопрос
MilkyWay90

2
Я нахожу спецификацию запутывающей. Можете ли вы быть более явным? Например, выяснить, как StringпроизводитSSSTSStrTrIiinIIngn
Луис Мендо

7
@LuisMendo Я не OP, но я думаю: [S]SSTSS [t]rT, [r]I, [i]inII, [n]gnгде символы между блоками являются первыми точками маркера (« Вывести текущий символ »), а другие символы случайным образом 1-5 раз один из четырех вариантов для этого персонаж. Но я согласен, некоторые более четкие объяснения были бы уместны. Помимо тестового примера, было не совсем понятно, нужно ли выбирать случайный выбор 1-5 раз. Вместо того, чтобы выбирать случайный выбор, повторяемый 1-5 раз (как в настоящее время делает ответ Gaia).
Кевин Круйссен

3
@KevinCruijssen Спасибо, Ваше объяснение соответствует примеру и понятно. ОП должен подтвердить и отредактировать это в тексте
Луис Мендо

Ответы:


6

Gaia , 25 байт

ṇ\+†ṅ\⟨)₌¤:~+4ṛ⟨ṛ₌¤⟩ₓ\⟩¦$

Попробуйте онлайн!

Спасибо Кевину Круйссену за указание на 2 ошибки!

ṇ\				| delete the last character from the input
  +†				| push the input again and concatenate together, so for instance
				| 'abc' 'bc' becomes ['ab' 'bc' 'c']
    ṅ\				| delete the last element
       ⟨       		⟩¦	| for each of the elements, do:
	)₌			| take the first character and push again
	  ¤			| swap
	   :			| dup
	    ~			| swap case
	     +			| concatenate strings
	      4ṛ		| select a random integer from [1..5]
	        ⟨    ⟩ₓ		| and repeat that many times
		 ṛ₌¤		| select a random character from the string
		      \ 	| clean up stack
			   $	| convert to string

Обратите внимание, что 4ṛэто потому, что реализовано для целого числа zкак Python random.randint(1,z+1), которое возвращает целое число, Nтакое что 1<=N<=z+1.


Вы уверены, что кодирование длины прогона здесь правильно? Если я правильно понимаю задачу: четыре варианта следует выбирать случайным образом 1-5 раз, вместо того, чтобы выбирать один из четырех случайным образом, повторять 1-5 раз. Первый пример output SSSTSStrTrIiinIIngn( [SSSTSS, trT, rI, iinII, ngn]), кажется, отражает это, и в настоящее время не является возможным выводом в вашей программе (я думаю).
Кевин Круйссен

@KevinCruijssen Я интерпретировал «вывод из списка случайное число раз», чтобы означать декодирование по длине прогона, но вы правы, тестовые примеры, похоже, указывают на другую интерпретацию; Я думаю, что это должно быть довольно легко исправить
Джузеппе

1
5ṛможет привести 6по какой-то причине Попробуйте онлайн ? PS: Разве в Gaia нет целочисленного или ранжированного списка?
Кевин Круйссен

1
@KevinCruijssen черт, Business Cat действительно нужно исправлять отдельные ошибки ... Я действительно думал, что была forконструкция типа, но я почти уверен, что это даже не задокументировано на вики-странице.
Джузеппе

4

APL (dzaima / APL) , 23 байта

Функция анонимного молчаливого префикса.

2(⊣,{?4⍴⍨?5}⊇,,-⍤,)/

Попробуйте онлайн!

2()/ Применить следующую инфиксную молчаливую функцию между каждой парой символов:

- switchcase
 из
, конкатенации пары

,, присоединить конкатенацию пары к этому

{}⊇ Выберите из этого следующие элементы:

  ?5 случайное число в диапазоне 1… 5

  4⍴⍨ что много четверок

  ? случайные индексы для тех

ε NLIST (Flatten)


3

Perl 6 , 60 байт

{S:g{.)>(.)}=$/~[~] roll ^5 .roll+1,$/.lc,$/.uc,$0.lc,$0.uc}

Попробуйте онлайн!

Строчная / прописная часть немного раздражает.


Я не знаю Perl, поэтому я, вероятно, говорю здесь что-то глупое. Но возможно ли как-то объединить $/и $0вместе и использовать .lcв этой строке, а затем создать копию этой строки и использовать .ucи объединить эти два вместе? Не уверен , если это вообще возможно, или короче , чем ток $/.lc,$/.uc,$0.lc,$0.uc, но это означало бы , вы бы использовать $/, $0, .lcи .ucодин раз.
Кевин Круйссен

1
Увы, (.lc~.uc for $0~$/).combдольше. Perl 6 действительно хочет различать строки и списки, поэтому "abc"[0] eq "abc"(он претендует на то, чтобы быть списком из одного элемента).
Ven

Вы можете сделать это, поскользнувшись и применив анонимную функцию к списку: {.lc,|.uc}($/,|$0)для -5 байтов, и просто используйте список совпадений {.lc,|.uc}(@$/)для -8 байтов. tio.run/…
Фил Х

@PhilH Нет, это не работает. Эти решения пишутся только с заглавной буквы
Джо Кинг,


3

Баш , 121 байт

-20 байт благодаря Науэлю

-9 байт благодаря roblogic

for((i=0;i<${#1};i++)){
s=${1:i:1}
m=${1:i:2}
m=${m,,}${m^^}
for((t=0;t++<RANDOM%6;)){
s+=${m:RANDOM%4:1}
}
printf "$s"
}

Попробуйте онлайн!

Оригинальный ответ

удар , 150 байт

Сделали очень мало ударов по гольфу и пытались улучшить мой удар, поэтому любые комментарии приветствуются.

for((i=0;i<${#1}-1;i++));do
c=${1:$i:1}
n=${1:$((i+1)):1}
a=($n ${c,} ${c^} ${n,} ${n^})
shuf -e ${a[@]} -n "$(shuf -i 1-5 -n 1)"|xargs printf %s
done

Попробуйте онлайн!

Код - это простой цикл по символам, задающий текущий cи следующий nсимвол, затем создающий массив из 4-х возможностей, повторяя одну из них, чтобы получилось ровно 5. Затем мы перетасовываем этот массив, а затем выбираем из него n элементов, где само n случайно между 1 и 5.


кажется, что он пропалprintf %s "$c"
Науэль Фуйе

1
doи doneмогут быть заменены недокументированными {и}
Науэль Фуий


1
@roblogic это умно. tyvm.
Иона

1
121-байтовое решение немного хрупкое / ошибочное, вот более надежная (133-байтовая) версия, которая должна обрабатывать все печатные ASCII, tio.run
roblogic


2

05AB1E , 18 17 байт

ü)vyн5LΩFyD.š«Ω]J

Вдохновленный ответом Gaia @Giuseppe .
-1 байт благодаря @Shaggy .

Попробуйте онлайн 10 раз или проверьте все тесты 10 раз .

Объяснение:

ü)             # Create all pairs of the (implicit) input
               #  i.e. "Hello" → [["H","e"],["e","l"],["l","l"],["l","o"]]
  v            # Loop over each these pairs `y`:
   yн          #  Push the first character of pair `y`
   5LΩ         #  Get a random integer in the range [1,5]
      F        #  Inner loop that many times:
       y       #   Push pair `y`
        D.š«   #   Duplicate it, swap the cases of the letters, and merge it with `y`
            Ω  #   Then pop and push a random character from this list of four
  ]J           # After both loops: join the entire stack together to a single string
               # (which is output implicitly as result)

Я не знаю 05AB1E, но вместо этого INèвы могли бы сохранить что-либо, нажав первый символ y?
Лохматый

@ Shaggy Да, я действительно могу .. Спасибо! Может быть, я должен прекратить играть в гольф на сегодня, я в беспорядке,
смеется

Ты в беспорядке? ¨vNUy5LΩFy¹X>è«D.š«Ω?
Волшебная Урна Осьминога

1
@MagicOctopusUrn Хотя довольно оригинальный подход, я боюсь , что это не делает первую точку пули вызова ( « Выход текущего символа. »), Так как результат может начаться с t, Tили sдля ввода "String"в вашей программе, в то время как он должен всегда начинаться с S.
Кевин Круйссен

1

Древесный уголь , 27 байт

FLθ«F∧ι⊕‽⁵‽⭆✂θ⊖ι⊕ι¹⁺↥λ↧λ§θι

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

FLθ«

Цикл по всем индексам входной строки.

F∧ι⊕‽⁵

За исключением первого индекса, переберите случайное число от 1 до 5 включительно ...

‽⭆✂θ⊖ι⊕ι¹⁺↥λ↧λ

... извлечь из строки предыдущий и следующий символы, взять версии в верхнем и нижнем регистре и выбрать случайный символ из четырех.

§θι

Распечатать символ по текущему индексу.


1

Perl 5 ( -p), 77 байт

s/(.)(?=(.))/$x=$1;'$x.=substr"\U$1$2\L$1$2",4*rand,1;'x(1+5*rand)/gee;s/.$//

TIO


Вы можете сохранить 4 байта, используя $&вместо $1, и chop+ -lвместоs/.$//
Dada

1

Japt -P , 14 байт

äÈ+Zu pv ö5ö Ä

Попытайся

äÈ+Zu pv ö5ö Ä     :Implicit input of string
ä                  :Take each consectutive pair of characters
 È                 :Pass them through the following function as Z
  +                :  Append to the first character of the pair
   Zu              :    Uppercase Z
      p            :    Append
       v           :      Lowercase
         ö         :    Get X random characters, where X is
          5ö       :      Random number in the range [0,5)
             Ä     :      Plus 1
                   :Implicitly join and output



1

C (GCC) 175 162 байта

-12 байт от LambdaBeta

f(s,S,i,r,a)char*s,*S,*i;{srand(time(0));for(i=S;*(s+1);++s){*i++=*s;for(r=rand()%5+1;r--;*i++=rand()&1?a>96&a<123|a>64&a<91?a^32:a:a)a=rand()&1?*s:*(s+1);}*i=0;}

Попробуйте онлайн


Я не думаю, что вам нужно 0в первой строке.
LambdaBeta

Также можно сохранить много символов, взяв буфер Sв качестве параметра и добавив переменные в список аргументов: попробуйте онлайн!
LambdaBeta

@LambdaBeta оказывается, что вы правы в отношении того 0, что сделало его #defineболее
неуместным


1

PowerShell , 154 105 103 95 87 байт

-67 байт благодаря маззи, которого невозможно остановить

-join(($x=$args)|%{$_;$x[$i,++$i]*5|%{"$_"|% *wer;"$_"|% *per}|random -c(1..5|random)})

Попробуйте онлайн!

Не фантастический метод, но он работает. Теперь это довольно хорошо. Вводит через сплаттинг


Ого, это много байтов.
MilkyWay90

1
@ Mazzy Dang собака. Мне нужно привыкнуть все время брызгать, но я не знал, что вы могли бы срочно поменять такие символы.
Веска

1
Я извиняюсь, 87 байтов
маззи

0

Scala 2.12.8, 214 байт

Гольф версия:

val r=scala.util.Random;println(readLine.toList.sliding(2).flatMap{case a :: b :: Nil=>(a +: (0 to r.nextInt(5)).map{_=>((c: Char)=>if(r.nextBoolean)c.toUpper else c.toLower)(if(r.nextBoolean)a else b)})}.mkString)

Гольф с новыми строками и отступами:

val r=scala.util.Random
println(readLine.toList.sliding(2).flatMap{
  case a :: b :: Nil=>
    (a +: (0 to r.nextInt(5)).map{_=>
      ((c: Char)=>if(r.nextBoolean)c.toUpper else c.toLower)(if(r.nextBoolean)a else b)
    })
}.mkString)

Ungolfed:

import scala.io.StdIn
import scala.util.Random

def gobble(input: String): String = {
  input.toList.sliding(2).flatMap {
    case thisChar :: nextChar :: Nil =>
      val numberOfAdditions = Random.nextInt(5)
      (thisChar +: (0 to numberOfAdditions).map { _ =>
        val char = if(Random.nextBoolean) thisChar else nextChar
        val cc = if(Random.nextBoolean) char.toUpper else char.ToLower
        cc
      })
  }.mkString
}

println(gobble(StdIn.readLine()))

1
Нет способа превратиться a :: b :: Nilв a::b::Nil? То же самое для a :+, a:+()или a.:+()может работать
Вен

@Ven a::b::Nilвызывает ошибку компиляции. +:метод определен в списке, так что он может сэкономить место, избавившись от внешних паренов?
Сорен

У вас здесь только один элемент, так что он все равно не будет автоматически загружаться
Ven


0

C # (интерактивный компилятор Visual C #) , 236 213 209 байт

a=>{int i=0,j;var m=new Random();var s="";var c = a.Select(x=>Char.IsLetter(x)?(char)(x^32):x).ToArray();for(;i<a.Length-1;i++)for(j=m.Next(1,5);j-->0;)s+=new[]{a[i],c[i],a[i+1],c[i+1]}[m.Next(0,3)];return s;}

Попробуйте онлайн!


Не работает с не алфавитно-цифровыми символами. char b=a[0]-> var b=a[0], дополнительное пространство в объявлении цикла dfor
Embodiment of Ignorance

0

Запрос T-SQL, 286 байт

DECLARE @ char(999)='String'

SELECT @=stuff(@,n+2,0,s)FROM(SELECT
top 999*,substring(lower(c)+upper(c),abs(v%4)+1,1)s
FROM(SELECT*,number n,substring(@,number+1,2)c,cast(newid()as varbinary)v
FROM(values(1),(2),(3),(4),(5))F(h),spt_values)D
WHERE'P'=type and n<len(@)-1and h>v%3+2ORDER
BY-n)E
PRINT LEFT(@,len(@)-1)

Попробуйте онлайн, к сожалению, онлайн-версия всегда показывает один и тот же результат для одного и того же varchar, в отличие от MS SQL Server Management Studio



0

Japt -P , 43 16 байт

äÈ+(Zv +Zu)ö5ö Ä

Укорочено много сейчас!

Попытайся


Кажется, это каждый раз возвращает один и тот же результат.
Лохматый

@ Шагги исправит. Кроме того, в äописании говорится, что он дает три аргумента, с последним x+y. Но, как вы можете видеть здесь , он просто возвращает 1. Это ошибка?
Воплощение невежества

0

C (gcc) , 110 109 байтов

i,p;g(char*_){for(i=rand(putchar(*_))%1024;p=_[i%2],putchar(i&2&&p>64&~-p%32<26?p^32:p),i/=4;);_[2]&&g(_+1);}

Попробуйте онлайн!

-1 благодаря потолку

i,p;g(char*_){
    for(i=rand(putchar(*_)) //print current char
         %1024;             // and get 10 random bits
        p=_[i%2],           //1st bit => current/next char
        putchar(i&2&&       //2nd bit => toggle case
            p>64&~-p%32<26  // if char-to-print is alphabetic
            ?p^32:p),
        i/=4;);             //discard two bits
    _[2]&&g(_+1);           //if next isn't last char, repeat with next char
}

Количество напечатанных символов (на входной символ) не является случайным:

1  if      i<   4 (  4/1024 = 1/256)
2  if   4<=i<  16 ( 12/1024 = 3/256)
3  if  16<=i<  64 ( 48/1024 = 3/ 64)
4  if  64<=i< 256 (192/1024 = 3/ 16)
5  if 256<=i<1024 (768/1024 = 3/  4)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.