Rosencrantz และ Guildenstern เป็นรหัส


10

ในการเล่น absurdist Rosencrantz และ Guildenstern นั้นตายไปแล้วตัวละครหลักทั้งสองRosencrantzและGuildenstern (หรือพวกเขา?) มักจะผสมกันอยู่เสมอว่าใครคือใคร - หรือบางส่วนของร่างกายของตัวเอง - เพราะขาดการรับรู้ ตัวตนของแต่ละบุคคล มันจะไม่ไร้สาระหรือไม่ถ้าพวกเขาสับรอบชื่อของพวกเขา?

งานของคุณมันจะเขียนฟังก์ชั่นซึ่งจะใช้เวลาในสตริงของที่แม้ความยาว (และโดยการออกแบบหลาย 4) ที่มากกว่า 7 ตัวอักษรแยกมันและสับ

การแยกจะต้องเป็นดังนี้ : สตริงจะเป็นรูปแบบที่"abscd"มีการทำหน้าที่เป็นตัวคั่น ส่วนแรกและตัวคั่นabsจะเป็นครึ่งแรกของสตริงในขณะที่ครึ่งหลังจะเป็นcd

ความยาวของaจะ(string length / 4) - 1

ความยาวของbจะ(string length / 4)

ความยาวของsจะ1

ความยาวของcจะ(string length / 4) + 1

ความยาวของdจะ(string length / 4) - 1

นี่อาจทำให้สับสนได้ดังนั้นให้ฉันแสดงตัวอย่างให้คุณดู

("a" + "bb" + "s" + "ccc" + "d").length //8
  1     2      1      3      1
|-------4--------|  |----4-----| <--- (4 is half of 8)

("rosen" + "crantz" + "&" + "guilden" + "stern").length  //24
    5         6        1        7          5

("foo" + "barr" + "?" + "barry" + "foo").length
   3       4       1      5         3

สุดท้าย:

จากนั้นคุณสับเปลี่ยนส่วนต่างๆโดยรอบ adscb

อดีต "rosencrantz&guildenstern" --> "rosenstern&guildencrantz"

"foobarr?barryfoo" --> "foofoo?barrybarr"

Rulez:

  1. ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  2. คำตอบที่ยอมรับได้: ฟังก์ชันที่รับอินพุตผ่านหนึ่งสตริงอินพุตและส่งคืนสตริงเอาต์พุตหนึ่งสตริง
  3. หากสายป้อนไม่ตรงกับความต้องการที่ให้ไว้ข้างต้นรหัสของคุณต้องข้อผิดพลาดออก (ไม่สำคัญว่าสิ่งที่ชนิดของExceptionหรือ Error)
  4. นี่คือcode-golfดังนั้นคำตอบที่สั้นที่สุด (ถูกต้อง) (ในแต่ละภาษา) ชนะ!
  5. คะแนนโบนัสสำหรับหนึ่งซับ :-) (ไม่ใช่จริง ๆ แค่คะแนนเจ๋ง ๆ )

6
เกี่ยวกับอันธพาลของคุณกฎ: โดยทั่วไปมันเป็นกำลังใจให้ฟังก์ชั่น ""เพราะพวกเขายากที่จะกำหนดโดยทั่วไป นอกจากนี้การหลีกเลี่ยงการจัดการอินพุตที่ไม่ถูกต้องส่วนใหญ่ก็มักจะเดือดลงไปที่รหัสจานหม้อไอน้ำที่น่ารำคาญ
Jonathan Frech

@ JonathanFrech ฉันคิดว่าความท้าทายของการตรวจสอบอินพุตเป็นปัญหาที่น่าสนใจเนื่องจากสามารถจัดการได้หลายวิธีตั้งแต่การสำรวจเส้นทางไปจนถึงการแยกทางตรรกะการทดสอบ RegEx ดังนั้นการเพิ่มประสิทธิภาพของสิ่งเหล่านี้สามารถเพิ่มความท้าทายพิเศษได้¯_ (ツ) _ / ¯ฉันจะลองดูอีกครั้งสำหรับการแข่งขันกอล์ฟที่ท้าทายรหัส :-)
Michael

