Cops: ทำ regex - ทำงู


40

นี่คือกระทู้ของตำรวจ ด้ายโม่งคือที่นี่


เขียนรหัสที่รับอินพุตnและสร้าง n-by-n "snake matrix"

งูเมทริกซ์เป็นเมทริกซ์ที่เป็นไปตามรูปแบบนี้:

3 คูณ 3:

1  2  3
6  5  4
7  8  9

และ 4-by-4:

1   2   3   4
8   7   6   5
9   10  11  12
16  15  14  13

รูปแบบผลลัพธ์ที่แน่นอนเป็นตัวเลือก คุณอาจส่งออกตัวอย่าง[[1 2 3],[6 5 4],[7 8 9]]หรือสิ่งที่คล้ายกัน

คุณต้องระบุชื่อภาษาและ regex ที่ตรงกับรหัสของคุณ คุณสามารถเลือกว่ารายละเอียด regex ของคุณควรเป็นอย่างไร ในสุดขีดคุณสามารถเขียน regex ที่ตรงกับสตริงที่เป็นไปได้ทั้งหมดซึ่งในกรณีนี้จะเป็นการง่ายมากที่จะถอดรหัสโค้ดของคุณ คุณต้องให้ผลลัพธ์สำหรับn=4เพื่อให้โจรรู้ว่ารูปแบบที่แน่นอนที่คุณเลือกใช้

คุณสามารถใช้หนึ่งในรสชาติ regex ที่มีอยู่ในregex101.comหรือรสทับทิม

คุณต้องระบุว่าคุณใช้อันไหน

หมายเหตุ:

  • คุณต้องสนับสนุนการใด ๆ nที่มีขนาดใหญ่พอสมควร คุณอาจคิดว่ามันจะไม่เกินประเภทข้อมูลหรือหน่วยความจำ หากประเภทข้อมูลเริ่มต้นเป็นจำนวนเต็ม 8 บิตที่มีลายเซ็นคุณสามารถสันนิษฐานได้ว่าn<=11ถ้ามันเป็นจำนวนเต็ม 8 บิตที่ไม่ได้ลงชื่อคุณสามารถสันนิษฐานn<=15ได้
  • โจรจะต้องตรงกับรูปแบบผลลัพธ์ของการส่งยกเว้นช่องว่างนำหน้า / ต่อท้ายและขึ้นบรรทัดใหม่เนื่องจากอาจถูกนำออกไปโดยการจัดรูปแบบ SE

เกณฑ์การชนะ:

ผู้ชนะจะเป็นการส่งที่ไม่ได้ติดตามด้วย regex ที่สั้นที่สุดโดยวัดจากจำนวนอักขระ

หากโพสต์ของคุณยังไม่ได้ทำการติดตาม 7 วันคุณสามารถโพสต์โซลูชันที่ต้องการและทำเครื่องหมายการส่งของคุณว่าปลอดภัย


5
เมล็ดพันธุ์ความยาว .1
Kritixi Lithos

1
ฉันสามารถใช้เอกสารภาษาใดภาษาหนึ่งที่นี่หรือไม่ codegolf.stackexchange.com/questions/61804/…

2
@KritixiLithos ยกเว้นคุณจะต้องปล่อยโปรแกรมต้นฉบับของคุณให้ปลอดภัย ;-)
ETHproductions

3
@DeepakAgarwal - เขียนรหัสของคุณเพื่อสร้างงูจากนั้นระบุ regex ที่ตรงกับมัน วิธีแก้ปัญหาของโจรจะต้องเป็นภาษาเดียวกันและตรงกับ regex เช่นกัน ดังนั้นกลยุทธ์อย่างหนึ่งก็คือการจัดทำ regex ที่เข้มงวดเพื่อทำให้มันยากในการปล้น แต่ก็ไม่ได้ จำกัด ว่าคุณจะให้ทางออก!

2
ฉันทามติเมตานี้อนุญาตให้ unary I / O สำหรับ sed ซึ่งไม่มีประเภทข้อมูลใดถูกต้องสำหรับความท้าทายนี้หรือไม่?
seshoumara

คำตอบ:


9

05AB1E , แคร็กโดย mbomb007

หวังว่ามันจะสนุกและไม่ชัดเกินไป

Regex (PCRE):

^\w*[+\-*\/%]*\w*.{0,2}$

เอาท์พุท n = 4:

[[1, 2, 3, 4], [8, 7, 6, 5], [9, 10, 11, 12], [16, 15, 14, 13]]

โซลูชันดั้งเดิม

UXFXLNX*+NFR}ˆ

oooooomg - dude that dope (คำชมเชยแน่นอน)
Tilak Maddy

@ mbomb007: จดหมายด้วยสำเนียงไม่ตรงกับ\wไม่มี คุณสามารถลองด้วยตัวเองได้ที่regex101
Emigna

1
คุณสามารถทำให้ regex ของคุณสั้นลงโดยเปลี่ยน.{0,2}เป็น.?.?
Aaron

1
คุณสามารถใส่-ในตำแหน่งสุดท้ายของคลาส char ที่ถูกวงเล็บ ( [+*\/%-]) เพื่อที่คุณจะได้ไม่ต้องหนีจากมัน
Dada

@Dada: นั่นใช้งานได้จริงใน PCRE ฉันไม่ได้กังวลอย่างมากกับการทำให้สั้นลงในขณะนี้เพราะฉันค่อนข้างมั่นใจว่ามันจะแตก หากควรระงับฉันจะรวมทั้งข้อเสนอแนะของคุณและ Aarons ขอบคุณ :)
Emigna


7

เยลลี่ , ความยาว 6, แคร็ก

Regex (PCRE)

^.{9}$

ตัวอย่างผลลัพธ์

 1  2  3  4
 8  7  6  5
 9 10 11 12
16 15 14 13

3
นี่เป็นการบังคับให้เล่นกอล์ฟได้เป็นอย่างดีใน Jelly: D
Yytsi

1
ตัวละครใดเก้าตัว? คุณรู้สึกใจกว้าง! : D
AdmBorkBork

1
'เก้าใดก็ได้' มีฟังก์ชั่นกี่อย่างในเยลลี่?
Matthew Roh

ฉันแน่ใจว่า 99% ว่าถ่านตัวสุดท้ายต้องจัดGรูปแบบเอาต์พุตอย่างถูกต้อง ฉันใกล้จะแก้ไขส่วนที่เหลือแล้ว แต่ฉันไม่สามารถหาวิธีที่จะย้อนกลับรายการอื่น ๆ ทั้งหมดในอาร์เรย์ด้วยเจลลี่ ...
ETHproductions

@ ETHproductions: ฉันค่อนข้างแน่ใจว่าฉันเกือบจะแก้ไขแล้วและฉันมีวิธีการย้อนกลับรายการอื่น ๆ ทุกอย่าง ปัญหาของฉันคือฉันไม่สามารถหาวิธีผูกทุกอย่างเข้าด้วยกัน (ฉันยังไม่ได้ลองใช้บทช่วยสอน) ฉันคาดหวังว่าจะเห็นมันได้รับการแก้ไขโดยขณะนี้แม้ว่า อาจจะยากกว่าที่ฉันคิด
Emigna

6

R, ความยาว 14 แตกโดย plannapus

ฉันหวังว่าฉันได้รับ regex นี้ถูกต้อง สิ่งที่ผมพยายามจะบอกก็คือ 77 ตัวอักษรไม่รวม<space>, #, และ; [ฉันทดสอบที่นี่

regex

