ssTTsSTtRrriinInnnnNNNIiinngg


18

ท้าทาย

สำหรับอักขระแต่ละตัวของสตริงยกเว้นตัวสุดท้ายให้ทำดังนี้

  • เอาท์พุทตัวละครปัจจุบัน

  • ตามด้วยการสุ่มเอาท์พุทจากรายการต่อไปนี้เป็นจำนวนสุ่มครั้งระหว่าง 1 - 5 (รวม):

    • ตัวละครปัจจุบัน
    • อักขระตัวถัดไปของสตริง
    • เวอร์ชัน switchcase ของตัวละครที่คุณเปิดอยู่
    • รุ่น switchcase ของตัวละครต่อไปของสตริง

กรณีทดสอบ

String -> SSSTSStrTrIiinIIngn

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

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

หมายเหตุ

  • คุณจะต้องใช้เวอร์ชัน switchcase ของตัวละครหากตัวละครเป็นส่วนหนึ่งของตัวอักษร (AZ และ az)
  • ฟังก์ชั่นการสุ่มของคุณไม่จำเป็นต้องเหมือนกัน แต่ก็ยังต้องมีโอกาสกลับองค์ประกอบใด ๆ ในรายการที่กำหนด
  • คุณได้รับอนุญาตให้ใช้รูปแบบ I / O มาตรฐานใด ๆ
  • คุณอาจคิดว่าความยาวของอินพุตนั้นมากกว่าหรือเท่ากับสอง
  • คุณอาจสันนิษฐานว่าการป้อนข้อมูลประกอบด้วยอักขระ ASCII เท่านั้น
  • ชื่อไม่ใช่กรณีทดสอบ (โดยไม่ได้ตั้งใจหากเป็นกรณีทดสอบที่ถูกต้อง)
  • Switchcase หมายถึงเปลี่ยนถ่านให้เป็นตัวพิมพ์เล็กหากเป็นตัวพิมพ์ใหญ่และเปลี่ยนเป็นถ่านเป็นตัวพิมพ์ใหญ่หากเป็นตัวพิมพ์เล็ก

นอกเหนือจาก '... ไม่จำเป็นต้องเหมือนกัน' ฉันคิดว่าคุณอาจต้องการระบุว่าได้รับข้อมูลบางอย่างผลลัพธ์ทางกฎหมายที่ จำกัด ทั้งหมดในหลักการควรเป็นไปได้ในการสร้าง (มิฉะนั้นจำนวนเต็มแบบสุ่มของฉันที่ไม่สม่ำเสมอใน [1] , 2,3,4,5] จะเป็น 2 เสมอและฉันจะเอาท์พุทสตริงเดิม)
Chas Brown

@ChasBrown ใช่ฉันจะแก้ไขคำถาม
MilkyWay90

2
ฉันพบว่าข้อมูลจำเพาะสับสน คุณชัดเจนกว่านี้ได้ไหม ตัวอย่างเช่นหาวิธีStringผลิตSSSTSStrTrIiinIIngn
Luis Mendo

7
@ LuisMendo ฉันไม่ได้ OP แต่ฉันคิดว่า: [S]SSTSS [t]rT, [r]I, [i]inII, [n]gnที่ตัวละครระหว่างบล็อกเป็นสัญลักษณ์แสดงหัวข้อย่อยแรก (" เอาท์พุทตัวละครปัจจุบัน ") และตัวละครอื่น ๆ เป็น 1-5 เท่าสุ่มหนึ่งในสี่ตัวเลือกสำหรับที่ ตัวละคร แต่ฉันเห็นด้วยว่าคำอธิบายที่ชัดเจนกว่านี้ก็น่าจะเหมาะสมแล้ว นอกเหนือจากกรณีทดสอบมันไม่ชัดเจนโดยเฉพาะเราต้องเลือกตัวเลือกแบบสุ่ม 1-5 ครั้ง แทนที่จะเลือกตัวเลือกสุ่มซ้ำ 1-5 ครั้ง (เช่นเดียวกับคำตอบของ Gaia ในปัจจุบัน)
Kevin Cruijssen

3
@KevinCruijssen ขอบคุณคำอธิบายของคุณตรงกับตัวอย่างและชัดเจน OP ควรยืนยันและแก้ไขข้อความนั้น
Luis Mendo

คำตอบ:


6

Gaiaขนาด 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เป็นหลามrandom.randint(1,z+1)ซึ่งกลับจำนวนเต็มดังกล่าวว่าN1<=N<=z+1


คุณแน่ใจหรือไม่ว่าการเข้ารหัสความยาวรันถูกต้องที่นี่? หากฉันเข้าใจความท้าทายที่ถูกต้องควรเลือกตัวเลือกทั้งสี่แบบสุ่ม 1-5 ครั้งแทนที่จะเลือกหนึ่งในสี่แบบสุ่มแบบสุ่มทำซ้ำ 1-5 ครั้ง ผลลัพธ์ตัวอย่างแรกSSSTSStrTrIiinIIngn( [SSSTSS, trT, rI, iinII, ngn]) ดูเหมือนจะสะท้อนถึงสิ่งนี้และในขณะนี้ไม่ใช่ผลลัพธ์ที่เป็นไปได้ในโปรแกรมของคุณ (ฉันคิดว่า)
Kevin Cruijssen

@KevinCruijssen ฉันตีความ "เอาท์พุทจากรายการจำนวนครั้งที่สุ่ม" เพื่อหมายถึงการถอดรหัสรันไทม์ แต่คุณพูดถูกกรณีทดสอบดูเหมือนจะบ่งบอกถึงการตีความอื่น ๆ ฉันคิดว่ามันควรจะง่ายต่อการแก้ไข
Giuseppe

