สนุกกับสตริงและตัวเลข


13

นี่คือปริศนาการเขียนโปรแกรมสำหรับคุณ:

รับรายการคู่ของสายอักขระและหมายเลขที่เกี่ยวข้องตัวอย่างเช่น[[A,37],[B,27],[C,21],[D,11],[E,10],[F,9],[G,3],[H,2]]เอาท์พุทรายการอื่นซึ่งจะมีเพียงสตริงในลักษณะดังต่อไปนี้:

  1. จำนวนรวมของสตริงใด ๆ ควรเท่ากับจำนวนที่สอดคล้องกันในข้อมูลอินพุต

  2. ไม่ควรมีสตริงซ้ำติดกันในลำดับและทุกสตริงควรปรากฏในรายการผลลัพธ์

  3. การเลือกสตริงถัดไปควรทำแบบสุ่มตราบเท่าที่พวกเขาไม่ได้อยู่เหนือกฎสองข้อ แต่ละโซลูชันควรมีความน่าจะเป็นที่ไม่เป็นศูนย์ของการเลือก

  4. 0ถ้ารวมกันไม่มีความเป็นไปได้การส่งออกควรเป็นเพียง

รายการอินพุตอาจได้รับในลำดับใด ๆ (เรียงลำดับหรือไม่เรียง) และสตริงในรายการอาจมีความยาวเท่าใดก็ได้


เอาต์พุตตัวอย่างสำหรับอินพุตตัวอย่างด้านบน 1

[A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,G,H,G,H,G]


อินพุตตัวอย่าง 2:

[[A,6],[B,1],[C,1]]

เอาต์พุตสำหรับอินพุตที่สอง:

0

เนื่องจากไม่มีรายการที่เป็นไปได้ตามกฎ


ตัวอย่างอินพุต 3:

[[AC,3],[BD,2]]

ผลลัพธ์ที่ถูกต้อง: [AC,BD,AC,BD,AC]

ผลลัพธ์ที่ไม่ถูกต้อง: [AC,BD,AC,AC,BD]


หากต้องการคำชี้แจงเพิ่มเติมโปรดอย่าลังเลที่จะบอกฉันในความคิดเห็นและฉันจะทำตามทันที

นี่คือดังนั้นรหัสที่สั้นที่สุดเป็นไบต์สำหรับแต่ละภาษาที่ชนะ!


ท้าทายมาก! ฉันคิดว่ามันไม่ได้มาตรฐานตามมาตรฐานของเรา ฉันขอแนะนำให้ใช้The Sandboxเพื่อรับข้อเสนอแนะมากมายก่อนโพสต์คำถามเพื่อให้คุณไม่ได้รับการโหวตหรือปิดโหวต! :-) ฉันรอคอยที่จะเห็นความท้าทายที่ดีมากขึ้นจากคุณ!
Giuseppe

@iuseppe ขอบคุณฉันจะลองผ่านมัน แจ้งให้เราทราบหากฉันต้องการเพิ่มรายละเอียดใด ๆ หากฉันพลาดในรายการนี้
Stupid_Intern

1
เราสามารถรับอินพุต 2 รายการเพียงแค่สตริงและตัวเลขเท่านั้นหรือไม่
FrownyFrog

อาจมีความกำกวมในการใช้วลี 'สุ่ม' หลายวิธีแก้ปัญหาเหล่านี้ใช้ห้องสมุด "สุ่ม" ซึ่งอันที่จริงแล้วเป็นเพียงการลอกเลียนแบบ
ดอนสดใส

คำตอบ:


6

เยลลี่ 11 ไบต์

Œṙ'Œ!⁻ƝẠ$ƇX

ลองออนไลน์!

Œṙ'Œ!⁻ƝẠ$ƇX Arguments: z
  '         Flat: Apply link directly to x, ignoring its left and right depth properties
Œṙ            Run-length decode
   Œ!       Permutations of x
         Ƈ  Filter; keep elements of x for which the link returns a truthy result
        $     ≥2-link monadic chain
      Ɲ         Apply link on overlapping pairs (non-wrapping)
     ⁻            x != y
       Ạ        Check if all elements of x have a truthy value (+vacuous truth)
          X Pick a random element of x; return 0 if the list is empty.

หากŒṙไม่ได้ทำให้เป็นแบบเวกเตอร์มันจะใช้งานไม่ได้'
dylnan