^[^ #;\[]{77}$

เอาต์พุตตัวอย่าง n = 4

1 2 3 4 
8 7 6 5 
9 10 11 12 
16 15 14 13  

ฉันคิดว่ามันจะง่าย แต่ฉันมีปัญหาที่สำคัญในการส่งออกตัวเลขเหล่านั้นเช่นนั้น (เทียบกับบางประเภท) การทำงานที่ดี.
BLT

1
@BLT ขอบคุณมันเป็นปัญหาที่น่าสนใจที่จะลองและทำให้ยาก
MickyT

แคร็กแม้ว่าอาจจะไม่ใช่รหัสเดียวกับคุณ
plannapus


6

> <> , ความยาว 49, แคร็กโดยแอรอน

Regex (Javascript)

^.{7}\n.{12}\n\?.{6};[^v^]{27}(\n.{13}:&.{2}){2}$

เอาต์พุตตัวอย่าง (n = 4)

1 2 3 4 
8 7 6 5 
9 10 11 12 
16 15 14 13 

การจัดรูปแบบนั้นค่อนข้างแปลก แต่การตรวจสอบความยาวของจำนวนจะทำให้นานขึ้น อาจจะไปลงน้ำเล็กน้อยบน regex ไม่แน่ใจ!

แก้ไข: นอกจากนี้ฉันลืมพูดถึงฉันใช้สแต็กเริ่มต้น (แฟล็ก -v) สำหรับอินพุตไม่ใช่อินพุตปลาปกติ ขออภัย!

รหัสเดิม:

<v1*2&:
 >:{:}=?v:1+
?^{r0}v;>&:&[r]{&:&2*+}::&:::&*@+@(
+:}=?v>n" "o&:&{1
0~{oa<^v?)*&::&:}

แอรอนเป็นเรื่องง่ายกว่ามาก! ความซับซ้อนของรหัสต้นฉบับของฉันนั้นขึ้นอยู่กับแนวคิดของการใช้n[r]หมายเลข n-th เพื่อพลิกส่วน (แถว) นั้นแล้วพิมพ์ตัวเลขทั้งหมดในครั้งเดียวในตอนท้าย


1
..สั้นกว่า.{2};)
Aaron

ไม่เป็นไรแตกมัน! เห็นได้ชัดว่าฉันไม่ได้ติดตามรหัสของคุณมากเกินไป แต่มันก็เป็นความท้าทายที่น่าสนใจอยู่ดี กรุณาแบ่งปันรหัสเดิมของคุณ! นอกจากนี้หากคุณต้องการคุณสามารถคืนความโปรดปราน ;)
แอรอน

@Aaron งานที่ดี! ยัง yeeah ฉันไม่แน่ใจว่าฉันไม่ได้สังเกตว่าใน regex โอ้ดี :) ฉันจะดูว่าฉันจะทุบของคุณได้
ไหม

5

โอห์ม , แตก

ด้วยความท้าทายของตำรวจและโจรครั้งแรกของฉันดังนั้นโปรดบอกฉันว่ามีปัญหากับรูปแบบนี้หรือไม่ (โดยเฉพาะอย่างยิ่งเนื่องจากนี่เป็นภาษาที่ไม่รู้จักพอสมควร)

Regex (PCRE)

^\S{6}\W{0,3}\w$

เอาท์พุท (n = 4)

[[1, 2, 3, 4], [8, 7, 6, 5], [9, 10, 11, 12], [16, 15, 14, 13]]

1
ถ้ามีอะไรก็อาจจะง่ายเกินไป หากคุณมี.*regex ของคุณมันอาจเป็นอะไรก็ได้ ดังนั้นหากภาษามีความคิดเห็นพวกเขาสามารถเขียนโปรแกรมใดก็ได้ตามด้วยความคิดเห็น
mbomb007

@ mbomb007 เป็นจุดที่ดี
Nick Clifford


@Emigna ทำได้ดีมาก!
Nick Clifford

5

PHP, 221 ไบต์ ( แตก )

ฉันหวังว่ามันจะยากพอ

Regex (PCRE): 16 ไบต์

