ssTTsSTtRrriinInnnnNNNIiinngg


18

Виклик

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

  • Виведіть поточний символ.

  • Слідом за випадковим виведенням із наступного списку випадкове число разів між 1 - 5 (включно):

    • Поточний персонаж
    • Наступний символ рядка
    • Версія комутатора символу, на якому ви зараз перебуваєте
    • Версія комутатора наступного символу рядка.

Випробування

String -> SSSTSStrTrIiinIIngn

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

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

Примітки

  • Застосовувати комутаційну версію символу потрібно лише у тому випадку, якщо символ є частиною алфавіту (AZ та az).
  • Ваша випадкова функція не повинна бути рівномірною, але вона все одно повинна мати шанс повернути будь-який елемент у наведеному списку.
  • Ви можете використовувати будь-який стандартний формат вводу / виводу.
  • Ви можете припустити, що довжина вводу більша або дорівнює двом.
  • Ви можете припустити, що вхід складається лише з символів ASCII.
  • Назва не є тестовим випадком (це ненавмисне, якщо це дійсний тестовий випадок).
  • Перемикач означає перетворити знак на малі, якщо він є великими, а якщо він є малим.

На додаток до "... не потрібно бути рівномірним", я думаю, ви, мабуть, хочете вказати, що, враховуючи деякий вхід, усі кінцеві юридичні результати повинні в принципі бути можливими для генерації (інакше моє неоднорідне випадкове ціле число в [1 , 2,3,4,5] завжди буде 2, і я просто вивести початковий рядок).
Час Браун

@ChasBrown Так, я редагую питання
MilkyWay90,

2
Я вважаю специфікацію заплутаною. Чи можете ви бути більш чіткими? Наприклад, дізнайтеся, як StringвиробляєтьсяSSSTSStrTrIiinIIngn
Луїс Мендо

7
@LuisMendo Я не ОП, але я думаю: [S]SSTSS [t]rT, [r]I, [i]inII, [n]gnде символи між блоками є першими точками кулі (" Вивести поточний символ "), а інші символи 1-5 разів випадковим чином - один із чотирьох варіантів для цього характер. Але я згоден, деякі більш чіткі пояснення були б доречними. Окрім тестового випадку, було не особливо зрозуміло, ми маємо підібрати випадковий вибір 1-5 разів. Замість вибору випадкового вибору повторюємо 1-5 разів (як це робить відповідь Гая).
Kevin Cruijssen

3
@KevinCruijssen Спасибі, ваше пояснення відповідає прикладу, і це зрозуміло. ОП має підтвердити та відредагувати це в тексті
Луїс Мендо

Відповіді:


6

Гая , 25 байт

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

Спробуйте в Інтернеті!

Дякуємо Kevin Cruijssen за те, що він вказав на 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's random.randint(1,z+1), яке повертає ціле число Nтаким, що 1<=N<=z+1.


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

@KevinCruijssen я інтерпретував "вихід зі списку випадковою кількістю разів", щоб означати декодування довжини пробігу, але ти маєш рацію, тестові випадки, схоже, вказують на іншу інтерпретацію; Я думаю, це має бути досить легко виправити
Джузеппе

1
5ṛВи можете 6чомусь спробувати спробувати в Інтернеті ? PS: Чи не існує цілого списку для діапазону чи діапазону для циклу в Gaia?
Kevin Cruijssen

1
@KevinCruijssen dang, Business Cat дійсно потребує виправлення поодиноких помилок ... Я дійсно думав, що існує forконструкція типу, але я впевнений, що це навіть не зафіксовано на сторінці вікі.
Джузеппе

4

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

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

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

Спробуйте в Інтернеті!

2()/ Застосувати наступну функцію мовчання infix між кожною парою символів:

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

,, додайте до цього конкатенацію пари

{}⊇ Виберіть із цього наступні елементи:

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

  4⍴⍨ що четвереньки

  ? випадкові індекси для них

ϵ список (згладити)


3

Perl 6 , 60 байт

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

Спробуйте в Інтернеті!

Нижній / верхній регістр трохи дратує.


Я не знаю Перла, тому я, мабуть, тут кажу щось дурне. Але чи можна якось сформулювати $/та $0разом і використати .lcцей рядок, а потім створити копію цього рядка та використати .ucта сформулювати ці два разом? Не впевнений , якщо це взагалі можливо, або коротше , ніж струм $/.lc,$/.uc,$0.lc,$0.uc, але це означало б , ви б використовувати $/, $0, .lcі .ucодин раз.
Кевін Кройсейсен

1
На жаль, (.lc~.uc for $0~$/).combдовше. Perl 6 дійсно хоче розрізнити рядки та списки, так що "abc"[0] eq "abc"(він видає себе одним списком).
Дост

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

@PhilH Ні, це не працює. Ці рішення з великої літери використовують кожну букву в кожній
Джо Кінг


3

Баш , 121 байт

-20 байт завдяки Нахуелю

-9 байт завдяки робологу

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можуть бути замінені недокументованими {і}
Nahuel Fouilleul


1
@roblogic це розумно. тивм.
Іона

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


2

05AB1E , 18 17 байт

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

Натхненний @Giuseppe Gaia відповідь «s .
-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.š«Ω?
Magic Octopus Urn

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

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/.$//

ТІО


Ви можете зберегти 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більше
rtpax


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 Мені потрібно ввійти в звичку плескати весь час, але не знав, що ти можеш так змінити членів wildcard.
Веська

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)

Безголовки:

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викликає помилку компіляції. +:це метод, визначений у списку, щоб він міг заощадити місце, позбувшись зовнішніх паронів?
Сорен

У вас тут лише один елем, так що це все одно не автозав'язування
Вен


0

C # (Visual C # Interactive Compiler) , 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], додатковий простір у оголошенні din-loop
Втілення

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)

На жаль, спробуйте його в Інтернеті, на жаль, онлайн-версія завжди показує однаковий результат для одного і того ж варшара, на відміну від MS SQL Server Management Studio



0

Japt -P , 43 16 байт

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

Скорочено зараз багато!

Спробуй це


Це, здається, щоразу повертає один і той же результат.
Кошлатий

@Shaggy виправить. Також äв описі йдеться про те, що він містить три аргументи, останній з них є 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.