5

เยลลี่ขนาด 17 ไบต์

Wẋ¥Ɲ€ẎẎŒ!Œɠ’SƊÐḟX

ลองออนไลน์!


เมื่อฉันลอง["A", 100], ["B", 3]มันไม่แสดงผลอะไรมันติดอยู่ฉันคิดว่า
Stupid_Intern

1
@newguy การสร้างพีชคณิตทั้งหมด 103 รายการไม่มีชื่อเสียงในด้านความเร็ว สำหรับการอ้างอิงผลที่ได้หลังจากนั้นŒ!จะมีองค์ประกอบ
Erik the Outgolfer

@newguy วิธีนี้มีO(n!)แต่สั้นและความเร็วไม่สำคัญ อย่าลองกับสิ่งที่ตัวเลขรวมกันเกินกว่าประมาณ 6-8: P
HyperNeutrino

สามารถŒṙช่วย?
Arnauld

1
@dylnan ผมไม่คิดว่ามันคือการทำงานสำหรับสตริงฉันพยายามด้วย["AT", 3], ["B", 3]และได้TBATATBABเป็นผลผลิตซึ่งเป็นสิ่งที่ผิด
Stupid_Intern

5

Python 2 , 114 189 185 174 ไบต์

from random import*
a=input()
s=u=[]
while a:x,y=a.pop(a.index(next((w for w in a if w[1]>sum(v[1]for v in a+u)/2),choice(a))));s=s+[x];a+=u;u=[[x,y-1]]*(y>1)
print[s,0][y>1]

ลองออนไลน์!

อุ๊ย! ยากมากขึ้นกับกฎ 3 ... :) ยังคงพยายามหลีกเลี่ยงO(n!)วิธีการดังกล่าวดังนั้นจึงสามารถจัดการกรณีทดสอบทั้งหมดได้ในช่วงก่อนที่ความร้อนจากเอกภพจะตาย ...

อัลกอริทึม: tสมมติว่าผลรวมของการนับสตริง หากสตริงใดมีการนับnด้วย2*n>t+1จะไม่สามารถตอบสนองข้อ จำกัด ได้ ดังนั้นถ้าสตริงใด ๆ (ไม่รวมเลือกหนึ่งก่อนหน้านี้) มีการนับnด้วย2*n=t+1แล้วเราจะต้องเลือกสตริงที่ต่อไป มิฉะนั้นเราสามารถเลือกสุ่มสตริงใด ๆ ที่ไม่ใช่สตริงที่เลือกไว้ก่อนหน้านี้


1
@Arnauld: พลาดโดยสิ้นเชิง! แก้ไขแล้ว
Chas Brown

4

R , 148 141 ไบต์

function(x,y,p=combinatXXpermn(rep(seq(y),y)),q=which(sapply(lapply(p,diff),all)))"if"(n<-sum(q|1),"if"(n-1,x[p[[sample(q,1)]]],x[p[[q]]]),0)

ลองออนไลน์! (ฉันคัดลอกcombinat::permnแล้วเรียกว่าcombinatXXpermnมี)

กำลังแก้ปัญหา O (n!) เดียรัจฉาน

ใช้permnจากcombinatแพ็คเกจเพื่อสร้างการสั่งซื้อที่เป็นไปได้ทั้งหมด จากนั้นตรวจสอบเพื่อดูว่ามีผู้ใดปฏิบัติตามกฎและเลือกหนึ่งในนั้นโดยการสุ่ม


n<-sum(n|1)ฉันเชื่อว่า byte สั้นกว่า แต่การเล่นโวหารของsampleอินพุตที่มีความยาวหนึ่งค่อนข้างน่าหงุดหงิดที่นี่
Giuseppe

golfed มันลงเล็กน้อยลองที่นี่ - ฉันต้องลบ combinatXXpermn จากส่วนหัวเพื่อรับลิงค์เล็กพอ ...
Giuseppe

ฉันมีสิ่งที่คล้ายกันมากในการป้อนข้อมูลเป็น dataframe ปัญหาของ bruteforce ก็คือมันจะไม่จัดการกับอินพุตที่ใหญ่เกินไป ...
JayCe

@JayCe เป็นอัลกอริทึมบังคับที่ไม่ดุร้ายที่สุดเท่าที่จะเป็นไปได้จากกฎข้อที่ 3 ของการท้าทายนี้?
ngm