2
tfw ทุกคนพยายามหาวิธีที่มีความยืดหยุ่นมากขึ้นในการสร้างรหัสใน lang lang กอล์ฟที่พวกเขาชื่นชอบ และมันเกิดขึ้นกับคำถามเกือบทั้งหมด
Windmill Cookies


1
@NathanMerrill เป็นที่กล่าวถึงในสเป็คที่อินพุตต้องมีความยาวมากกว่า 7 ตัวอักษรและความยาวของมันจะต้องหารด้วย 4, Jo King ได้แนะนำรายการทดสอบความยาว 4 เช่น "abcd" ซึ่งควรผิดพลาด
Thaufeki

คำตอบ:


11

K (oK) , 35 34 33 ไบต์

{$[8>#x;.;<x!4!-&4#-1 0 2+-4!#x]}

ลองออนไลน์!

ไม่มีการตรวจสอบอินพุต (สำหรับค่าหัวของ ngn), 25 24 23 ไบต์

{<x!4!-&4#-1 0 2+-4!#x}

ลองออนไลน์!

เรียนรู้อย่างรวดเร็วเล็กน้อยจาก K และเมื่อดูรายการคำกริยาฉันคิดว่าวิธีการอื่น (ไม่ใช้การตัด) สามารถใช้งานได้ที่นี่ และมันทำงานได้อย่างสมบูรณ์แบบ

มันทำงานอย่างไร

{<x!4!-&4#-1 0 2+-4!#x}
                 -4!#x    Length divided by four (floor division)
        4#-1 0 2+         Generate lengths (x/4-1, x/4, x/4+2, x/4-1)
       &                  Generate that many 0, 1, 2, 3's
    4!-                   Negate and modulo 4; effectively swap 1 and 3
 <x!                      Sort the original string by above

{$[8>#x;.; <code> ]}  Input validation
 $[8>#x           ]   If the length is less than 8
        .             Dynamically generate an error
           <code>     Otherwise, run the main code

@ngn เกิดอะไรขึ้นกับดวงตาของฉัน Oo
Bubbler

3

Perl 6 , 60 58 ไบต์

-2 ไบต์ขอบคุณ Jo King

{[~] .rotor($_/4 X-1,0,+^-$_+>2,-1,1)[0,4,2,3,1;*]}o*.comb

ลองออนไลน์!

โยน "ความยาวรายการย่อย Rotorizing อยู่นอกช่วง" ในกรณีที่เกิดข้อผิดพลาด

คำอธิบาย

{               # Anonymous block
 [~]            # Join
   .rotor(      # Split into sublists of specific length
     $_/4 X-    # Subtract from len/4
     1,
     0,
     +^-$_+>2,  # (len-1)>>2
                #   subtraction yields 1 if len is multiple of 4
                #   otherwise a value less than 1 causing an error
     -1,       
     1)
   [0,4,2,3,1;*]  # Rearrange sublists and take inner elements
}o*.comb          # Split into characters and feed into block

3

J , 36 35 ไบต์

5;@A.](<;.2~;)1<@{."+~1 0 _2 1-4%~#

ลองออนไลน์!

-1 ไบต์โดย{.+ ความยาวเชิงลบและ;.2จะตัดเครื่องหมายที่เป็น "สิ้นสุด" แทน

คำตอบเดิม 36 ไบต์

5;@A.](<;.1~;)1<@{."+~_1 0 2 _1+4%~#

ลองออนไลน์!

ngn พูดถึง "cut" ในความคิดเห็นต่อคำตอบ K ก่อนหน้านี้และทำให้ฉันลอง J ซึ่งมี "cut" เหมือนกัน (ฉันไม่รู้ว่า K ทำงานอย่างไร)

มันทำงานอย่างไร

5;@A.](<;.1~;)1<@{."+~_1 0 2 _1+4%~#  Monadic train.
                                4%~#  Length divided by four
                      _1 0 2 _1+      Generate the four segment lengths
              1<@{."+~  Generate [1 0 0...] boxed arrays of those lengths
      (     ;)          Raze; unbox and concatenate
     ] <;.1~            Cut the input string on ones as starting marker, then box each
5  A.  Rearrange the boxes in the order 0 3 2 1
 ;@    Raze again

โปรดทราบว่าฟังก์ชั่นนี้จัดการอินพุตที่ไม่ถูกต้องโดยอัตโนมัติ:

  • หากความยาวของอินพุตไม่ใช่จำนวนทวีคูณของสี่ให้{.โยนdomain errorเนื่องจากอาร์กิวเมนต์ความยาวนั้นต้องเป็นจำนวนเต็ม
  • ถ้าความยาวใส่เป็น 4 ตัดผลิตเพียงสองกลุ่มและพ่น5 A.index error
  • หากความยาวอินพุตเป็น 0 ทั้งสองข้อโต้แย้งที่จะตัดไม่มีความยาวเท่ากันดังนั้นlength errorจะถูกโยนทิ้ง

3

Python 3 , 103 102 101 97 88 86 84 ไบต์

def f(s):l=len(s);l//=4*(l%4<1<l/4);return s[:l-1]+s[1-l:]+s[2*l-1:1-l]+s[l-1:2*l-1]

ลองออนไลน์!

ไม่ใช่สายการบินเดียว แต่จริงๆ ;เป็นไบต์ต่อบรรทัดที่น้อยกว่า linebreak และการเยื้อง

โยนZeroDivisionErrorถ้าความยาวสตริงอินพุตน้อยกว่า 8 หรือไม่ใช่จำนวนเต็มคูณด้วย 4

ใช้ได้กับ Python 2 ด้วย

-4 ไบต์ขอบคุณ Jo King

-9 ไบต์ขอบคุณ ovs

-2 ไบต์ขอบคุณ Jonathan Frech

-2 ไบต์ขอบคุณ Bubbler


@JoKing ขอบคุณสำหรับเคล็ดลับที่นิยมมาก :)
Axim


@ovs ดีจับดัชนีที่อยู่ติดกันสำหรับ parens ฉันพยายามรอบอย่างน้อย 20 นาทีเพื่อดูว่าฉันสามารถกำจัดบางส่วนของพวกเขาแล้วฉันก็พลาดไปอย่างสิ้นเชิงกับการเปลี่ยน//=คู่นอกสุดกลายเป็นซ้ำซ้อน ขอบคุณมัด!
Axim

2
-l+1<-> 1-l?
Jonathan Frech

1
ผสานสองความไม่เท่าเทียมกันที่จะได้รับ84 ไบต์
Bubbler

2

Perl 6 , 78 ไบต์

*.comb[0..*/4-2,3* */4+1..*,*/2-1/(*>7)..3* */4,*/4-1/(*%%4)..*/2-2].flat.join

ลองออนไลน์!

รหัสบล็อกที่ไม่ระบุชื่อที่ใช้สตริงและส่งคืนสตริงที่แก้ไขหากถูกต้องมิฉะนั้นส่งคืนการหารด้วยศูนย์ข้อผิดพลาด ฉันรู้ว่าฉันสามารถแก้ไขอาร์เรย์ได้โดยตรงดังนั้นฉันจึงสามารถสลับสองส่วนของสตริงได้ แต่ฉันไม่สามารถเข้าใจได้


2

K (ngn / k) , 120 113 103 99 95 ไบต์

{$[(r>7)&0=4!r:#:x;{g:(s:*|(y*2)#x)\x;((y-1)#*g),((-y-1)#*|g),s,((y+1)#*|g),(-y)#*g}[x;r%4];l]}

หวังว่าจะสามารถเล่นกอล์ฟได้มากขึ้นรวมถึงฟังก์ชั่นพิเศษสำหรับการทดสอบถ้าความยาวสตริงหารด้วยสี่ข้อผิดพลาดของเอาต์พุตที่มีการอ้างอิงถึงตัวแปรที่ไม่ได้ประกาศถ้าอินพุตไม่ถูกต้อง

แก้ไข: สภาพที่พลาดบนความยาวมากกว่า 7 รวมอยู่ด้วย

แก้ไข: รวมเป็นหนึ่งฟังก์ชันลบการประกาศตัวแปรซ้ำซ้อน

ลองออนไลน์!


1
อาจสั้นกว่านี้มาก คุณรู้เกี่ยวกับ "ตัด" ( indices_string)? ping ฉันในสวนผลไม้ถ้าฉันควรอธิบาย
ก.ย.

1
ฉันสามารถทำมันได้ใน 34 ไบต์ :)
NGN

ฉันรู้เรื่องการตัด แต่ฉันไม่ได้คิดที่จะใช้ ... 34 ไบต์! ฉันจะต้องให้เรื่องนี้กับคนอื่นเมื่อฉันกลับถึงบ้านและดูว่าฉันเข้าใกล้
ไหม

ฉันควรพูดถึง: วิธีการแก้ปัญหาของฉันไม่แน่ใจว่าอินพุตที่ไม่ถูกต้อง (ความยาว <= 7) ทำให้เกิดข้อผิดพลาด
ก.ย.

1

เรติน่า 0.8.2 , 58 หรือ 73 หรือ 83 หรือ 93 ไบต์

((((.)))*?)(.(?<-2>.)+)(...(?<-3>.)+)((?<-4>.)+)$
$1$7$6$5

ลองออนไลน์!คำอธิบาย:

((((.)))*?)

จับภาพaในและทำให้มันเป็นสั้นที่สุด$1 , และ*?$#2$#3$#4aสิ้นสุดขึ้นเป็นความยาวของ

(.(?<-2>.)+)

จับภาพในb $4การ(?<-2>.)+จับขึ้นอยู่กับความยาวของaในขณะที่อีกตัวหนึ่ง.จะเพิ่ม 1 ตามความต้องการ

(...(?<-3>.)+)

จับภาพsและในc $6ความยาวรวมของพวกเขาคือสามมากกว่าความยาวของaความยาวรวมของพวกเขาคือสามมากกว่าความยาวของ

((?<-4>.)+)

จับภาพในd $7ความยาวของมันไม่เกินความยาวของaความยาวไม่เกินความยาวของ

$

เราทำ aสั้นที่สุดเท่าที่จะทำได้ แต่เรายังต้องการที่จะถึงจุดสิ้นสุดของอินพุต

$1$7$6$5

แลกเปลี่ยน bและd.

ขั้นตอนข้างต้นไม่ได้ตรวจสอบความถูกต้องของอินพุต เนื่องจาก Retina ไม่มีข้อผิดพลาดในการรันจึงมีตัวเลือกมากมายสำหรับการตรวจสอบอินพุต:

G`^(....){2,}$

ไม่ส่งผลใด ๆ หากความยาวน้อยกว่า 8 หรือไม่ใช่ทวีคูณของ 4 (+15 ไบต์)

^(?!(....){2,}$).*
Error

ส่งออกErrorถ้าความยาวน้อยกว่า 8 หรือไม่ใช่ทวีคูณของ 4 (+25 ไบต์)

+`^(....)*..?.?$|^(....)?$
.....$1

แฮงค์หากความยาวน้อยกว่า 8 หรือไม่ใช่ทวีคูณของ 4 (+35 ไบต์)


นี้ไม่ได้โยนข้อผิดพลาดในปัจจัยการผลิตที่ไม่ถูกต้อง (เป็นที่น่ารำคาญเป็นที่)
โจคิง

1

C (GCC)ด้วย-Dx=memcpyและ-DL=(l-1), 154 158 160 ไบต์

ส่งคืนค่า NULL ถ้าความยาวของสตริงอินพุตไม่สามารถหารด้วย 4 หรือน้อยกว่า 8 อักขระ

ขอบคุณ Rogem และ Jonathan Frech สำหรับคำแนะนำ

แก้ไข: ตัวประมวลผลล่วงหน้าที่ย้ายกำหนดไปที่บรรทัดคำสั่งและทำให้สตริงที่จัดสรรแบบไดนามิกเพื่อให้สอดคล้องกับปริศนาอย่างเคร่งครัด

f(s,t,l)char*s,*t;{l=strlen(s);l%4|l<8?t=0:(t=malloc(l+1),l/=4,x(t,s,L),x(t+L,s+3*l+1,L),x(t+2*L,s+L+l,l+2),x(t+3*l,s+L,l),t[4*l]=0);l=t;}//-Dx=memcpy -DL=(l-1)

ลองออนไลน์!


ทำไมt[80]? ดูเหมือนจะไม่มีขอบเขตบนความยาวของอินพุต
Jonathan Frech

@JonathanFrech ฉันทำเพื่อบันทึกไบต์ แต่คุณถูกต้อง ฉันเปลี่ยนวิธีใช้malloc()แทน
ErikF

ส่งคืนโดยการปรับเปลี่ยนค่าส่งคืนNULLสำหรับเอาต์พุตที่ไม่ถูกต้องใช้ค่าส่งคืนจากmemcpy()แมโครที่มีฟังก์ชันคล้ายเพื่อข้ามประเภทและอาร์เรย์ความยาวผันแปร C99 เพื่อข้ามmalloc()ไป

ทำไม 160 ไบต์คุณจะนับ//หรือ-w?
l4m2

@ l4m2 -wเป็นเพียงความสะดวกในการระงับคำเตือน (ดังนั้นข้อผิดพลาดจะหาได้ง่ายขึ้น) ฉันมักจะเพิ่มอาร์กิวเมนต์บรรทัดคำสั่งหลังจาก a //เพื่อให้ TIO นับไบต์ของพวกเขาสำหรับฉันแล้วหัก 1 จากผลรวมไปยังบัญชีสำหรับอักขระพิเศษหนึ่งตัวที่จำเป็นต้องทำ

1

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

L7»4ḍİ×L:4;;ĖÄƲFÄœṖ⁸⁽%[D¤ị$F

(หากโปรแกรมเต็มได้รับอนุญาตเราสามารถลบส่วนท้ายF)
หากความยาวน้อยกว่า 8 หรือหารด้วยสี่ไม่ได้ValueErrorถูกยกขึ้นในระหว่างการหารจำนวนเต็มของinf(ลอย) โดย4- ผลตอบแทนหารNaN(ยังลอย) ซึ่งไม่สามารถ intถูกโยนไปยัง

ลองออนไลน์!

อย่างไร?

L7»4ḍİ×L:4;;ĖÄƲFÄœṖ⁸⁽%[D¤ị$F - Link: list of characters
L                            - length
 7                           - literal seven
  »                          - maximum (of length & 7)
   4ḍ                        - divisible by four? (yields 1 for good inputs; 0 otherwise)
     İ                       - inverse (1 yields 1; 0 yields inf)
      ×L                     - multiply by length (length or inf)
        :4                   - integer divide by 4 (errors given inf)
              Ʋ              - last four links as a monad (f(x)):
          ;                  -   concatenate -> [x,x]
            Ė                -   enumerate -> [1,x]
           ;                 -   concatenate -> [x,x,[1,x]]
             Ä               -   cumulative sum (vectorises at depth 1) -> [x,x,[1,1+x]]
               F             - flatten -> [x,x,1,1+x]
                Ä            - cumulative sum -> [x,2x,2x+1,3x+2]
                   ⁸         - chain's left argument (the input)
                 œṖ          - partition at indices (chops up as per requirements)
                          $  - last two links as a monad (f(z)):
                        ¤    -   nilad followed by link(s) as a nilad:
                    ⁽%[      -     10342
                       D     -     decimal digits -> [1,0,3,4,2]
                         ị   -   index into z (rearranges the pieces as per requirements)
                           F - flatten (back to a list of characters)




1

JavaScript (Node.js) , 80 ไบต์

s=>(g=s.substr.bind(s))(0,l=s.length/4-1)+g(-l)+g(l-~l,l+3)+g(l,l+1,l<1==l%1||Z)

ลองออนไลน์!

JavaScript (Node.js) , 84 ไบต์

s=>(g=(a,b)=>s.substr(a,b))(0,l=s.length/4-1)+g(-l)+g(l-~l,l+3)+g(l,l+1,l<1==l%1||Z)

ลองออนไลน์!

JavaScript (Node.js) , 87 ไบต์

s=>(l=s.length/4)<2||l%1?Z:(g=(a,b)=>s.substr(a,b))(0,l-1)+g(1-l)+g(l+l-1,l+2)+g(l-1,l)

ลองออนไลน์!

สั้นกว่า RegExp


0

Java 8, 135 ไบต์

s->{int l=s.length();l=l>7&l%4<1?l/4:l/0;return s.substring(0,l-1)+s.substring(3*l+1)+s.substring(2*l-1,3*l+1)+s.substring(l-1,2*l-1);}

พ่นArithmeticException(หารด้วยศูนย์) ถ้าสตริงอินพุตไม่ตรงกับข้อกำหนด ลองออนไลน์ได้ที่นี่

Ungolfed:

s -> { // lambda function taking a String argument and returning a String
    int l = s.length(); // take the length of the input ...
    l = l > 7 &         // ... if it's  greater than 7 and ...
        l % 4 < 1       // ... a multiple of 4 ...
      ? l / 4           // ... divide by 4; otherwise ...
      : l / 0;          // ... error out (division by zero throws ArithmeticException)
    return // concatenate and return:
           s.substring(0, l - 1)             // a
         + s.substring(3 * l + 1)            // d
         + s.substring(2 * l - 1, 3 * l + 1) // sc
         + s.substring(l - 1, 2 * l - 1);    // b
}

แนะนำl/=l>7&l%4<1?4:0;แทนl=l>7&l%4<1?l/4:l/0;
ceilingcat

0

C (gcc) , 129 ไบต์

ส่งคืนโดยการแก้ไข รวบรวมกับ:

-Df(s)=({char t[l=strlen(s)];l%4|l<8?0:(l/=4,x(t,s+l*2-1,l-~l),x(x(x(s+l*3,s+l-1,l)-l-2,t,l+2)-l+1,t+l+2,l-1),s);}) -Dx=memcpy

ไฟล์ต้นฉบับ:

l;

ลองออนไลน์!

Degolf

-Df(s)=({ // Function-like macro f. Takes a char* as a parameter.
          // Return value is a pointer to s if successful, and to NULL if string was invalid.
     char t[l=strlen(s)]; // Allocate a local temp string.
     l%4|l<8?0: // Detect invalid strings. Return 0 (NULL) on invalid string.
         (l/=4, // We're only really concerned with floor(len/4), and this will yield that.
             memcpy(t,s+l*2-1,l-~l), // Copy the second half of chars to the temp storage.
             memcpy( // Because memcpy returns the address of the destination, we can chain
                     // the calls to save quite a few bytes, even after x->memcpy substitution.
                 memcpy(memcpy(s+l*3,s+l-1,l) // Next, copy the second quarter to the end.
                     -l-2,t,l+2) // After that, we copy back the third quarter to its place.
                          -l+1,t+l+2,l-1) // Finally, copy the fourth quarter to where the second
                                          // quarter was.
                      ,s);}) // And return the pointer.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.