^[^\s/\#6]{221}$

ไม่มีพื้นที่ว่างไม่มีความคิดเห็นไม่ใช้ base64_decode มีความสุข.

เอาท์พุต

  1  2  3  4
  8  7  6  5
  9 10 11 12
 16 15 14 13

รหัสต้นฉบับ

$w=$argv[1];$s="";$r=range(1,$w**2);for($i=0;$i<$w;$i++)if($i%2)array_splice($r,$i*$w,$w,array_reverse(array_slice($r,$i*$w,$w)));foreach(($r)as$v)$s.=str_pad($v,$l=strlen(max($r))+1,"\x20",0);echo(chunk_split($s,$l*$w));

โปรดทราบว่าคำตอบสามารถใช้ได้base64_decodeเพราะ regex ของคุณไม่อนุญาต
CalculatorFeline

4
@CalculatorFeline: บล็อก regex ซึ่งอาจบล็อก6 base64_decode
nneonneo


โอ๊ะโอพลาดแล้ว แต่ ^ มันไม่สำคัญ
CalculatorFeline

5

C # net46 (แตก)

( http://ideone.com/ ใช้งานได้)

Regex PCRE รสความยาว 58 ทดสอบที่ regex101

^sta((?![\d%bh\/]|==|if|(\[.*){4}|(i.*){6}).){142}urn....$

มีเพียงวิธีการที่ถูก regexed วิธีการส่งกลับอาร์เรย์ 2d int [,] (int [4,4]) สำหรับการป้อนข้อมูล n = 4 หากพิมพ์ออกมาเป็นแบบนี้:

1 2 3 4 
8 7 6 5 
9 10 11 12 
16 15 14 13 

นี่คือรายการแรกของฉันเป็นอะไรเช่นนี้แจ้งให้เราทราบหากฉันทำอะไรผิด ไม่พยายามที่จะชนะโดย regex ยาวแน่นอนฉันแค่สนใจที่จะดูว่าฉันทำได้ดีแค่ไหนในการป้องกันการแคร็ก :)

รหัสเดิม:

static int[,]g(int n){int l,j,k=n-n,c,s;var _=new int[n,n];var d=n!=n;c=k;c++;s=k;for(l=k;l<n;l++){for(j=k;j<n;j++){_[l,d?n-j-c:j]=++s;}d=!d;}return _;}


ทำได้ดีมากฉันควรพยายามทำให้ความยาวนั้นยากขึ้นอย่างน้อย ...
EklipZ

5

QBasic, regex ยาว 10 (แตก )

regex

ควรทำงานในรสชาติที่ regex ใด ๆ แต่เราจะเรียกมันว่ารสชาติของงูหลาม

([A-Z]+.)+

หมายเหตุ:โซลูชันของฉันใช้ QBasic ที่ไม่ฟอร์แมต หลังจากการจัดรูปแบบรหัสไม่ตรงกับ regex เนื่องจากช่องว่างเพิ่ม (แต่ฉันสามารถบอกคุณได้ว่านั่นเป็นเพียงการเปลี่ยนแปลงเท่านั้นที่สร้างความแตกต่าง([A-Z]+ ?. ?)+ยังคงใช้ได้กับเวอร์ชันที่จัดรูปแบบแล้ว)

สำหรับวัตถุประสงค์ในการทดสอบฉันใช้QB64เมื่อปิดการจัดรูปแบบรหัส (ภายใต้ตัวเลือก> โครงร่างโค้ด) หากคุณไม่ต้องการดาวน์โหลดบางสิ่งคุณสามารถเรียกใช้ QBasic ทางออนไลน์ได้ที่archive.org (แต่คุณไม่สามารถปิดการฟอร์แมตได้)

ตัวอย่างผลลัพธ์

 1  2  3  4 
 8  7  6  5 
 9  10  11  12 
 16  15  14  13 

ดังนั้นสัญลักษณ์ทั้งหมดในแหล่งที่มาจะต้องนำหน้าด้วยตัวอักษร
CalculatorFeline

@CalculatorFeline หนึ่งตัวอักษรหรือมากกว่า
mbomb007

ดีความต้องการของฉันคือเทียบเท่าเพราะ\w+\Wสามารถแบ่งออกเป็นและ\w* \w\W( \w*อาจเป็นnull(เล็กน้อย) หรือ\w+(แอบเข้าไปในสัญลักษณ์ได้ง่าย)
เครื่องคิดเลข

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


5

Python 3, 55 ไบต์(แคร็ก)

รสชาติ PCRE / Python / Golang

def [triangles=(1,SNAKE)]{27}:print[]SNAKE(--:>or[]{48}

(โปรดจำไว้ว่าต้องมีการแข่งขันแบบเต็มสมมติ^และ$เมื่อทำการทดสอบ)

ตัวอย่างผลลัพธ์:

[1, 2, 3, 4]
[8, 7, 6, 5]
[9, 10, 11, 12]
[16, 15, 14, 13]

ทางออกเดิม:

def r(N,S=1,A=1,K=range,E=list):print(E(K(S,S+N))[::A])or(S+N>N*N)or(r(N,S+N,-A,K,E))

ควรตัดแต่งขนาด 4 ไบต์: p


ดูเหมือนว่าสำหรับฉันที่คุณพลาด )ในส่วนที่สองของ Regex
JörgHülsermann

@ JörgHülsermannไม่มีอะไรหายไป regex นั้นถูกต้อง
kennytm

1
@ JörgHülsermannพิเศษ(อยู่ภายในชั้นเรียนตัวอักษรเริ่มต้นหลังจากและสิ้นสุดก่อนprint {48}เอาฉันไปดูด้วย ;) (สำหรับเรื่องนั้นวงเล็บคู่ก่อนหน้านี้ยังอยู่ในคลาสของตัวละครด้วย)
DLosc

@Dosc ตอนนี้มันชัดเจน ขอขอบคุณ
JörgHülsermann


5

dc , Regex length 12   Cracked โดย seshoumara!

^[^# !]{59}$

การแสดงออกปกตินี้เรียบง่ายพอที่ฉันไม่คิดว่ารสชาติของ regex สำคัญ - ควรทำงานทั่วกระดาน (สังเกตช่องว่างหลัง # ใน regex)

ฉันได้ทดสอบทั้งสี่รสชาติที่ regex101.com (PCRE / PHP, Javascript, Python และ Golang) รวมถึงรุ่น Ruby ที่ rubular.com โปรแกรม dc ตรงกับ regex ในทั้งห้าเวอร์ชัน regex


โปรแกรม dc รับอินพุตบน stdin และวางเอาต์พุตบน stdout

ตัวอย่างเอาต์พุตสำหรับอินพุต 4 (มีช่องว่างต่อท้ายที่ท้ายบรรทัดแต่ละบรรทัด):

1 2 3 4 
8 7 6 5 
9 10 11 12 
16 15 14 13 

รหัสดั้งเดิม (เพิ่มหลังจากถูกถอดรหัส)

นี้ได้รับการแตกโดย @seshoumara นี่คือรหัสที่ฉันต้องการ:

?sd[AP]s+0[dddld/2%rld%2*1+ldr-*+1+n2CP1+dld%0=+dvld>l]dslx

คำอธิบาย:

?sd      Input number and store it in register d.
[AP]s+   Macro that prints a newline. The macro is stored in register '+'.
0        Push 0 on the stack, initializing a loop.  (The top of the stack is the index variable.  It will go up to d^2-1.)
[        Start a macro definition.  (The macro will be stored in register l.)
ddd      Push 3 copies of the loop index variable on the stack, so they'll be available later. I'll call this number i.
ld/      Divide the last copy of i by d (integer division); this computes the row of the square that we're in (starting with row 0).
2%       Replace the row number with 0 if the row number is even, with 1 if the row number is odd.
r        Swap the top two items on the stack, so the top item is now the next to last copy of i, and the second item on the stack is the row number mod 2.
ld%      Compute i mod d; this goes from 0 to d-1. It is the column in the square that the next number will be placed in.  (The leftmost column is column 0.)
2*1+     Top of the stack is replaced with 2*(column number)+1.
ldr      Inserts d as the second item on the stack.
-        Computes d-2*(column number)-1.
*        The second item on the stack is the row number mod 2, so multiplying yields 0 if the row number is even, and d-2*(column number)-1 if the row number is odd.
+        Add to the remaining copy of i. The sum is i itself in even-numbered rows, and it's i+d-2*(column number)-1 in odd-numbered rows.

ผลรวมที่ด้านบนสุดของสแต็กตอนนี้คือหมายเลขถัดไปที่เราต้องการพิมพ์:

  • ง่ายที่จะเห็นว่าถูกต้องหากหมายเลขแถวเป็นเลขคู่ตั้งแต่นั้นผลรวมจะเป็นแค่ฉัน

  • สำหรับแถวที่มีเลขคี่ให้สังเกตว่า i = d * (i / d) + (i% d) = d * (หมายเลขแถว) + หมายเลขคอลัมน์ ตามด้วยผลรวม i + d-2 * (หมายเลขคอลัมน์) -1 คือ d * (หมายเลขแถว) + หมายเลขคอลัมน์ + d - 2 * (หมายเลขคอลัมน์) - 1 = d * (หมายเลขแถว + 1) - หมายเลขคอลัมน์ - 1 ซึ่งเป็นตัวเลขที่เราต้องการใส่ในแถวและคอลัมน์ที่ระบุเพื่อให้แน่ใจว่าเรานับถอยหลังในแถวเลขคี่

กลับไปที่คำอธิบายทันที:

n        Print the desired number for the current row and column.
2CP      Print a space.  (2C, which is computed by dc as 20 + 12, is 32, the ASCII code for a space.)
1+       The original copy of i is at the top of the stack; add 1 to it.
dld%0=+  If (the incremented value of) i is a multiple of d, call the macro at register '+', which prints a newline.
dvld>l   If d > sqrt(i) (in other words, if i < d^2), then go back to the top of the loop by calling macro l again.
]dslx    End the macro definition, store the macro in register l, and execute it.

ตัวอักษร#และ `` ถูกละไว้เพื่อไม่ให้คำตอบสั้นลงถึง 59 ไบต์หรือไม่ ถ้าเป็นเช่นนั้นไม่จำเป็นต้องมีตั้งแต่ใน dc มีหลายวิธีในการเพิ่มคำสั่งที่ไม่เปลี่ยนแปลงอะไรเลยเช่น qคำสั่งซ้ำในตอนท้ายของสคริปต์
seshoumara

@seshoumara มันเป็นพยักหน้าไปในทิศทางนั้นในขณะที่ยังคง regex สั้น แต่คุณพูดถูก (นี่เป็นรายการตำรวจและโจรครั้งแรกของฉันดังนั้นฉันไม่แน่ใจว่ามันง่ายแค่ไหน)
Mitchell Spector

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

@seshoumara ทำได้ดีมาก!
Mitchell Spector

@seshoumara ยังไงก็ตามช่องว่างก็มีประโยชน์ใน dc เพื่อแยกค่าคงที่ตัวเลขต่อเนื่องสองค่าดังนั้นการห้ามเว้นวรรคต้องใช้วิธีแก้ปัญหาหากคุณต้องการฟังก์ชันการทำงานนั้น อย่างไรก็ตามการพิมพ์ช่องว่างไม่ใช่เรื่องใหญ่เพราะ32Pสั้นกว่า[ ]nอยู่ดี
Mitchell Spector

5

Bash, regex ความยาว 38, แคร็ก ( @kennytm )

^sort -n <[1adegnopqrstx$\-*()|'; ]+$

การป้อนข้อมูล:

n=4; <command>

เอาท์พุท:

1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13

Cracked codegolf.stackexchange.com/a/112656/32353 อันนี้ดี: D
kennytm

ดีใจที่คุณสนุกกับมัน @ kennytm คุณพบวิธีการแก้ปัญหาที่แน่นอนเช่นเดียวกับคำสั่งเดิมของฉัน!
Marcos M

5

PHP

ฉันหวังว่านี่จะเป็นเกมที่สนุก! : D

เอาท์พุท (n = 4)

[[1,2,3,4],[8,7,6,5],[9,10,11,12],[16,15,14,13]]

ระดับ 1: PCRE (ความยาว = 17) ( แคร็กโดยJörgHülsermann )

^<[^'"\d{vV;<$]+$
  • ไม่มีคำพูดเดียวหรือสองครั้งดังนั้น ... ไม่มีสตริง!
  • ไม่มีตัวเลข!
  • ไม่{... ไม่มีฟังก์ชั่นนิรนาม!
  • ไม่v... ไม่eval()!
  • ไม่;... มันต้องเป็นประโยคเดียว!
  • ไม่<เช่นนั้น ... ไม่มีHeredocบล็อค PHP หลายอัน!
  • อันใหญ่! ไม่$ดังนั้น ... ขอให้โชคดีที่กำหนดตัวแปร! >: D

@ JörgHülsermannมีวิธีการที่น่าสนใจ แต่ไม่ใช่สิ่งที่ฉันคิดไว้ในใจ :) ดังนั้นฉันขอแนะนำระดับใหม่ของความยากลำบาก (ฉันสัญญาว่าฉันมีรหัสที่เหมาะกับเรื่องนี้และฉันไม่เพียง แต่ยุ่งกับคุณ):

ระดับ 2: PCRE (length = 23) ( แคร็กโดยJörgHülsermann )

^<[^'"\d{v;<$_~|&A-Z]+$
  • ข้อ จำกัด ทั้งหมดของระดับ 1
  • ใหม่ในระดับนี้: ไม่มีของเหล่านี้_~|&A-Z! :)

มีความสุข!


โซลูชันดั้งเดิม

ดังนั้นการห้าม$หมายความว่าตัวแปรไม่สามารถเข้าถึงได้ตามปกติ แต่นั่นไม่ได้หมายความว่าจะไม่สามารถใช้งานได้เลย! คุณยังสามารถใช้extract()/compact()เพื่อนำเข้า / ส่งออกตัวแปรในขอบเขตปัจจุบัน :)

$i = 1;
// can be written as
extract(['i' => 1])

echo $i;
// can be written as
echo compact('i')['i'];

อย่างไรก็ตามมี gotcha: compact('x')['x']++จะไม่ทำงานเพราะตัวแปรใน PHP ถูกส่งผ่านตามค่า ... โดยมีข้อยกเว้นหนึ่งข้อ! วัตถุ

$x = (object) ['i' => 1];
// is
extract(['x' => (object) ['i' => 1]]);

// and
compact('x')['x']->i++;
// works just fine!

ที่เหลือก็ง่าย

  • ตัวเลข0และ1ถูกสร้างขึ้นได้อย่างง่ายดายโดยการแปลงfalseและtrueไปยังintโดยการเตรียมพวกเขาด้วย+เครื่องหมาย
  • ใช้andและorเนื่องจาก&และ|เป็นสิ่งต้องห้าม
  • ในการหลีกเลี่ยงคำพูดที่ต้องห้ามให้ใช้ค่าคงที่ที่ไม่ได้กำหนดซึ่งถือว่าเป็นสตริง
  • เพื่อระงับการประกาศที่สร้างขึ้นโดยใช้ค่าคงที่ที่ไม่ได้กำหนดเพียงใช้ @
  • จดหมายต้องห้ามvสามารถสร้างขึ้นได้โดยใช้chr(ord('u') + 1)ซึ่งแปลว่าการ@chr(ord(u) + true)ใช้วิธีแก้ปัญหาข้างต้น
  • เครื่องหมายขีดล่างคล้ายกับด้านบนchr(ord('a') - 2)ซึ่งแปลเป็นchr(ord(a) - true - true)
  • ฟังก์ชั่นการโทรที่มีตัวอักษรต้องห้ามสามารถทำได้โดยใช้ประโยชน์จากcallableประเภทของ PHP ซึ่งสามารถเป็นสตริงที่มีชื่อของฟังก์ชั่น ดังนั้นคุณสามารถเชื่อมค่าคงที่ที่ไม่ได้กำหนดและสตริงอักขระเดี่ยวที่สร้างโดยord()สร้างชื่อของฟังก์ชันและเรียกใช้ดังนี้: array_reverse()กลายเป็น(a.rray.chr(ord(a)-true-true).re.chr(ord(u)+true).erse)()( arrayเป็นโครงสร้างภาษานั่นคือเหตุผลที่มันแบ่งเป็นค่าคงที่ที่ไม่ได้กำหนดaและrray)
  • ใช้ประโยชน์จากความจริงที่ว่าเมื่อพูดถึงการสร้างแบบมีเงื่อนไขและวนรอบวงเล็บปีกกาจะเป็นทางเลือกถ้าการสร้างใช้กับคำสั่งที่ตามมาทันที หมายความว่าคุณสามารถทำสิ่งต่าง ๆ เช่น: if ($n = $argv[1] and $i = 0) while ($n > $i++ and do_some and other_stuff or exit)

ตรรกะในรหัสที่มนุษย์สามารถอ่านได้คือ:

if (
    $x = (object) [
        'result' => [],
        'i' => 0
    ]

    and

    define('n', $argv[1])

    and

    define('un', '_')

    and

    // create the initial set which we'll loop through
    define('segments', array_chunk(range(1, pow(n, 2)), n))
) while (
    // store each odd segment as-is and increment the "pointer"
    ($x->result[] = @segments[$x->i++])

    and

    // store each even segment reversed and increment the "pointer"
    ($x->result[] = @array_reverse(segments[$x->i++]))

    and

    // check if we need to break out of the loop
    n > $x->i

    or

    // exit and output the result if the above is false
    die(json_encode(
        // if n is odd, the above would have copied a NULL entry 
        // from the segments, so it needs to be filtered out
        array_filter($x->result)
    ))
)

และเวอร์ชันที่ไม่เป็นมิตรที่ตรงกับ regex:

<?php if (@extract([x=>(object)[s=>[],i=>+false]])and@define(n,compact(arg.chr(ord(u)+true))[arg.chr(ord(u)+true)][+true]?:+true)and@define(un,chr(ord(a)-true-true))and@define(s,(a.rray.un.chunk)(range(+true,pow(n,true+true)),n)))while((@compact(x)[x]->s[]=s[@compact(x)[x]->i++])and(@compact(x)[x]->s[]=(a.rray.un.re.chr(ord(u)+true).erse)(s[@compact(x)[x]->i++]))and(n>@compact(x)[x]->i)or(@die((json.un.encode)((a.rray.un.filter)(@compact(x)[x]->s)))))?>


@ JörgHülsermannเนื่องจาก regex ของฉันค่อนข้างยาวเหมือนเดิมและฉันไม่คาดหวังว่าจะมีโอกาสชนะฉันเพียง แต่สันนิษฐานว่าผู้คนจะไม่ถูกแขวนในด้านเทคนิคเช่นความไวของเครื่องมือ regex Anyways, ฉันแก้ไขคำตอบของฉันดังนั้น regex Vในขณะนี้รวมถึงเงินทุน มีความสุข! :)
Ionut Botizan


1
@ JörgHülsermannจริงๆแล้วมันเป็นรหัสเดียวกัน แต่ในตอนแรกฉันใช้การแสดงออกปกติที่คลายเพราะฉันสงสัยว่าโซลูชันอื่น ๆ ที่ผู้คนสามารถคิดได้อย่างไร ฉันจะให้อีกหนึ่งวัน (อาจมีคนต้องการที่จะยิงมันในช่วงสุดสัปดาห์) และฉันจะโพสต์รหัสของฉันและคำอธิบายในคืนพรุ่งนี้ สิ่งที่ฉันสามารถบอกคุณได้ในขณะนี้คือคุณอยู่บนเส้นทางที่ถูกต้องเกี่ยวกับการใช้ค่าคงที่ที่ไม่ได้กำหนดเป็นสตริง นอกจากนี้คุณผิดเกี่ยวกับบางสิ่งบางอย่างในโซลูชันของคุณ คุณสามารถโทร(array_re.chr(ord(u)+true).erse)()! :) (... หรืออย่างน้อยที่สุดที่คุณสามารถทำได้เมื่อ_ได้รับอนุญาต)
Ionut Botizan

3
@IonutBotizan คุณสามารถแก้ปัญหาความลับระดับ 1 ได้ตั้งแต่ตอนนี้เพราะมันร้าว มันยังดีกว่าถ้าคุณทำให้ Level 2 เป็นโพสต์ใหม่มันง่ายกว่าที่คนอื่นจะตรวจสอบว่ามันแคร็กหรือไม่
kennytm

1
ระดับ 2 แตกregex101.com/r/XtVl9G/1ขอบคุณสำหรับคำใบ้ ตอนนี้ฉันกำลังรอระดับ 3 :-)
JörgHülsermann

5

ทับทิม[แตก]

ตำรวจคนแรกและโจรที่ท้าทาย หวังว่าฉันจะไม่ทำให้มันง่ายเกินไป

แก้ไข: แทนที่\g<1>ด้วย(?1)เพราะเห็นได้ชัดว่าเทียบเท่าใน PCRE

Regex (PCRE)

^(\W?\W\w){4}..(?1){2}[(-=Z-~]*(?1){5}\w*(?1)(.)\2$

เอาท์พุท (n = 4)

[[1, 2, 3, 4], [8, 7, 6, 5], [9, 10, 11, 12], [16, 15, 14, 13]]

(ส่งคืนอาร์เรย์ของอาร์เรย์มันเป็นแลมบ์ดา BTW แต่อาจให้มากเกินไปหรือไม่)



4

จาวาสคริปต์(แตก)

ครั้งแรกที่ท้าทายตำรวจและโจรหวังว่าจะทำในสิ่งที่ถูกต้อง

Regex (JavaScript)

^.*(\.\w+\(.*\)){4}$

เอาท์พุต

อาร์เรย์เท่ากับ:

[[1,2,3,4],[8,7,6,5],[9,10,11,12],[16,15,14,13]]

คุณอาจต้องการ a $บนจุดสิ้นสุดของ regex ถ้ารหัสตัวเองสิ้นสุดในตอนท้ายของ regex มิฉะนั้นฉันสามารถทำเช่นx=>x.toString().toString().toString().toString()นั้นแล้วสิ่งที่ฉันต้องการหลังจากนั้น
ETHproductions

@ ETHproductions จุดดีขอบคุณสำหรับเคล็ดลับ!
Tom


1
@ovs ว้าวเร็วมาก เยี่ยมมาก!
Tom

4
@Tom .*จุดเริ่มต้นจะทำให้มันง่ายจริงๆ อาจเป็นโปรแกรมใดก็ได้ตามด้วยความคิดเห็น โดยทั่วไปไม่รวม.*อยู่ใน regex ของคุณ
mbomb007

4

Swift, regex 25 (แคร็ก)

มาดูกันว่าฉันมีปัญหากับเรื่องนี้ไหม นี่เป็นตำรวจและโจรคนแรกของฉันโพสต์ดังนั้นฉันรู้ว่าถ้าฉันทำผิดพลาด!

regex

ฉันใช้ javascript รสใน regex101.com

^.{21}print[^/]{49}o.{7}$

ตัวอย่างผลลัพธ์

[1, 2, 3, 4]
[8, 7, 6, 5]
[9, 10, 11, 12]
[16, 15, 14, 13]

รหัสต้นฉบับ

(0..<n).forEach{i in print((0..<n).map{i%2>0 ?(i+1)*n-$0 :i*n+$0+1},separator:",")}


แต่ดูเหมือนว่ามันส่งนี้ไม่ได้ใช้nเป็น input แต่ต้องมีตัวแปรที่เขียนยาก หากถูกต้องฉันกลัวว่านี่จะไม่ถูกต้องตามฉันทามติของเมตา
Stewie Griffin

หมายเหตุ: คุณอาจเก็บโพสต์ไว้เนื่องจากมันถูกแคร็กแล้ว :)
Stewie Griffin

@Stewie ขอบคุณสำหรับข้อมูลมีเหตุผลที่ฉันหลีกเลี่ยงคำถามประเภทนี้ในอดีต! ฉันคิดว่าฉันเข้าใจแนวคิดของ "แค่ฟังก์ชั่น" ดีขึ้นเล็กน้อยเนื่องจากคำตอบนี้แตก ฉันคิดว่ามันหมายถึงเนื้อความของฟังก์ชั่น แต่ตอนนี้ฉันรวบรวมแล้วมันหมายถึงตัวแปรฟังก์ชัน
James Webster

4

C - regex ความยาว 42 ตัวอักษร - แตก

regex จาวาสคริปต์ที่ใช้ในregex101

^[-h<=*c+m?{printf("\/a: %d\\',o);}]{137}$

คาดเดาสิ่งนี้จะเป็นเรื่องเล็กน้อย ...

> main 4
1   2   3   4
8   7   6   5
9   10  11  12
16  15  14  13
>

เอาต์พุตถูกคั่นด้วยแท็บ\nหลังจากแต่ละบรรทัด

ทางออกของฉันที่นี่จำนวนเต็ม 0-2 ที่ได้รับผ่านทางt-t, t/tและt:

main(int t,char**a){int o=t-t,i=t/t,m,n,h=atoi(*(a+i));for(m=o;m<h;m++)for(n=o;n<h;n++)printf("%d%c",m*h+(m%t?h-n:n+i),n<h-i?'\t':'\n');}

คุณสามารถลบออกได้rใน regex ของคุณ
kennytm

@kennytm - ขอบคุณ - พลาดไปหนึ่งครั้ง


4

เจลลี่ , ความยาว 14 แตก

แตกโดยเดนนิส

[^/P-`mvḊ-ṫ€]*

Python regex

เพิ่มเข้าmมาอีกครั้งหลังจากที่ฉันปล่อยให้มันลื่น

/(ลดอย่างรวดเร็ว);
จากP(ผลิตภัณฑ์) ถึง`(monad จาก dyad quick);
m(การทำดัชนีโมดูโล)
v(eval dyad);
จาก(dequeue) ถึง(หาง); และ
(สำหรับแต่ละฉบับย่อ)

สำหรับอินพุตของ4เอาต์พุตของฉัน:

 1  2  3  4
 8  7  6  5
 9 10 11 12
16 15 14 13

... Gเพราะผมจัดรูปแบบรายการของรายการเป็นตารางด้วย


Cracked นี่เป็นเรื่องสนุก
Dennis

4

Powershell, 23 ไบต์

แคร็กโดยแมตต์

^.+?%.{42}%.{11}:.{35}$

โซลูชันดั้งเดิม:

$n="$args";$script:r=0;$a=1..$n|%{$t=++$script:r..($script:r+=$n-1);if(!($_%2)){[Array]::Reverse($t)};,$t};$a|%{$_-join" "}

รับอินพุตเป็นอาร์กิวเมนต์และเอาต์พุตเป็น stdout

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

ตำรวจคนแรกท้าทายต่อไป

1..4 | % { "----$_----" ; .\snake-cops.ps1 $_  }
----1----
1
----2----
1 2
4 3
----3----
1 2 3
6 5 4
7 8 9
----4----
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13


อะไรคือทางออกของคุณ?
Matt

@Matt เพิ่มฉันคิดว่ามันจะยากขึ้นเมื่อพิจารณาถึงสิ่งที่ไม่ใช่รหัส - กอล์ฟที่ฉันเพิ่มเข้าไปนั่นคือการใช้[Array]::Reverse()แทน$array[9..0]และ$script:rตัวแปรที่ไม่มีความจำเป็นมากที่สุด
colsw

4

Röda 0.12ความยาว 19 (แคร็กโดย @KritixiLithos)

PCRE:

^{(\|[^\/#\s]*){8}$

ตัวอย่างผลลัพธ์ (n = 4):

[1, 2, 3, 4][8, 7, 6, 5][9, 10, 11, 12][16, 15, 14, 13]

รหัสเดิม:

{|n|seq(0,n-1+n%2)|push([{|i|seq(n*i+1,n*i+n)}(_)],[{|j|seq(n*j+n,n*j+1,step=-1)}(_)])|head(n)}

ลองออนไลน์!


1
มันเป็นเกมที่ยุติธรรมตราบใดที่มันท้าทายและมีล่าม (ฟรี) ให้บริการ ครั้งแรกที่ผมพยายาม MATL คือเมื่อพยายามที่จะแตกโพสต์ตำรวจ ไม่ต้องแปลกใจถ้ามีคนเรียนรู้Rödaเพียงจะแตกคำตอบนี้ :)
สตีวีกริฟฟิ

ฉันหวังว่าเอกสารเป็นภาษาอังกฤษ แต่ไม่ฟินแลนด์ :)
สตีวีกริฟฟิ

@StewieGriffin มีเอกสารบางอย่างพร้อมใช้งาน ฉันควรเพิ่มลิงค์ไปยังคำตอบของฉันหรือหาได้ง่ายพอจากหน้า Github?
fergusq


4

PHP 7 (ปลอดภัย)

รหัสต้นฉบับ

for($z=0,$q="";$z<($x=$argv[1])**2;){$w=($d=intdiv($z,$x))%2?($d+1)*$x-$z%$x:($z+1);for($f=0;$f<(log10($x**2)^0)-(log10($w)^0);$f++)$q.="\x20";$q.=++$z%$x?"$w\x20":"$w\n";}print(rtrim($q));

ลองครั้งที่สอง

Regex (PCRE): 29 ไบต์

^[^A-Z#\/\s\>busy_heck]{189}$

ไม่มีพื้นที่ว่างไม่มีความคิดเห็นไม่ใช้ base64_decode

ไม่อนุญาตให้ใช้ฟังก์ชั่นมากมาย! ขีด

เอาท์พุท n = 11

  1   2   3   4   5   6   7   8   9  10  11
 22  21  20  19  18  17  16  15  14  13  12
 23  24  25  26  27  28  29  30  31  32  33
 44  43  42  41  40  39  38  37  36  35  34
 45  46  47  48  49  50  51  52  53  54  55
 66  65  64  63  62  61  60  59  58  57  56
 67  68  69  70  71  72  73  74  75  76  77
 88  87  86  85  84  83  82  81  80  79  78
 89  90  91  92  93  94  95  96  97  98  99
110 109 108 107 106 105 104 103 102 101 100
111 112 113 114 115 116 117 118 119 120 121

เอาท์พุท n = 4

 1  2  3  4
 8  7  6  5
 9 10 11 12
16 15 14 13

เอาท์พุท n = 3

1 2 3
6 5 4
7 8 9

ฉันเชื่อว่าคำตอบของคุณปลอดภัยแล้ว :)
Aaron

@ Aaron ฉันสงสัยว่ามันจะไม่แตก เพิ่มรหัสดั้งเดิมแล้ว
JörgHülsermann

4

MATLความยาว 12 (ปลอดภัย)

regex

ใช้รสชาติหลาม:

(\w{3}\W){5}

ตัวอย่างผลลัพธ์

สำหรับn=4:

 1  2  3  4
 8  7  6  5
 9 10 11 12
16 15 14 13

วิธีการแก้

txU:GeG:oEq*S5M*TTx!

n=4เพื่อดูว่าผลงานนี้พิจารณาการป้อนข้อมูล

tx   % Implicit input n, duplicate, delete. So this does nothing
     % STACK: 4
U    % Square
     % STACK: 16
:    % Range
     % STACK: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]
Ge   % Reshape as an n-row array in column major order
     % STACK: [1  5  9 13;
               2  6 10 14;
               3  7 11 15;
               4  8 12 16]
G:   % Push range [1 2 ... n]
     % STACK: [1  5  9 13;
               2  6 10 14;
               3  7 11 15;
               4  8 12 16]
               [1 2 3 4]
o    % Modulo 2
     % STACK: [1  5  9 13;
               2  6 10 14;
               3  7 11 15;
               4  8 12 16]
              [1  0  1  0]
Eq   % Times 2, minus 1 (element-wise)
     % STACK: [1  5  9 13;
               2  6 10 14;
               3  7 11 15;
               4  8 12 16]
              [1 -1  1 -1]
*    % Multiply (element-wise with broadcast)
     % STACK: [1 -5  9 -13;
               2 -6 10 -14
               3 -7 11 -15
               4 -8 12 -16]
S    % Sort each column
     % STACK: [1 -8  9 -16;
               2 -7 10 -15;
               3 -6 11 -14;
               4 -5 12 -13]
5M   % Push [1 -1 1 -1] again
     % STACK: [1 -8  9 -16;
               2 -7 10 -15;
               3 -6 11 -14;
               4 -5 12 -13]
              [1 -1  1  -1]
*    % Multiply (element-wise with broadcast)
     % STACK: [1  8  9  16;
               2  7 10  15;
               3  6 11  14;
               4  5 12  13]
TTx  % Push [true true] and delete it. So this does nothing
!    % Transpose. Implicitly display
     % STACK: [ 1  2  3  4;
                8  7  6  5;
                9 10 11 12;
               16 15 14 13]

4

เยลลี่ , ความยาว 17 (ปลอดภัย)

[^/P-`mvÇ-ıḃ-ṫ€]*

Python regex

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

/PQRSTUVWXYZ[\]^_`mvÇÐÑ×ØÞßæçðñ÷øþĊċĖėĠġİıḃḄḅḊḋḌḍḞḟḢḣḤḥḲḳḶḷṀṁṂṃṄṅṆṇṖṗṘṙṚṛṠṡṢṣṪṫ€

ภายใต้หนึ่งในสามของพวกเขา!

สำหรับอินพุตของ4เอาต์พุตของฉัน:

 1  2  3  4
 8  7  6  5
 9 10 11 12
16 15 14 13

... เพราะฉันจัดรูปแบบรายการของรายการเป็นกริดด้วย Gเพราะผมจัดรูปแบบรายการของรายการเป็นตารางด้วย

ทางออก:

’:2o1
Ḃ¬aẋ@0
’r0;0ẋ$ẋ1Ŀ¬0¦;2ĿÆ¡œ?⁸²¤s⁸G

ลองออนไลน์! / regex101

เคล็ดลับสำคัญที่นี่คือการดัชนีลงในรายชื่อเรียง lexicographically พีชคณิตของจำนวนธรรมชาติได้ถึงn 2 (ใช้œ?เพื่อหลีกเลี่ยงการสร้างรายชื่อของความยาวn 2 ! ) และจะแยกเป็นชิ้นผลของความยาวn ดัชนีดังกล่าวพบได้จากการสร้างการเป็นตัวแทนในระบบจำนวนแฟคทอเรียลซึ่งเป็นสูตรตั้งแต่งูที่ "ไม่ได้ทำ" ถูกสร้างขึ้นโดยองค์ประกอบที่อนุญาตในลักษณะที่กำหนด (ซึ่งอาจแปลงเป็นตัวเลขได้อย่างง่ายดายÆ¡ )

วิธีแก้ปัญหาที่ฉันนำเสนอใช้Ŀในการอ้างอิงลิงก์ก่อนหน้าเป็น monads (แทนที่ÑและÇ) แต่สามารถใช้หลาย$แถวในแทน "inline" ฟังก์ชันผู้ช่วยเหล่านี้ มันยังใช้rตั้งแต่และRถูกแบน

’:2o1 - Link 1, periodic repetitions in the factorial base representation: n
’     - decrement n
 :2   - integer divide by 2
   o1 - or 1 (keep one period in the cases n=1 and n=2)

Ḃ¬aẋ@0 - Link 2, n zeros if n is even, else an empty list: n
Ḃ      - mod 2
 ¬     - not
   ẋ@0 - 0 repeated n times
  a    - and

’r0;0ẋ$ẋ1Ŀ¬0¦;2ĿÆ¡œ?⁸²¤s⁸G - Main link: n                    e.g. 6
’r0                        - inclusive range(n-1, 0)              [5,4,3,2,1,0]
    0ẋ$                    - 0 repeated n times                   [0,0,0,0,0,0]
   ;                       - concatenate (makes one "period")     [5,4,3,2,1,0,0,0,0,0,0,0]
        1Ŀ                 - call link 1 as a monad               2
       ẋ                   - repeat list                          [5,4,3,2,1,0,0,0,0,0,0,0,5,4,3,2,1,0,0,0,0,0,0,0]
           0¦              - apply to index 0 (rightmost index):
          ¬                -     not (make the last 0 a 1)        [5,4,3,2,1,0,0,0,0,0,0,0,5,4,3,2,1,0,0,0,0,0,0,1]
              2Ŀ           - call link 2 as a monad               [0,0,0,0,0,0]
             ;             - concatenate                          [5,4,3,2,1,0,0,0,0,0,0,0,5,4,3,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0]
                Æ¡         - convert from factorial base          45461852049628918679695458739920
                      ¤    - nilad followed by link(s) as a nilad
                    ⁸      -     left argument, n                 6
                     ²     -     square                           36
                  œ?       - lexicographical permutation lookup   [1,2,3,4,5,6,12,11,10,9,8,7,13,14,15,16,17,18,24,23,22,21,20,19,25,26,27,28,29,30,36,35,34,33,32,31]
                       s⁸  - split into chunks of length n        [[1,2,3,4,5,6],[12,11,10,9,8,7],[13,14,15,16,17,18],[24,23,22,21,20,19],[25,26,27,28,29,30],[36,35,34,33,32,31]]
                         G - format as a grid

4

Pip , regex ความยาว 3 (ปลอดภัย)

การแก้ปัญหาเป็นโปรแกรมเต็มรูปแบบที่ใช้nเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ไม่ใช้แฟล็กบรรทัดคำสั่งใด ๆ

Regex (ทุกรสชาติ)

\w+

ตัวอย่างผลลัพธ์

1 2 3 4 
8 7 6 5 
9 10 11 12 
16 15 14 13 

ทางออกของฉัน

YENsXaPBsPOyY_MUyFi_MUENsXaIiBA1PsPUPODQENsXiXaPBsX_PBsMRVyEI1PsPUPODQENsXiXaPBsX_PBsMy

ลองออนไลน์!

กลยุทธ์

นี่คือรหัสที่เราต้องการเขียน:

Y \,a
F i ,a
 I i%2
  P i*a+_.s M RVy
 E
  P i*a+_.s M y

นั่นคือ:

  • เก็บตัวเลข 1 ผ่านaเข้าy
  • วนซ้ำค่าiจาก 0 ถึงa-1
  • หากiเป็นเลขคี่ให้ทำตรงกันข้ามย้อนกลับให้เพิ่มi*aองค์ประกอบแต่ละรายการเชื่อมช่องว่างให้แต่ละองค์ประกอบแล้วพิมพ์
  • มิฉะนั้นทำสิ่งเดียวกัน แต่ไม่กลับรายการก่อน

ความยากลำบาก

คำสั่งและตัวแปรจำนวนมากใน Pip ใช้ตัวอักษร แต่คำสั่งที่สำคัญบางตัวไม่:

  • ช่วงและช่วงรวม ( ,และ\,)
  • ส่วนใหญ่ดำเนินการทางคณิตศาสตร์ ( +, -, *, %, ++)
  • การมอบหมาย ( :)
  • เราไม่สามารถมีลูปหรือฟังก์ชั่นของร่างกายที่มีมากกว่าหนึ่งคำสั่ง (ที่จะต้อง{})
  • เราไม่สามารถใช้วงเล็บในการบังคับใช้ลำดับความสำคัญ

เราจะแก้ไขข้อ จำกัด เหล่านี้ได้อย่างไร:

  • ENumerate สามารถใช้แทน,; เราต้องการสตริงที่มีจำนวนอักขระที่เราต้องการและเราต้องแยกองค์ประกอบแรกของแต่ละรายการย่อยในโครงสร้างเช่น[[0 "H"] [1 "i"]]เราก็ต้องสตริงที่มีจำนวนตัวอักษรที่เราต้องการและเราต้องแยกองค์ประกอบแรกของแต่ละรายการย่อยในโครงสร้างเช่น
  • เราไม่จำเป็นต้องเพิ่มอะไรเลยถ้าเราสามารถแก้ปัญหาด้วยการFวนซ้ำ
  • เราสามารถกำหนดให้กับyตัวแปรด้วยYดำเนินการ ank
  • เราสามารถทำคณิตศาสตร์ด้วยสตริง: XคือการคูณสตริงและPUsh (หรือPB"push-back") จะเชื่อมสตริงกับสตริงอื่นแทน ในการรับความยาวของสตริงเราทำได้ENแจกแจงและแยกจำนวนที่ถูกต้องจากรายการผลลัพธ์
  • _เราสามารถใช้ฟังก์ชั่นตราบเท่าที่พวกเขาสามารถเขียนเป็นฟังก์ชั่นแลมบ์ดาเดียวแสดงออกโดยใช้

ข้อมูลจำเพาะ

หน่วยการสร้างของโปรแกรมของเรา:

พิสัย

_MUENsXa

ที่map-unpack(_, enumerate(repeat(space, a)))อยู่ใน pseudocode Map-unpack เหมือนกับ Python itertools.starmap: เมื่อได้รับรายชื่อมันจะเรียกใช้ฟังก์ชั่นในรายการของแต่ละรายการย่อย _ส่งคืนอาร์กิวเมนต์แรกดังนั้น_MUเพียงรับไอเท็มแรกของแต่ละรายการย่อย ตัวอย่างเช่นถ้า a = 3:

     sXa  "   "
   EN     [[0 " "] [1 " "] [2 " "]]
_MU       [0 1 2]

... ,aซึ่งเป็นเช่นเดียวกับ

ช่วงรวม

ฉันไม่แน่ใจว่ามีวิธีการinclusive-range(1, a)ในการแสดงออกเพียงอย่างเดียว แต่โชคดีที่เราต้องการเพียงครั้งเดียวเพื่อให้เราสามารถสร้างมันในyตัวแปรในสามขั้นตอน

YENsXaPBs

ใน pseudocode yank(enumerate(repeat(space, a).push-back(space))):

   sXa     "   "
      PBs  "    "
 EN        [[0 " "] [1 " "] [2 " "] [3 " "]]
Y          Store that in y

ถัดไปPOyปรากฏรายการแรกจากทิ้งมันทิ้งy[[1 " "] [2 " "] [3 " "]]

สุดท้าย

Y_MUy

นั่นคือyank(map-unpack(_, y)): แยกองค์ประกอบแรกของแต่ละรายการย่อยและดึงรายการผลลัพธ์กลับเข้าyมา yตอนนี้[1 2 3]อยู่ในขณะนี้

ความยาว

PODQENaPBs

ใน pop(dequeue(enumerate(a.push-back(space))))pseudocode, ความยากลำบากที่นี่ก็คือการระบุเพียงช่วยให้เรามีตัวเลขขึ้นไปแต่เราต้องการlen(a)-1 len(a)ดังนั้นก่อนอื่นเราจะเว้นช่องว่างให้aยาวขึ้นโดยใช้ตัวละครตัวหนึ่งแล้วใช้len-1สายใหม่

      a     "xyz"
       PBs  "xyz "
    EN      [[0 "x"] [1 "y"] [2 "z"] [3 " "]]
  DQ        [3 " "]
PO          3

คณิตศาสตร์

ตอนนี้เรามีวิธีที่จะใช้ความยาวของสตริงเราสามารถใช้สตริงเพื่อทำการคูณและการเพิ่มจำนวน:

PODQENsXaXbPBs
PODQENsXaPBsXbPBs

วิธีแรกคือsXaXbสร้างสตริงของa*bช่องว่างแล้วใช้ความยาวของมัน ที่สองทำsXaPBsXbเพื่อผลักดันสตริงของbช่องว่างไปยังสตริงของaช่องว่างแล้วใช้ความยาวของมัน

ส่วนที่ดีคือผู้ประกอบการทั้งหมดที่เรากำลังใช้ที่นี่ ( PU, PO, PB, DQ, EN, X) สามารถใช้กับ_การรูปแบบการแสดงออกแลมบ์ดา ดังนั้นเราสามารถแมปการแปลงทางคณิตศาสตร์กับช่วงรวมที่เราสร้างไว้ก่อนหน้านี้

นอกจากนี้เรายังต้องตรวจสอบi%2ภายในห่วง iBA1แต่นี้จะสำเร็จได้อย่างง่ายดายด้วยค่าที่เหมาะสมและ:

รวมเข้าด้วยกัน

รหัสเต็มกับบางพื้นที่เพิ่ม:

YENsXaPBs POy Y_MUy              Get \,a into y
F i _MUENsXa                     For i in ,a
 I iBA1                           If i%2=1
  P sPUPODQENsXiXaPBsX_PBs M RVy   Print sPUi*a+_ M RVy
 EI1                              Elseif 1 (using E would cause a parsing problem)
  P sPUPODQENsXiXaPBsX_PBs M y     Print sPUi*a+_ M y

เราได้รับอนุญาตให้ใช้ธงเช่น-S?
Brian McCutchon

คำถาม @BrianMcCutchon ดี: คำตอบคือไม่มี (เนื่องจากไม่ได้เป็นส่วนหนึ่งของรหัสที่อยู่ภายใต้ regex จึงดูเหมือนว่าจะใช้ช่องโหว่นี้ไม่ได้) แก้ไขเพื่อชี้แจง
DLosc

เพื่อให้ห่างไกลฉันมีที่a*bเป็น_V_VRVENCGaRLbPU1, ,aคือ_MUENZGa, aJ" "เป็นaJ_VRVkและa@iเป็นสิ่งที่ต้องการ_V_VRVaZCGiแต่ฉันไม่สามารถค่อนข้างทำงานออกมามีความสำคัญโดยไม่ต้องวงเล็บเลย นอกจากนี้ยังมีแนวคิดที่คลุมเครือที่ฉันจะได้รับการเรียงสับเปลี่ยนของช่วง (สร้างขึ้นโดยใช้เทียบเท่า,(a*a)) และใช้เพื่อเลือกการเรียงสับเปลี่ยนที่ถูกต้องสำหรับแต่ละแถว
Brian McCutchon

@BrianMcCutchon ฉันไม่สามารถแสดงความคิดเห็นในรายละเอียดใด ๆ ได้ แต่ฉันสนุกกับการอัปเดตความคืบหน้าจริงๆ ^ _ ^
DLosc

ฉันคิดว่ามันปลอดภัยแล้ว คุณจะทำอย่างไร
Brian McCutchon

3

CJam, PCRE, ความยาว 8, แคร็ก

^[a-~]*$

ตัวอย่างผลลัพธ์สำหรับ 4:

[[1 2 3 4] [8 7 6 5] [9 10 11 12] [16 15 14 13]]

Cracked ความคิดดี. :) ดูเหมือนจะมีวิธีการมากมายที่ใช้งานได้ฉันสงสัยว่าคุณมีอะไรในใจ
Martin Ender

คำตอบของฉันเป็นไปตามregex ที่เข้มงวดมากขึ้น - ฉันจะแสดงให้มันเห็นเมื่อรอยแตกนั้น!
Lynn

3

CJam, PCRE, ความยาว 9, แตก

^[a-z~]*$

ตัวอย่างผลลัพธ์สำหรับ 4:

[[1 2 3 4] [8 7 6 5] [9 10 11 12] [16 15 14 13]]

ตอนนี้{|}ถูกแบนเช่นกัน



เยี่ยมมาก! คำตอบของฉันนั้นเหมือนกันยกเว้นจะใช้เพียงกลุ่มmeและmqประมาณจำนวนดังนั้นมันจึงมีความยาวมาก (~ 20k ไบต์)
Lynn

3

Mathematica, regex length 11, non-competition , cracked

รสชาติ PCRE:

^[^]@]{49}$

การแก้ปัญหาที่ถูกต้องจะเป็นฟังก์ชั่นที่รับจำนวนเต็มและส่งออกผลลัพธ์เป็นรายการซ้อนเช่น:

{{1, 2, 3, 4}, {8, 7, 6, 5}, {9, 10, 11, 12}, {16, 15, 14, 13}}

Cracked codegolf.stackexchange.com/a/112863/32353
kennytm

@ kennytm โอ้นั่นเป็นคำตอบที่เรียบร้อย ค่อนข้างแตกต่างจากสิ่งที่ฉันมี ฉันจะดูว่าฉันโพสต์ของฉันในภายหลังหรือถ้าฉันเพิ่ม regex ที่เข้มงวดมากขึ้น
Martin Ender

3

tinylisp , regex length 3 ( แตก )

คุณสามารถทดสอบรหัส tinylisp ได้ที่ทดลองใช้ออนไลน์!

Regex (ทุกรสชาติ)

\S+

เวลาไปฮาร์ดคอร์

เอาท์พุต

วิธีการแก้ปัญหากำหนดฟังก์ชั่นที่ใช้อาร์กิวเมนต์จำนวนเต็มเดียวและส่งกลับรายการเช่นนี้ (สำหรับ n = 4):

((1 2 3 4) (8 7 6 5) (9 10 11 12) (16 15 14 13))

รหัสเดิมของฉันใช้ความคิดพื้นฐานที่เหมือนกัน Brian McCutchon เกิดขึ้นสร้างรายชื่อและประเมินพวกเขา นี่คือหนึ่งบรรทัด:

(v(c(h(q(d)))(c(h(q(d')))(c(c(h(q(q)))(c(c()(c(q(arglist))(c(c(h(q(v)))(c(c(h(q(c)))(c(c(h(q(q)))(q(d)))(q(arglist))))()))())))()))()))))(d'(seq-args(c(h(q(start)))(c(h(q(stop)))(c(h(q(step)))())))))(d'(seq(c(c(h(q(accum)))seq-args)(q((i(e(v(h(q(start))))stop)(c(v(h(q(start))))accum)(seq(c(v(h(q(stop))))accum)start(s(v(h(q(stop))))step)step)))))))(d'(f'(c(c(h(q(index)))(c(h(q(size)))seq-args))(q((i(e(v(h(q(index))))size)()(c(seq()start(v(h(q(stop))))step)(f'(a(h(q(1)))index)size(a(v(h(q(stop))))size)(a(v(h(q(start))))size)(s(h(q(0)))step)))))))))(d'(f(q((size)(f'(h(q(0)))size(h(q(1)))size(h(q(1))))))))

ผมใช้วิธีการสร้างและ EVAL เต็มรูปแบบครั้งเดียวในการกำหนดแมโครd'ที่ทำให้คำจำกัดความเหมือนdแต่ใช้อาร์กิวเมนต์ห่อในรายการ: ดังนั้นแทนที่จะคุณสามารถทำได้(d x 42) (d'(x 42))จากนั้นก็จะเป็นเพียงเรื่องของการเขียนรายชื่อใด ๆ ในคำจำกัดความว่าอาจต้องใช้ช่องว่าง: (q(a b))-> ->(c a(q(b)))(c(h(q(a)))(q(b)))


1
Cracked มันไม่ง่ายเลย
Brian McCutchon

2

Python3 ความยาว 162 (แคร็ก!)

regex: ^([^"' #]){24}"(?1){11}i%n(?1){4}2\*n-(?1){4}i%n(?1){10}i\/n(\)\/\/1)(?1){5}(?2)(?1){3}2\*\(i%n\)(?1){4}[int()2\/]{16}for i in range\(j,(?1){4}\]\)(?1){6}\"\*n\)$

โอเคฉันรู้ว่ามันค่อนข้างนาน โชคดีที่มันจะไม่แตกภายในหนึ่งสัปดาห์ ... : 'D

ฉันคิดว่าฉันไม่ได้ทำผิดพลาดทุกที่ที่จะช่วยให้คำตอบของหนี

รูปแบบผลลัพธ์

4:
[1, 2, 3, 4]
[8, 7, 6, 5]
[9, 10, 11, 12]
[16, 15, 14, 13]

รหัสเดิม:n=int(input());j=0;exec("print([int(i%n+1+(2*n-(2*(i%n)+1))*((((i/n)//1+1)/2)//1)+(2*(i%n)+1)*int(int(i/n)/2))for i in range(j,j+n)]);j+=n;"*n)


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