ฉันเห็นด้วยมันอาจจะไม่ คงจะน่าสนใจกว่านี้หากไม่มีกฎ 3
JayCe

3

JavaScript, 112 ไบต์

ผ่านครั้งแรกที่นี้มากขึ้นในการเล่นกอล์ฟ (หวังว่า) ติดตาม

f=([i,...a],o=[])=>a.sort((x,y)=>(y[1]-x[1])*Math.random()-n*.5,n=--i[1],o.push(i[0]))+a?f(n?[...a,i]:a,o):n?0:o

ลองออนไลน์


1
ขอบคุณ @Arnauld ฉันจะพลาดมัน ควรตรวจสอบสเป็คซ้ำสองครั้งแทนที่จะทำตามคำแนะนำของ Chas ดำเนินการแก้ไขอย่างรวดเร็วจะต้องกลับมาในภายหลังเพื่อดูว่าฉันสามารถเล่นกอล์ฟได้ดีขึ้นหรือไม่
Shaggy

ใช่กฎข้อที่ 3 ก็โอเคสำหรับ esolangs ที่สามารถเดรัจฉานบังคับให้แก้ปัญหาทั้งหมดได้อย่างง่ายดาย แต่มันทำให้ยากที่จะใช้อัลกอริทึมที่สั้นกว่าในภาษาอื่น ... BTW: ตอนนี้ดูเหมือนว่าจะกลับ0รายการที่ถูกต้องเป็นครั้งคราว
Arnauld

ใช้การแก้ไขด่วนอื่นอีกครั้ง @Arnauld - หากยังไม่ได้จัดเรียงฉันจะต้องลบอีกครั้งจนกว่าฉันจะมีเวลามากขึ้นในการตรวจสอบ หมายเหตุ: ฉันใช้ข้อมูลจำเพาะที่คำว่าสตริงถัดไปจำเป็นต้องเลือกแบบสุ่มหมายความว่าการเลือกแรกไม่จำเป็นต้องสุ่ม
Shaggy

1
@Shaggy - ฉันเห็นด้วยคุณไม่ควรทำตามสิ่งที่ฉันทำ :)
Chas Brown

3

J, 60 53 ไบต์

-7 ขอบคุณ FrownyFrog