1
5ṛจะส่งผล6ให้ลองด้วยเหตุผลออนไลน์ได้ไหม? PS: ไม่มีจำนวนเต็มเพื่อเรียงรายการหรือเรียงลำดับแบบวนซ้ำใน Gaia หรือไม่
Kevin Cruijssen

1
@KevinCruijssen แดง, Business Cat ต้องการแก้ไขข้อผิดพลาดแบบ off-by-one ... ฉันคิดว่ามันมีโครงสร้างforแบบ แต่ฉันค่อนข้างมั่นใจว่ามันไม่ได้ถูกบันทึกไว้ในหน้า wiki
จูเซปเป้

4

APL (dzaima / APL) ขนาด 23 ไบต์

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ

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

ลองออนไลน์!

2()/ ใช้ฟังก์ชั่น infix tacit ต่อไปนี้ระหว่างตัวละครแต่ละคู่:

- switchcase
 ของ
, การต่อข้อมูลของทั้งคู่

,, ผนวกการเชื่อมโยงของทั้งคู่เข้าด้วยกัน

{}⊇ เลือกองค์ประกอบต่อไปนี้จาก:

  ?5 ตัวเลขสุ่มในช่วง 1 … 5

  4⍴⍨ ที่สี่หลาย

  ? ดัชนีสุ่มสำหรับสิ่งเหล่านั้น

ϵ รายการ (แผ่)


3

Perl 6 , 60 bytes

{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แต่ละครั้ง
Kevin Cruijssen

1
อนิจจา(.lc~.uc for $0~$/).combยาวกว่า Perl 6 ต้องการแยกแยะสตริงและรายการดังนั้นจริงๆ"abc"[0] eq "abc"(มันแกล้งทำเป็นรายการเดียว)
Ven

คุณสามารถทำได้โดยลื่นไถลและฟังก์ชั่นที่ไม่ระบุชื่อนำไปใช้กับรายการ: {.lc,|.uc}($/,|$0)สำหรับ -5 ไบต์และเพียงแค่ใช้รายการของการแข่งขัน{.lc,|.uc}(@$/)สำหรับ -8 ไบต์ tio.run/…
Phil H

@PhilH ไม่ทำงาน การแก้ปัญหาเหล่านั้นใช้อักษรตัว
โจคิง


3

Bash , 121 ไบต์

-20 ไบต์ขอบคุณ Nahuel

-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 จากนั้น 1 และ 5


ดูเหมือนว่ามันจะหายไปprintf %s "$c"
Nahuel Fouilleul

1
doและdoneสามารถถูกแทนที่ด้วยเอกสารที่ไม่มี{และ}
Nahuel Fouilleul


1
@roblogic นั่นฉลาด tyvm
โยนาห์

1
โซลูชันขนาด 121 ไบต์ค่อนข้างบอบบาง / บั๊กนี่เป็นรุ่นที่แข็งแกร่งกว่า (133- ไบต์) ที่ควรรองรับASCII ที่พิมพ์ได้ทั้งหมดtio.run
roblogic


2

05AB1E , 18 17 ไบต์

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

แรงบันดาลใจจาก@Giuseppe '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

@Shaggy ใช่ฉันทำได้แน่นอน .. ขอบคุณ! บางทีฉันควรจะหยุดเล่นกอล์ฟเพื่อวันนี้ฉันเป็นระเบียบฮ่า ๆ ..
Kevin Cruijssen

คุณเป็นระเบียบหรือไม่? ¨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/.$//

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อีกต่อไป
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 dog ฉันจำเป็นต้องมีนิสัยที่จะกระเด็นตลอดเวลา แต่ไม่รู้ว่าคุณจะสามารถแลกสมาชิกไวด์การ์ดแบบนั้นได้
Veskah

1
ฉันเสียใจ87 bytes
mazzy

0

สกาล่า 2.12.8, 214 ไบต์

รุ่น Golfed:

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

@Ven a::b::Nilทำให้เกิดข้อผิดพลาดในการคอมไพล์ +:เป็นวิธีการที่กำหนดไว้ในรายการดังนั้นจึงอาจประหยัดพื้นที่โดยการกำจัด parens ภายนอกหรือไม่
Soren

คุณมีเพียงหนึ่ง elem ที่นี่เท่านั้นดังนั้นจึงไม่สามารถเริ่มระบบอัตโนมัติอีกครั้ง
Ven


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]พื้นที่พิเศษในการประกาศdใน for-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)

ลองใช้งานออนไลน์โชคไม่ดีที่เวอร์ชันออนไลน์แสดงผลลัพธ์เดียวกันสำหรับ varchar เดียวกันเสมอซึ่งแตกต่างจาก MS SQL Server Management Studio



0

Japté -P , 43 16 ไบต์

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

สั้นลงมากตอนนี้!

ลองมัน


ดูเหมือนว่าจะส่งคืนผลลัพธ์เดียวกันทุกครั้ง
Shaggy

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

0

Zsh, 113 107 ไบต์

มีจำนวนมากของความช่วยเหลือจากและman zshexpn ลองออนไลน์!man zshparam

  • -6โดยฉัน tweaking
for ((;i<#1;i++)){m=${1:$i:2};m=$m:l$m:u
for ((;t<RANDOM%5;t++))x+=${m[RANDOM%4]}
echo ${1[i]}$x\\c;t=;x=;}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.