(?@#{])@(#~*/@(2~:/\])"1)@(]i.@!@#@;A.;) ::0(#~>)/&.>

เป็นต้นฉบับ

(?@#{])@(#~2&([:*/~:/\)"1)@(A.~i.@!@#)@;@:(([#~>@])/&.>) ::0

ungolfed

(?@# { ])@(#~ 2&([: */ ~:/\)"1)@(A.~ i.@!@#)@;@:(([ #~ >@])/&.>) ::0

ข้อเสนอแนะสำหรับการปรับปรุงการต้อนรับ

ลองออนไลน์!


เล่นกอล์ฟถึง53
FrownyFrog

Awesome tyvm @FrownyFrog ฉันจะอัปเดตโพสต์ในภายหลัง
Jonah

โอ๊ะ[:*/2~:/\|:สองสั้น
FrownyFrog


2

ถ่านขนาด 38 ไบต์

WΦθ§κ¹«≔‽Φ∨Φι›⊗§κ¹ΣEι§μ¹ι¬⁼κυυ§υ⁰⊞υ⊖⊟υ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

WΦθ§κ¹«

ทำซ้ำในขณะที่มีการนับที่ไม่เป็นศูนย์อย่างน้อยหนึ่งรายการ

Φι›⊗§κ¹ΣEι§μ¹

ค้นหาจำนวนใด ๆ ที่ทำขึ้นมากกว่าครึ่งหนึ่งที่เหลือ

∨...ι

หากไม่มีให้เลือกตัวกรองที่ไม่ใช่ค่าศูนย์ก่อนหน้านี้

Φ...¬⁼κυ

กรองสตริงที่ถูกเอาต์พุตครั้งล่าสุด

≔‽∨...υ

กำหนดองค์ประกอบแบบสุ่มจากรายการแรกที่ไม่ว่างเปล่าของสองรายการข้างต้นไปยังสตริงเอาต์พุตสุดท้าย โปรดทราบว่าหากมีการป้อนค่าที่เป็นไปไม่ได้โปรแกรมจะหยุดทำงาน ณ จุดนี้

§υ⁰

พิมพ์สตริง

⊞υ⊖⊟υ

ลดจำนวนลง


สิ่งนี้สร้างผลลัพธ์ที่ไม่ถูกต้องเช่นในตัวอย่างของคุณที่["h4x0r", 1337]รวมเป็นสตริง
ngm

@ngm ฉันได้ทำการจัดเรียงรหัสใหม่และตอนนี้มันล้มเหลวถ้าคุณทำเช่นนั้น ... การตรวจสอบความถูกต้องเหมาะสมจะมีค่าใช้จ่ายเพิ่มขึ้น
Neil

2

Ruby , 85 ไบต์

วิธีการที่ดุร้าย (ขอบคุณโจนาห์สำหรับความคิด

->l{l.flat_map{|a,b|[a]*b}.permutation.select{|p|r=0;p.all?{|a|a!=r&&r=a}}.sample||0}

ลองออนไลน์!

Ruby , 108 100 96 ไบต์

ก่อนหน้านี้แนวทางของ Bogosort

->l{w=[];l.map{|a,b|w+=[a]*b;b}.max*2>w.size+1?0:(w.shuffle!until(r='';w.all?{|a|a!=r&&r=a});w)}

ลองออนไลน์!


นี่คือหนึ่งเดียวสำหรับ 93: ลองออนไลน์!
Jonah

2

สนิม 633 ไบต์

สิ่งที่ทำให้สิ่งนี้แตกต่างจากคนอื่นเล็กน้อยคือมันเริ่มต้นด้วยความคิดที่จะจัดเรียงสตริงใหม่โดยจำลองระบบทางกายภาพ แต่ละสตริงจะทำซ้ำจำนวนครั้งแรกที่เหมาะสม จากนั้นแต่ละสตริงจะถือว่าเป็นอนุภาคในช่องว่าง อนุภาคสองอันที่มีค่าสตริงเหมือนกันจะ "ผลัก" กันในขณะที่อีกสองอนุภาคที่มีค่าต่างกันจะดึงดูดกันและกัน ตัวอย่างเช่นถ้าเราเริ่มต้นด้วย AAAAAAABBBBCC, ในฐานะที่จะยกเลิกซึ่งกันและกัน, ย้ายออกจากกัน, อนุญาตให้ Bs ย้ายในระหว่างพวกเขา เมื่อเวลาผ่านไปถึงการผสมผสานที่ดีของอนุภาค หลังจากการวนซ้ำของ 'การเคลื่อนที่ของอนุภาค' แต่ละครั้งโปรแกรมจะตรวจสอบว่าไม่มีอนุภาคใด ๆ ติดกันจากนั้นหยุดและพิมพ์สถานะของระบบ

ตอนนี้เมื่อพูดถึงการนำระบบกายภาพมาใช้จริงมันเริ่มต้นจากการใช้เทคนิคการสาธิต / เกมเก่า fashiond PC เพื่อเก็บตำแหน่งและความเร็วของอนุภาคแต่ละตัวเป็นตัวเลขจากนั้นจึงทำการวนซ้ำเพื่ออัปเดตตำแหน่งและความเร็ว ในการวนซ้ำแต่ละครั้งเรากำลังเพิ่มความเร็วไปยังตำแหน่ง (การเคลื่อนไหว) และเพิ่มการเร่งความเร็วให้กับความเร็ว (การเปลี่ยนแปลงอัตราการเคลื่อนไหว) และการคำนวณการเร่งความเร็ว (การค้นหาแรงบนอนุภาค) เพื่อให้ง่ายขึ้นระบบจะไม่คำนวณแรงของแต่ละอนุภาคตามอนุภาคอื่น ๆ ทั้งหมด แต่จะตรวจสอบอนุภาคที่อยู่ติดกันทันที นอกจากนี้ยังมีผล 'การทำให้หมาด ๆ ' เพื่อให้อนุภาคจะไม่เร่งความเร็วมากเกินไปและบินไปที่อินฟินิตี้ (เช่นความเร็วลดลงร้อยละ x ในแต่ละขั้นตอนเป็นต้น)

อย่างไรก็ตามตลอดกระบวนการเล่นกอล์ฟสิ่งทั้งหมดนี้ถูกลดทอนลงและทำให้ง่ายขึ้นอย่างมาก ทีนี้แทนที่จะเป็นสองอนุภาคที่เหมือนกันที่จะต้านทานพวกมันก็แค่ 'เทเลพอร์ต' อนุภาคที่แตกต่างกันเพียงแค่ 'วิ่งหนี' เล็กน้อยเพื่อป้องกันความเมื่อยล้าในระบบ ตัวอย่างเช่นถ้า A อยู่ถัดจาก A มันจะทำการส่งผ่านทางไกล ถ้า A อยู่ถัดจาก B มันจะเปลี่ยนไปเพียงเล็กน้อยเท่านั้น จากนั้นจะตรวจสอบว่าตรงตามเงื่อนไขหรือไม่ (ไม่เหมือนอนุภาคที่อยู่ติดกัน) และพิมพ์สตริงตามลำดับโดยขึ้นอยู่กับตำแหน่งในพื้นที่ 1-d มันเกือบจะเหมือนอัลกอริธึมการเรียงลำดับมากกว่าการจำลอง - จากนั้นอีกครั้งเราสามารถเห็นการเรียงลำดับอัลกอริธึมเป็นรูปแบบของการจำลอง 'การดริฟท์' ตาม 'มวล' ฉันเชือนแช

อย่างไรก็ตามนี่เป็นหนึ่งในโปรแกรม Rust แรกของฉันดังนั้นฉันจึงยอมแพ้หลังจากเล่นกอล์ฟหลายชั่วโมงแม้ว่าอาจมีโอกาสยังคงอยู่ บิตการแยกวิเคราะห์ยากสำหรับฉัน มันอ่านสตริงอินพุตจากอินพุตมาตรฐาน หากต้องการก็สามารถแทนที่ด้วย "let mut s =" [[A, 3], [B, 2]] "แต่ตอนนี้ฉันทำ 'echo [[A, 3], [B, 2]] | Cargo Run 'บนบรรทัดคำสั่ง

การคำนวณการหยุดเป็นปัญหาเล็กน้อย จะตรวจสอบได้อย่างไรว่าสถานะที่ถูกต้องของระบบจะไม่ถึง แผนแรกคือการตรวจสอบว่าสถานะ 'ปัจจุบัน' เคยทำซ้ำสถานะเก่าเช่นถ้า ACCC เปลี่ยนเป็น CACC แต่กลับไปที่ ACCC เรารู้ว่าโปรแกรมจะไม่ยุติเนื่องจากเป็นเพียงการสุ่มหลอก มันควรจะยอมแพ้และพิมพ์ 0 ถ้ามันเกิดขึ้น อย่างไรก็ตามนี่ดูเหมือนว่าจะเป็นรหัสสนิมจำนวนมากดังนั้นฉันแค่ตัดสินใจว่าถ้ามันผ่านการทำซ้ำจำนวนมากมันอาจติดอยู่และจะไม่ถึงสถานะคงที่ดังนั้นมันจึงพิมพ์ 0 และหยุด เท่าไหร่? จำนวนของอนุภาคกำลังสอง

รหัส:

extern crate regex;
struct P {s:String,x:i32,v:i32}
fn main() {
    let (mut i,mut j,mut p,mut s)=(0,0,Vec::new(),String::new());
    std::io::stdin().read_line(&mut s);
    for c in regex::Regex::new(r"([A-Z]+),(\d+)").unwrap().captures_iter(&s) {
        for _j in 0..c[2].parse().unwrap() {p.push(P{s:c[1].to_string(),x:i,v:0});i+=1;}
    }
    let l=p.len(); while i>1 {
        j+=1;i=1;p.sort_by_key(|k| k.x);
        for m in 0..l {
            let n=(m+1)%l;
            if p[m].s==p[n].s {p[m].v=p[m].x;if n!=0 {i=2}} else {p[m].v=1}
            p[m].x=(p[m].x+p[m].v)%l as i32;
        }
        if j>l*l{p.truncate(1);p[0].s="0".to_string();i=1}
    }
    for k in &p{print!("{}",k.s)};println!();
}

l2regex

มันผ่านตัวอย่างที่ฉันเลี้ยงแม้ว่าฉันจะไม่ได้ฝอยก็ตาม ฉันได้ทำการแก้ไขเพื่อให้ทำงานใน TIO คุณต้องแก้ไข 'let s = [("A", 3), ("B", 2), ("ZZ", 4)];' บรรทัดbit.ly/2LubonO
ดอนสดใส


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.