Robbers: Crack the regex - ทำงู


20

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


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

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

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

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

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

ผู้ชนะจะเป็นผู้ใช้ที่ส่งผลกระทบมากที่สุด ในกรณีที่เสมอกันจะมีผู้ชนะหลายคน

คำตอบ:


10

เยลลี่ขนาด 9 ไบต์คำตอบแตก@Dennis

²sµUFḤ$¦G

ลองออนไลน์!

ควรถูกต้องแล้ว ฉันต้องคิดใหม่ว่าฉันกำลังทำอะไรอยู่

คำอธิบาย

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

อย่างไรก็ตามเราสามารถสังเกตเห็นว่าเรามีรายการของตัวเลขรวมถึงจำนวนเต็มทั้งหมดจาก 1 ถึงครึ่งของการป้อนข้อมูลที่มีอยู่ในค่าปัจจุบันในเวลานั้น เช่นนี้การทำให้แบนและเพิ่มเป็นสองเท่าทำให้เรามีรายการเลขคู่รวมถึงดัชนีคู่ทั้งหมด (รวมถึงเลขคู่อื่น ๆ ด้วย เป็นไปได้ที่จะใช้จ่ายµเพียงอย่างเดียวเพื่อหลีกเลี่ยงความคลุมเครือในการแยกวิเคราะห์และยังมีอักขระไม่เกิน 9 ตัว

²sµUFḤ$¦G
 s         Split
²          {the list of numbers from 1 to} the square of {the input}
  µ        into a number of pieces equal to {the input};
   U       then reverse
       ¦   the elements at indexes
    F      obtained by flattening the split list
      $    and
     Ḥ     doubling each element in the flattened list;
        G  finally, format it into a grid.         

เอ่อวิธีการ¦ทำงานฆ่าฉันทุกครั้งฉันลองทำเมื่อวานนี้ แต่มีมากกว่าUและตัดสินใจว่ามันไม่ได้ผล
Jonathan Allan

ดีฉันเกือบจะได้มัน แต่ติดอยู่ที่การเลือกองค์ประกอบอื่น ๆ เช่นกัน Fเป็นความคิดที่ดีมาก
ETHproductions

รหัสเดิมของฉันเหมือนกันมากกับสิ่งนี้ ฉันเพียงแค่ใช้แทนJ F
Dennis

@Dennis Oh, J... ฉันได้ลองด้วยLRแต่ใช้ไม่ถึง 11 ไบต์
ETHproductions

9

05AB1E, Emigna

นี่เป็นครั้งแรกที่ฉันใช้ 05AB1E รับความช่วยเหลือเล็กน้อย นั้นน่าสนุก. :)

UXFXLNX*+N2BSR1k_iR}ˆ

ลองออนไลน์

คำอธิบาย:

U                       Assign input to X
 XF                     For N in range(0,X):
   XL                   Push list [1 .. X]
     NX*+               Add N*X to each element of the list
         N2BSR1k_       Super clever way to get N%2:
                            not bool(reversed(str(bin(N))).index('1')) (N%2 is odd)
                 iR}    if N%2 is odd, then reverse the list
                    ˆ   Add row to global array
                        Implicit print

ฉันพบโปรแกรมที่คล้ายกันนี้ด้วยตัวเอง แต่รูปแบบผลลัพธ์แตกต่างกัน:

UXFXLNX*+N2BSR1k_iR}=

ลองออนไลน์

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

ดูประวัติการแก้ไขสำหรับความพยายามสองครั้งก่อนหน้าของฉัน


งานที่ดี! ค่อนข้างคล้ายกับโซลูชันดั้งเดิม
Emigna

5
not bool(reversed(str(bin(N))).index('1'))... ฉันคิดว่านั่นเป็นวิธีที่ไร้สาระที่สุดที่ฉันเคยเห็นใครทำN%2ผ่าตัด
Stewie Griffin

3
@StewieGriffin เมื่อชีวิตให้คุณมะนาว แต่ไม่มีน้ำหรือน้ำตาลคุณเพียงแค่ต้องกินพวกเขาดิบ : D
mbomb007


5

โอห์ม, Nick Clifford

ครั้งแรกที่ฉันพยายาม Ohm
ภาษาที่ดีจริงๆที่ฉันตั้งตาที่จะใช้อีกครั้ง :)

²@┼σ▓_^è?R

คำอธิบาย

²             # square input
 @            # range [1 ... input^2]
  ┼σ          # split in input sized chunks
    ▓         # perform the following block on each element of the array
     _        # current element
      ^è?     # if index is odd
         R    # reverse

ความพยายามครั้งแรกของฉันที่ไม่ทำงานเป็นการเพิ่มอาร์เรย์และ int เป็นไปไม่ได้:

@┼MDR┼+;W

ความพยายามครั้งที่สองของฉันที่ไม่ตรงกับ regex:

²@┼σ▓_^MR

คุณทำอย่างที่ฉันทำ! เยี่ยมมาก!
Nick Clifford

5

05AB1E, Emigna (การส่งครั้งที่ 2)

ครั้งแรกที่ทำงานกับ 05AB1E

VYLUYFYXDˆ+RU

ลองออนไลน์! | การตรวจสอบ Regex

คำอธิบาย

VYLUYFYXDˆ+RU  # Implicit input
V              # Save input to Y
 YL            # Push [1 .. Y]
   U           # Save list to X
    YF         # Repeat Y times:
      YX       # Push Y, then X
        Dˆ     # Add X into the global array (could've used X here instead)
          +    # Push X + Y
           R   # Reverse top of stack
            U  # Save updated list to X
               # Implicit loop end
               # Implicit global array print if stack is empty

งานที่ดี! คุณได้รับการแก้ปัญหาที่ตั้งใจ :)
Emigna

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

ใช่มันเป็นไปไม่ได้ที่จะทำ)เมื่อคุณสามารถใช้อักขระที่ไม่ใช่ตัวอักษรและตัวเลข 2 ตัวเท่านั้น ส่วนที่ยุ่งยากที่นี่หมายถึงการสร้างโปรแกรมให้ใช้ wildcard เพียง 2 ตัวและเรียงตามลำดับ อาจเป็นไปได้ยากขึ้นเล็กน้อยหากไม่มีวิธีแก้ไขปัญหาอื่น ๆ แต่น่าจะมีบางอย่างที่เกี่ยวข้องกับการทำให้งง :)
Emigna

@Emigna สิ่งที่ฉันอยากรู้คือถ้า^\w*..$เป็นไปได้
mbomb007

@ mbomb007: ฉันไม่คิดอย่างนั้น ด้วยกลยุทธ์นี้คุณจะต้องบันทึกผลของการเติมสำหรับซ้ำไปและคุณไม่สามารถใช้สแต็คความหมายนี้ว่าหนึ่งในความต้องการที่จะมาหลังจากที่UV ฉันไม่สามารถคิดวิธีอื่นในการทำโดยใช้สัญลักษณ์ตัวแทนเพียง 2 ตัวในตอนท้าย สามารถทำได้ด้วยสัญลักษณ์แทน 3 ตัว
Emigna

5

CJam , Lynn

esmpmpmeimtmemqmememqicelic
esmpmpmeimememqmlmtmemoc
esmpmpmeimememqmtmtmtmtmeic
esmpmpmeimememqmtmtmtmtmeic
esmpmpmeimeiscic
esmpmpmeimemeimfsic
esmpmpmeisciscimqmtmemeic
esmpmpmeiscimlmqmqmemeic
esmpmpmeimemomqmqmemeic
esmpmpmeisciscimfsimqic
esmpmpmeimeiscic
esmpmpmeisciscimfsimqic
esmpmpmeimemomqmemqmemtmemoc
esmpmpmeiscic
esmpmpmeimemomeimqmeic
esmpmpmeimemeimqmlmtmeic
esmpmpmeimtmtmqmemtmtmeic
esmpmpmeimemomqmqmtmeic
esmpmpmeimemqmqmemeic
esmpmpmeiscimlmqmqmemeic
esmpmpmeiscimqmtmtmtmqmemeic
esmpmpmeimeimemtmqmemeic
esmpmpmeimeiscimlmlmtmlmtic
esmpmpmeimemeimqmlmtmeic
~~

linefeeds ทั้งหมดมีวัตถุประสงค์เพื่อความงามและสามารถลบออกได้โดยไม่ส่งผลกระทบต่อโปรแกรม

ลองออนไลน์!

คำอธิบาย

หลังจากลินน์ลบออก{|}จากรายการของตัวละครที่อนุญาตฉันต้องลองอะไรใหม่ ๆ ปรากฎว่าเรายังสามารถสร้างสตริงโดยพลการและประเมินเป็นโค้ด

อันดับแรกเราต้องรับค่าบางอย่างลงบนสแต็ก ที่มีอยู่เพียงตัว -ins ที่จะผลักดันสิ่งที่ไม่ popping อย่างอื่นเป็นครั้งแรก (และโดยไม่ต้องอ่านอินพุต) เป็นes, และea etฉันแน่ใจว่าคุณสามารถเริ่มต้นจากทั้งหมดนี้ไม่ทางใดก็ทางหนึ่ง แต่ฉันไปด้วยesซึ่งผลักดันการประทับเวลาปัจจุบัน เนื่องจากฉันไม่ต้องการตั้งสมมติฐานใด ๆ เกี่ยวกับมูลค่าที่แท้จริงของมันฉันจึงทำการทดสอบแบบดั้งเดิมด้วยmp(ซึ่งให้0และ1) และทดสอบความเป็นอันดับแรกของค่านั้นอีกครั้งเพื่อให้แน่ใจว่าฉันมี0สแต็คอยู่ 1จะเป็นประโยชน์มากขึ้นเพื่อให้เราคำนวณexp(0)ด้วยและเปิดเป็นจำนวนเต็มกับme iดังนั้นตัวเลขทั้งหมดเริ่มต้นด้วย:

esmpmpmei

ตอนนี้เรามีโอเปอเรเตอร์คณิตศาสตร์จำนวนมากที่ทำงานร่วมกับ:

i    int(x) (floor for positive numbers, ceiling for negative)
me   exp(x)
ml   ln(x)
mq   sqrt(x)
mo   round(x)
mt   tan(x)

นอกจากนี้เรายังสามารถรวมบิวด์อินบางตัวเพื่อฟังก์ชั่นที่ซับซ้อนมากขึ้นของx:

sci     Extract first digit of x and add 48 (convert to string, convert
        to character, convert to integer).
ceui    Convert to character, convert to upper case, convert to integer.
celi    Convert to character, convert to lower case, convert to integer.
mfsi    Get a sorted list of prime factors of x and concatenate them into 
        a new number.
mfseei  Get a sorted list of prime factors, interleave it with 1,2,3,..., and
        concatenate the result into a new number.

ใช้เหล่านี้เราสามารถรับหมายเลขใด ๆ ใน0 <= x < 128(และอื่น ๆ อีกมากมาย) ในเวลาน้อยกว่า 10 1ขั้นตอนจาก ฉันแน่ใจว่าชุดย่อยขนาดเล็กของคำสั่งเหล่านี้จะพอเพียง ฉันได้เขียนโปรแกรม Mathematica ขนาดเล็กเพื่อตรวจสอบตัวอย่างทั้งหมด (มันไม่สามารถอ่านได้มากขอโทษ):

codes = SortBy[
  Select[Nest[Select[DeleteDuplicatesBy[SortBy[Join @@ (Through[{
               List,
               If[1 <= # < 50, {Exp@#, #2 <> "me"}, Nothing] &,
               If[# >= 1, {Log@#, #2 <> "ml"}, Nothing] &,
               If[# > 1, {Sqrt@#, #2 <> "mq"}, Nothing] &,
               {If[# > 0, Floor@#, Ceiling@#], #2 <> "i"} &,
               {Floor[# + 1/2], #2 <> "mo"} &,
               {Tan@#, #2 <> "mt"} &,               
               If[NumberQ@# && # >= 0, {First@
                   ToCharacterCode@ToString@#, #2 <> "sci"}, 
                 Nothing] &,
               If[IntegerQ@# && 
                  32 < # < 65536, {First@
                   ToCharacterCode@
                    ToUpperCase@FromCharacterCode@#, #2 <> "ceui"}, 
                 Nothing] &,
               If[IntegerQ@# && 
                  32 < # < 65536, {First@
                   ToCharacterCode@
                    ToLowerCase@FromCharacterCode@#, #2 <> "celi"}, 
                 Nothing] &,
               If[IntegerQ@# && # > 0, ## & @@ {
                   {FromDigits[
                    "" <> (ToString /@ (f = 
                    Join @@ Table @@@ FactorInteger@#))], #2 <> 
                    "mfsi"},
                   {FromDigits[
                    "" <> (ToString /@ 
                    MapIndexed[## & @@ {#2[[1]] - 1, #} &, f])], #2 <>
                     "mfeesi"}
                   }, Nothing] &
               }@##] &) @@@ #, StringLength@*Last], 
       First], #[[1]] < 1000000 &] &, {{1, "esmpmpmei"}}, 9], 
   IntegerQ@# && 0 <= # < 128 &@*First], First]

ด้วยวิธีนี้เราสามารถผลักดันรายการรหัสอักขระโดยพลการและแปลงให้เป็นอักขระcหลังจากนั้น เมื่อเราผลักรหัสทั้งหมดที่เราต้องการเรียกใช้แล้วเราจะกด95( ]) เรา eval ที่เป็นหนึ่งเดียวกับ~การตัดคนอื่น ๆ ทั้งหมดในสตริงและแล้วเรา eval ~สตริงที่มี

รหัสจริงที่ทำงานในตอนท้ายของโปรแกรมเป็นอีกครั้ง:

ri__2#,:)/2/[1W]f.%:~<p

ดูโซลูชันก่อนหน้าของฉันสำหรับคำอธิบาย


4

Python 3, TuukkaX

ขออภัย regex ที่คุณใช้ง่ายเกินไปไม่สำคัญ ไม่มี0, #หรือ? ไม่มีปัญหา!

ฉันอาจตีความตัวอย่างผลลัพธ์ผิดไป แต่มันก็ค่อนข้างง่ายที่จะปรับแต่งเพราะฉันมีตัวอักษรเหลืออยู่ 45 ตัว

n=int(input())
print(str(n)+":")
x=1-1
exec("print([*range(1+x*n,1+n*-~x)][::(1,-1)[x%2]]);x+=1;"*n)
"no-op:a_string_that_doesnt_actually_matter"

ดี! : D FYI: ฉันจะสร้างอีกอันใน Python ถ้าคุณสนใจที่จะแก้มัน;) มันจะนานกว่านี้นิดหน่อย
Yytsi

4

R มิกกี้

lets_make_a_snake<-function(n)`for`(i,1:n,cat(i*n+1-`if`(i%%2,n:1,1:n),"\n"))

กรณีทดสอบ:

> lets_make_a_snake(4)
1 2 3 4 
8 7 6 5 
9 10 11 12 
16 15 14 13 
> lets_make_a_snake(7)
1 2 3 4 5 6 7 
14 13 12 11 10 9 8 
15 16 17 18 19 20 21 
28 27 26 25 24 23 22 
29 30 31 32 33 34 35 
42 41 40 39 38 37 36 
43 44 45 46 47 48 49 

และการยืนยัน regex: https://regex101.com/r/OB8ZIM/1

ฉันยังมี:

invisible(sapply(1:(n=scan()),function(i)cat(i*n+1-`if`(i%%2,n:1,1:n),"\n")))

ซึ่งจะช่วยให้การส่งออกเดียวกันและตรงกับ regex


6
lets_make_a_snake... ฉันจะประหลาดใจถ้านั่นเป็นวิธีแก้ปัญหาที่ตั้งใจไว้: P
Stewie Griffin

@plannapus งานที่ยอดเยี่ยม คนแรกคือโดยทั่วไปสิ่งที่ผมตั้งใจใช้ ` for` และ ` if` แต่มากแข็งแรงเล่นกอล์ฟดีกว่าฉัน
MickyT


4

Bash, @Marcos M

sort -n <(seq 1 $((n * n)) | xargs -n$n | sed -n 'p;n'; seq $((n * n)) 1 | xargs -n$n | sort -n | sed -n 'n;p')

prettified:

sort -n <(               # feed the stdout of this subshell into stdin for `sort -n`
    seq 1 $((n * n)) |   #   generate 1 2 3 ... n²
        xargs -n$n |     #     add line break every n numbers
        sed -n 'p;n';    #     print only odd lines
    seq $((n * n)) 1 |   #   generate n² ... 3 2 1
        xargs -n$n |     #     add line break every n numbers
        sort -n |        #     reverse all lines (keeping each row decreasing)
        sed -n 'n;p'     #     print only even lines
)

ส่วนแรกของ subcommand จะสร้าง1 2 3 4, 9 10 11 12และส่วนที่สองจะสร้าง,8 7 6 5 16 15 14 13ด้านนอกsort -nจะผสมเข้าด้วยกันอย่างเหมาะสมเพื่อสร้างลวดลายของงู

ฉันใช้เคล็ดลับใน/superuser//a/101760เพื่อพิมพ์บรรทัดคี่และคู่ ขอบคุณ Marcos สนุกดีจริงๆ


ทางออกที่ดีมาก
มิทเชลล์สเปคเตอร์


3

Python 3, @TuukkaX

n=int(input());j=0;exec("print([(j-+i%n-n++2*n-0,j+i%n+1)[1&int(i/n)//1^(0x1)//1]*(2*(i%n)*0+2222222//2222222)for i in range(j,j+n)]);j+=n;"*n)

การวิเคราะห์ regex ของตำรวจเล็กน้อยจะแสดงเทมเพลตคงที่:

________________________"___________i%n____2*n-____i%n__________i/n)//1_____)//1___2*(i%n)____^^^^^^^^^^^^^^^^for i in range(j,____])______"*n)

ที่_เป็นตัวละครใด ๆ ยกเว้น[ '"#]และเป็นใด^[int()2/]

"*n)ที่สิ้นสุดแสดงให้เห็นชัดเจนeval("..."*n)หรือexec("..."*n)ที่เกิดขึ้นดังนั้นเราก็ต้องให้แน่ใจว่า"..."พิมพ์ที่ j แถว

เกินไปใกล้กับจุดสิ้นสุดของสตริงที่เค้าเข้าใจรายการโดยไม่ต้องมีfor i in range(j, ifดังนั้นเราจำเป็นต้องสร้างคอลัมน์ i-th โดยใช้สิ่งเหล่านั้นi%n , 2*nสิ่ง

n = int(input())
j=0
exec("""print([
    (
        j - +i%n - n ++ 2*n - 0,    # equivalent to (n + j - i%n) for the decreasing rows
        j + i%n + 1                 # equivalent to (j + i%n + 1 == i + 1) for the increasing rows
    )[1 & int(i/n)//1 ^ (0x1)//1]   # int(i/n)   ->    get row number 0, 1, 2, 3, ...; 
                                    # 1 & int(i/n)//1    ->    0 for increasing rows, 1 for decreasing rows, 
                                    # 1 & int(i/n)//1 ^ (0x1)//1    ->   flip 0 and 1
    * (2*(i%n)*0+2222222//2222222)  # multiply by the constant 1.
    for i in range(j,j+n)
]); j+=n; "*n)

ดี! ดีเกือบรอดชีวิตสัปดาห์: D ผมจะโพสต์รหัสเดิมของฉัน
Yytsi

3

กระแสตรง , Mitchell Spector

นี่เป็นรายการแรกของฉันที่ท้าทายตำรวจและโจรและฉันสนุกมาก regex จำเป็นต้องมีการจับคู่ที่เรียบง่าย^[^# !]{59}$ซึ่งโดยทั่วไปจะเปลี่ยนงานของฉันเป็นหนึ่งในสนามกอล์ฟโดยไม่ต้องใช้ 3 ตัวอักษรเหล่านั้น ตอนแรกฉันมีปัญหาในการรับต่ำกว่า 60 ไบต์ แต่ฉันแตกในที่สุด

?sN0[AP]sP[ddlN~_2*lN+1-r2%*+1+n32P1+dlN%0=PdlNd*>L]dsLxqqq

ลองออนไลน์!

คำอธิบาย:

รหัสของฉันใช้หนึ่งวงกับ N 2โดยรักษาตัวนับตามศูนย์ (1D) และคำนวณจำนวนที่ต้องพิมพ์ตามแถวเมทริกซ์แถวและคอลัมน์ (r, c) ที่สอดคล้องกัน

ตัวอย่างสิ่งที่ฉันหมายถึงถ้า N = 4:

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

มันดูซับซ้อน แต่ขั้นตอนตัวกลางนั้นมีประโยชน์ นอกจากนี้ฉันได้ลองใช้ 2 ลูปตั้งแต่เริ่มต้น แต่ฉันลงเอยด้วยจำนวนอักขระสูงสุด regex การสร้างตัวเลขในแต่ละการวนซ้ำ (อิงตามศูนย์):

  • ถ้าr % 2 = 0(แถวปกติ)n = (r * N) + c = counter
  • ถ้าr % 2 = 1(แถวกลับด้าน)n = ((r + 1) * N) - c - 1 = counter + N - (2 * c) - 1

หรือทั้งหมดในครั้งเดียวตามหมายเลขหนึ่งตาม: n = counter + ((N - (2 * c) - 1) * (r % 2)); n++

?sN0             # read input, save as N, initialize iteration counter
[AP]sP           # macro 'P' that prints a newline (ASCII code 10 = A)
[                # start loop
    ddlN~        # push N, calculate row and column coordinates:
                 #r = int(counter / N), c = counter % N, '~' calculates both
    _2*lN+1-     # c is on top, so this does: N - (2 * c) - 1
    r2%*+        # now r is on top, do: (r % 2) * (previous result) + counter
    1+n32P       # do: n++, print space (ASCII code 32)
    1+           # increment counter
    dlN%0=P      # call macro 'P' every Nth printed number
    dlNd*>L      # if: N * N > counter, repeat loop
]dsLx            # this saves the loop to macro 'L', then executes it
qqq              # my script was shorter, so I added a bunch of quit commands to
                 #fit the regex limit. Use of comments ('#') was prohibited.

@MitchellSpector นี่คือคำอธิบายของฉัน อย่างที่คุณเห็นเราทั้งสองมีอัลกอริทึมเดียวกันแท้จริงฉันเพียงใช้คำสั่ง~ในการคำนวณดัชนีแถวและคอลัมน์ในครั้งเดียว แต่หนึ่งในความพยายามครั้งก่อนของฉันได้คำนวณแยกจากกันตามที่คุณทำ จิตใจดีคิดเหมือนกัน? :)
seshoumara

1
ใช่มันเป็นอัลกอริทึมเดียวกันจริง ๆ ฉันชอบให้คุณใช้~รหัสย่อ
Mitchell Spector

ฉันคิดว่าคุณสามารถย่อให้สั้นลงหนึ่งไบต์ถ้าคุณใช้เคล็ดลับสแควร์รูทในการทดสอบลูปที่ส่วนท้ายของแมโคร: ?sN0[AP]sP[ddlN~_2*lN+1-r2%*+1+n32P1+dlN%0=PdvlN>L]dsLx tio.run/nexus/ …
Mitchell Spector

@MitchellSpector คุณพูดถูกและฉันสังเกตเห็นเมื่ออ่านคำอธิบายของคุณ แต่แสดงความคิดเห็นในห้องสนทนาแทน
seshoumara

ใช่ฉันเห็นแล้วตอนนี้ฉันยังไม่ได้ดูห้องแชทในเช้านี้
Mitchell Spector

3

PowerShell, ConnorLSW

ร้าว

$mySnakeIndex=1;$seq=1..$args[0];$seq|%{$rowNum=$seq|%{($mySnakeIndex++)};if(!($_%2)){[array]::Reverse($rowNum)};$rowNum-join" "}

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

$a=1..$args[0];$i=1;$a|%{$r=$a|%{($i++)};if(!($_%2)){[array]::Reverse($r)};$r-join" "}

คำอธิบาย

# Initialize a counter that starts at one.
$mySnakeIndex=1
# Save the integer array from 1 to the input value. 
$seq=1..$args[0]
# For each row of the output...
$seq|%{
    # Build the integer array for this row sequentially
    $rowNum=$seq|%{
        # Increase the integer index while sending it down the pipeline
        ($mySnakeIndex++)}
        # Check if this is and odd row. If so reverse the integer array.
        if(!($_%2)){[array]::Reverse($rowNum)}
        # Take this row and join all the numbers with spaces.
        $rowNum-join" "

ดีฉันใช้$scriptตัวแปรและบางอย่างยุ่งวนมากเพื่อคลี่มันออกมามัน[array]::Reverse()ถูกต้องแล้วขอแสดงความยินดี - ฉันคิดว่าคุณอาจต้องการความยาวของ$iและ$MySnakeIndexถึงแม้ว่า
colsw

@ConnorLSW ฉันรู้ว่าคุณจะไม่สามารถนอนหลับได้ในเวลากลางคืนเพราะรู้ว่าฉันมีข้อผิดพลาดในโจร ฉันได้แก้ไขแล้ว
Matt

3

CJam, Lynn

บางสิ่งเช่นนี้

ri
{s}seu~~ci{zs}seu~~c{a}seu~~|~{w}seu~~z{w}seu~~sc~c{z}seu~~{w}seu~~sc~c{w}seu~~z{w}seu~~sc~c~

{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{w}seu~~z{w}seu~~sc~c
{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{w}seu~~z{w}seu~~sc~c
{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{w}seu~~z{w}seu~~sc~c
{s}seu~~c{a}seu~~|
{s}seu~~c{c}seu~~|
{t}seu~~sc{a}seu~~|
{s}seu~~c{a}seu~~|{w}seu~~z{w}seu~~sc~c
{s}seu~~sc{fb}seu~~||
{s}seu~~sc{i}seu~~|
{s}seu~~sc{fb}seu~~||
{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{w}seu~~z{w}seu~~sc~c{z}seu~~{w}seu~~sc~c{w}seu~~z{w}seu~~sc~c
{a}seu~~scs
{w}seu~~
{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{z}seu~~{w}seu~~sc~c
{fb}s{b}s{w}seu~~sc~
{s}seu~~sc{ee}seu~~||
{s}seu~~sc{z}seu~~|{w}seu~~{w}seu~~sc~{w}seu~~{w}seu~~sc~
{t}seu~~sc{a}seu~~|
{~}s{}s{w}seu~~sc~
{t}seu~~sc{c}seu~~|

{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{z}seu~~{w}seu~~sc~c~
s~
p

ช่องว่างทั้งหมดมีไว้สำหรับ ... "การอ่านได้" ... และสามารถละเว้นเพื่อให้สอดคล้องกับ regex ของ Lynn

ลองออนไลน์!

คำอธิบาย

regex ต้องการให้เราแก้ปัญหาโดยใช้เพียง:

  • อักษรตัวพิมพ์เล็ก
  • {}ซึ่งสามารถใช้เพื่อสร้างบล็อก
  • |ส่วนใหญ่ใช้สำหรับค่าบิตหรือ
  • ~, "eval" และ bitwise NOT (เช่น "dump array" แต่ฉันจะไม่ใช้มัน)

เนื่องจากเรามี~ถ้าเราสามารถสร้างสตริงโดยพลการเราสามารถเรียกใช้รหัสโดยพลการ อย่างไรก็ตามในตอนแรกมันไม่ชัดเจนว่าจะทำอย่างไร

ส่วนแรกของปริศนาคือบล็อกเป็นรหัสที่ไม่มีการประเมินค่าซึ่งสามารถเปลี่ยนเป็นสตริงsได้ ดังนั้นจะช่วยให้เรา{abc}s "{abc}"ต่อไปเราสามารถใช้euในการแปลงสตริงเหล่านี้เป็นตัวพิมพ์ใหญ่

{abc}seu  e# gives "{ABC}"

ประโยชน์ของสิ่งนี้คือตัวอักษรตัวพิมพ์ใหญ่เป็นตัวแปรที่กำหนดค่าเริ่มต้นไว้ล่วงหน้าเพื่อให้เราได้รับค่าคงที่จำนวนมากโดยการสร้างสตริงดังกล่าวและประเมินมันสองครั้ง (หนึ่งครั้งเพื่อเปลี่ยนสตริงกลับเป็นบล็อกและอีกครั้งเพื่อ ดำเนินการบล็อกนั้น) เราไม่สามารถรับตัวอักษรทั้งหมดได้เพราะบางคนไม่ชอบxคำสั่งที่ถูกต้อง (ดังนั้น CJam จะปฏิเสธที่จะแยกวิเคราะห์บล็อกที่มีพวกเขา) เราไม่สามารถใช้fตามที่เป็นอยู่ได้เพราะจะต้องปฏิบัติตามคำสั่งอื่น แต่เราสามารถใช้fbและจากนั้นหรือทั้งสองค่าเข้าด้วยกัน ในทำนองเดียวกันเราสามารถใช้แทนee eกับที่เราจะได้รับหมายเลข0, -1, 3และเพื่อ10 19-1จะสะดวกเพราะถ้าเราทำให้มันกลายเป็นสตริง ( "-1") แล้วเป็นตัวอักษร ('-) จากนั้นประเมินมันเราสามารถลบหรือตั้งความแตกต่างได้ เช่นฉันกล่าวว่าเราไม่สามารถรับX(ต่อด้วย1) แต่เราสามารถใช้ค่าสัมบูรณ์ของ-1ด้วยz

นอกจากนี้เรายังสามารถใช้sเพื่อรับสตริงที่มีช่องว่างและใช้cเพื่อเปลี่ยนเป็นอักขระช่องว่าง:

{s}seu~~c

สิ่งนี้สะดวกเนื่องจากจากนั้นเราสามารถรับคำสั่งที่มีประโยชน์มากมายในช่วง ASCII ที่ต่ำกว่าโดยการใช้พื้นที่ที่มีตัวเลขต่าง ๆ ในการรับอักขระบางตัวเหนือจุดรหัส48เราใช้อักขระ'0เป็นพื้นฐานแทน:

{t}seu~~si

นี่เพียงพอแล้วที่จะสร้างสตริงเองเนื่องจากเราสามารถรับ'+(การเพิ่มและการต่อสตริง) จากตัวอย่างต่อไปนี้:

{s}seu~~c{b}seu~~|

และเรามีตัวอักษร 1เพื่อให้เราสามารถผลักอักขระอวกาศเพิ่มขึ้นตามค่าที่เราต้องการจากนั้นต่อมันเข้าด้วยกัน แต่นั่นน่าเบื่อนิดหน่อยและรหัสจะใหญ่ขึ้น

แต่ฉันได้สร้าง[และ]evalled พวกเขาเพื่อให้ตัวละครทั้งหมดที่ฉันกดเข้าไปถูกห่อเป็นสตริงโดยอัตโนมัติ นั่นคือสองบรรทัดนี้:

{s}seu~~ci{zs}seu~~c{a}seu~~|~{w}seu~~z{w}seu~~sc~c{z}seu~~{w}seu~~sc~c{w}seu~~z{w}seu~~sc~c~

...

{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{z}seu~~{w}seu~~sc~c~

และสุดท้ายเราจะต้องการfและ~ในสตริงที่เรากำลังสร้าง ในขณะที่มันเป็นตัวอักษรที่ใช้ได้แล้วเราไม่มีตัวอักษรสตริงหรือตัวอักษรดังนั้นเราจึงต้องสร้างสิ่งเหล่านี้เช่นกันและการสร้างจุดโค้ดขนาดใหญ่จากพื้นที่นั้นค่อนข้างน่ารำคาญ แต่ฉันได้ใช้การตั้งค่าการลบที่นี่ แต่ลบสองช่วงตึก (เพื่อกำจัด{}):

{fb}s{b}s{w}seu~~sc~
...
{~}s{}s{w}seu~~sc~

นั่นคือทั้งหมดที่มีอยู่ เรา[ประเมิน เราผลักดันตัวละครทั้งหมดที่ได้จากการคำนวณหลายอย่างจากค่าคงที่ในตัวที่เรามี|, -(ผ่านทาง eval) และ+(ผ่านทาง eval) เรา]ประเมิน เราแผ่ทุกสิ่งลงในสตริงเพราะในบางครั้งฉันเพิ่มสตริงหรือตัวเลขลงในรายการ เราประเมินสตริงของเราเองด้วย~สตริงโดยพลการของเราด้วย

ri...pเป็นส่วนหนึ่งของโปรแกรมสุดท้ายจริง ๆ แต่ฉันได้แยกออกมาเพราะพวกเขาไม่ต้องการการเข้ารหัส

ในที่สุดนี่คือโปรแกรมที่เรากำลังใช้งานจริง:

ri___*,:)/2/[1-1]f.%:~<p

ri      e# Read input and convert to integer.
__      e# Make two copies.
_*      e# Square the last copy.
,       e# Turn into range [0 1 ... n^2-1].
:)      e# Increment each to get [1 2 ... n^2].
/       e# Split into chunks of length n, creating a square.
2/      e# Split into pairs of lines.
[1-1]   e# Push [1 -1].
f.%     e# Use this to reverse the second line in each pair. If n was odd,
        e# this will pair a -1 with the last line.
:~      e# Flatten the pairs back into the square.
<       e# Truncate to n lines to get rid of that extraneous -1 for odd inputs.
p       e# Pretty-print.

3

tinylisp , @DLosc

(v(c(h(q(d)))(c(h(q(f)))(q((c(q(n))(q((g(v(h(q(n))))(s(v(h(q(n))))(v(h(q(1)))))())))))))))(v(c(h(q(d)))(c(h(q(mod)))(q((c(c(h(q(x)))(q(y)))(q((i(l(v(h(q(x))))(v(h(q(y)))))x(mod(s(v(h(q(x))))(v(h(q(y)))))y))))))))))(v(c(h(q(d)))(c(h(q(range)))(q((c(c(h(q(x)))(c(h(q(y)))(c(h(q(z)))(q(w)))))(q((i(l(times(v(h(q(z))))(v(h(q(x))))(v(h(q(0)))))(times(v(h(q(z))))(v(h(q(y))))(v(h(q(0))))))(range(v(h(q(x))))(s(v(h(q(y))))(v(h(q(z)))))z(c(s(v(h(q(y))))(v(h(q(z)))))w))w)))))))))(v(c(h(q(d)))(c(h(q(times)))(q((c(c(h(q(x)))(c(h(q(y)))(q(acc))))(q((i(l(v(h(q(x))))(v(h(q(0)))))(times(s(v(h(q(0))))(v(h(q(x)))))(s(v(h(q(0))))(v(h(q(y)))))acc)(i(e(v(h(q(x))))(v(h(q(0)))))acc(times(s(v(h(q(x))))(v(h(q(1)))))y(a(v(h(q(y))))(v(h(q(acc))))))))))))))))(v(c(h(q(d)))(c(h(q(g)))(q((c(c(h(q(n)))(c(h(q(w)))(q(r))))(q((i(l(v(h(q(w))))(v(h(q(0)))))r(g(v(h(q(n))))(s(v(h(q(w))))(v(h(q(1)))))(c(i(e(v(h(q(0))))(mod(v(h(q(w))))(v(h(q(2))))))(range(a(v(h(q(1))))(times(v(h(q(w))))(v(h(q(n))))(v(h(q(0))))))(a(a(v(h(q(1))))(times(v(h(q(w))))(v(h(q(n))))(v(h(q(0))))))n)1())(range(a(times(v(h(q(w))))(v(h(q(n))))(v(h(q(0)))))n)(times(v(h(q(w))))(v(h(q(n))))(v(h(q(0)))))(s(v(h(q(0))))(v(h(q(1)))))()))r)))))))))))

ลองออนไลน์!

ฟังก์ชันนี้กำหนดฟังก์ชันfที่ส่งคืนคำตอบ นอกจากนี้ยังพิมพ์ชื่อของฟังก์ชั่นที่ฉันกำหนดให้ stdout แต่ฉันคิดว่ามันไม่สำคัญเนื่องจาก [เราได้รับอนุญาตให้เลือกสตรีมเอาท์พุทของเรา] สำหรับโค้ดกอล์ฟอย่างน้อย หากเป็นเรื่องใหญ่ฉันคิดว่าฉันสามารถปรับแต่งเพื่อไม่ให้พิมพ์ออกมาได้ ฉันจะทำอย่างไร ฉันเริ่มต้นด้วยสิ่งที่ค่อนข้างมาตรฐาน:

(d f (q ((n)
  (g n (s n 1) ()))))

(d mod (q((x y)
  (i (l x y) x
    (mod (s x y) y)))))

(d range (q((x y z w)
  (i (l (times z x 0) (times z y 0))
    (range x (s y z) z (c (s y z) w))
    w))))

(d times (q ((x y acc)
  (i (l x 0) (times (s 0 x) (s 0 y) acc)
  (i (e x 0) acc
    (times (s x 1) y (a y acc)))))))

(d g (q ((n w r)
  (i (l w 0) r
    (g n (s w 1)
       (c (i (e 0 (mod w 2))
             (range (a 1 (times w n 0)) (a (a 1 (times w n 0)) n) 1 ())
             (range (a (times w n 0) n) (times w n 0) (s 0 1) ()))
          r))))))

จากนั้นฉันสังเกตว่าสามารถแปลงนิยามฟังก์ชันเช่นนี้:

(d mod (q ((x y) (body))))

กลายเป็น

(v(c(h(q(d)))(c(h(q(mod)))(q((c(c(h(q(x)))(q(y)))(q((body)))))))))

และฟังก์ชั่นการโทรเช่นนี้:

(a x y)

กลายเป็น

(a(v(h(q(x))))y)

ฉันใช้มาโคร Vim แบบเรียกซ้ำนี้ซึ่งเก็บอยู่ในรีจิสเตอร์qเพื่อทำอันที่สอง (ฉันjkแมปกับ<Esc>):f s(v(h(q(jkea))))jk@q ):

การแปลงทั้งสองนี้เพียงพอที่จะกำจัดช่องว่างทั้งหมด


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

@DLosc เรียบร้อยฉันโพสต์ที่นั่น
Brian McCutchon

2

Swift, @James Webster

{n in for j in 0..<n{print((1...n).map{j%2==0 ?$0+j*n:j*n+n+1-$0})}} as(CShort)->()

การยืนยัน: https://regex101.com/r/7ukrM0/1


ฉันได้รับ "การแสดงออกถึงการแก้ไขในฟังก์ชั่นที่ไม่ได้ใช้" ด้วยตัวเอง แต่ฉันไม่คุ้นเคยกับทุกสิ่งที่ทำให้คำตอบที่ยอมรับได้ เป็นเช่น `ให้ a = <code>; (ที่ CShort (4)); ต้องการให้มันทำงานไม่จำเป็นหรือไม่
James Webster

@ JamesWebster ฉันไม่แน่ใจเกี่ยวกับกฎที่แน่นอนเนื่องจาก "a code" ค่อนข้างคลุมเครือ สำหรับcode-golfการส่งสามารถเป็นโปรแกรมหรือฟังก์ชั่นได้ดังนั้นฉันจึงมีฟังก์ชันที่ไม่ระบุชื่อที่นี่ เราจะได้รับข้อโต้แย้งการป้อนข้อมูลได้อย่างไร
kennytm

ต้นฉบับของฉันคือร่างกายของฟังก์ชันดังนั้นฉันจึงไม่แน่ใจว่าของฉันจะถูกต้องเช่นกัน! ดังนั้นฉันจะไปกับ "แน่นอนนี่เป็นเรื่องดี" และโหวตขึ้น :)
James Webster

@JamesWebster คุณสามารถเรียกทุกอย่างได้(…)(4)โดยไม่จำเป็นต้องใช้ตัวอักษรจำนวนเต็มถึง CShort
kennytm

ใช่แล้ว! ฉันจะไม่คิดอย่างนั้น
James Webster

2

PHP, @ JörgHülsermann

<?=(function($n,$snake){foreach(array_chunk(range(1,$n*$n),$n)as$i=>$a){if($i%2)$a=array_reverse($a);echo"\n",join('',array_map(function($e){return(sprintf("%3d",$e));},$a));}})($argv[1],'-=-=-=-=-=-=-=-=-=-=-=-=-=-o~')?>

221 ไบต์ยาวเกินไป (เช่นงู) และการขาดช่องว่างสามารถแก้ไขได้โดยง่าย

prettified:

<?=
(
    function($n, $snake) {
        foreach (array_chunk(range(1, $n*$n), $n) as $i => $a) {
            if($i % 2)
                $a = array_reverse($a);
            echo "\n", join('', array_map(function($e) {
                return (sprintf("%3d", $e));
            }, $a));
        }
    }
)($argv[1], '-=-=-=-=-=-=-=-=-=-=-=-=-=-o~')
?>

ตัวแปรที่ดี ความผิดของฉันคือไม่คิดถึงฟังก์ชั่นและสร้างเอาต์พุตเพียงเอาต์พุตเดียว
JörgHülsermann

2

เยลลี่, ความยาว 12, @JonathanAllan

Ḷ-*m@"s@²$G

ลองออนไลน์!

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

Ḷ-*m@"s@²$G  Main link. Argument: n

Ḷ            Unlength; yield [0, ..., n-1].
 -*          Yield [(-1)**0, ..., (-1)**(n-1)].
         $   Combine the two links to the left into a chain.
        ²    Yield n².
      s@     Split [1, ..., n²] into chunks of length n.
   m@"       Take the lists to the right modulo the units to the left, 1 being
             normal order and -1 being reversed.

2

Jellyขนาด 12 ไบต์แตกคำตอบที่สองของ JonathanAllan

²sµ;@/€FḤ$¦G

ลองออนไลน์!

คำอธิบาย

นี่เกือบจะเหมือนกับคำตอบอื่น ๆ ของฉันคำตอบอื่นฉันเพิ่งทำการเปลี่ยนแปลงสองครั้ง:

ก่อนอื่นฉันเปลี่ยนU("ย้อนกลับแต่ละองค์ประกอบ") เป็นṚ€("ย้อนกลับ" "แต่ละองค์ประกอบ") นั่นไม่ได้ช่วยตัวเองเพราะถูกแบนเช่นกัน

จากนั้นฉันเปลี่ยน("ย้อนกลับ") เป็น;@/( /"พับโดย" ;"เรียงต่อกัน" @"ตามลำดับตรงกันข้ามกับรายการเดิม") นั่นเป็นการหลีกเลี่ยงตัวอักษรที่ถูกแบนทั้งหมด, ให้ทางออกที่ถูกต้อง

ฉันคิดว่าขั้นตอนต่อไปคือการเริ่มต้นการห้ามใช้อาเรย์อย่างรวดเร็วนอกเหนือไปจากอะตอม


เอ่อฉันรู้ว่าฉันควรห้าม...
Jonathan Allan

คุณสามารถเขียนในแง่ของ/เกินไป มันค่อนข้างละเอียดกว่าโซลูชันนี้

ใช่และเป็นไปได้อย่างหนึ่ง;@\ṫ0regex กำลังจะยาวขึ้น
Jonathan Allan

2

เยลลี่, ความยาว 13, @JonathanAllan

1r-*Nm@"s@²$G

ลองออนไลน์!

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

1r-*Nm@"s@²$G  Main link. Argument: n

1r             Range 1; yield [1, ..., n].
 -*            Yield [(-1)**1, ..., (-1)**n].
   N           Negate each unit.
           $   Combine the two links to the left into a chain.
          ²    Yield n².
        s@     Split [1, ..., n²] into chunks of length n.
     m@"       Take the lists to the right modulo the units to the left, 1 being
               normal order and -1 being reversed.

โอ้เดี๋ยวก่อนฉันคิดถึงmอะไรเหรอ!
Jonathan Allan

2

นั่นน่าประทับใจ: D
Jonathan Allan

ขอบคุณ! :) ด้วยเหตุผลบางอย่างฉันมั่นใจว่ารหัสของฉันไม่สามารถมีบรรทัดใหม่ใด ๆ ซึ่งบังคับให้ฉันค้นพบกลอุบายลูกโซ่
Dennis

2

สกาลา @ สบู่

def g(n:Int) = {
    var vec = Vector.fill(0)(Vector.fill(0)(1))
    for (p <- 1 to n) {
        var vec2 = Vector.fill(0)(1)
        for (q <- (p-1)*n+1 to p*n) {
            vec2 = vec2 ++ Vector(q)
        }
        if (p%2==1) vec = vec ++ Vector(vec2)
        else vec = vec ++ Vector(vec2.reverse)

    }
    println(vec)
}

ยังไม่ได้สัมผัสกับสกาล่าในชั่วขณะหนึ่งมันสนุกที่ได้กลับมาอีกครั้ง น่าเสียดายที่โซลูชันนี้พลาดไม่ได้กับฟีเจอร์เด็ด ๆ ของ Scala

ลองที่นี่

การยืนยัน Regex


2

QBasic (QB64), @DLosc

โปรดทราบว่าเนื่องจากบรรทัด.ไม่ตรง\n(U + 000A, LF) บรรทัดใหม่ที่นี่คือ\r(U + 000D, CR)

INPUT N:ZERO=N-N:ONE=N/N:FOR I=ZERO TO N-ONE:FOR J=ONE TO N:IF ZERO=I MOD(ONE+ONE)THEN PRINT I*N+J;ELSE PRINT I*N+N-J+ONE;REM
NEXT:PRINT:NEXT

ตรวจสอบ:

>>> re.match('^([A-Z]+.)+$', 'INPUT N:ZERO=N-N:ONE=N/N:FOR I=ZERO TO N-ONE:FOR J=ONE TO N:IF ZERO=I MOD(ONE+ONE)THEN PRINT I*N+J;ELSE PRINT I*N+N-J+ONE;REM\rNEXT:PRINT:NEXT')
<_sre.SRE_Match object; span=(0, 141), match='INPUT N:ZERO=N-N:ONE=N/N:FOR I=ZERO TO N-ONE:FOR >

;ปัญหาหลักคือวิธีการแทรกคำหลัง โชคดีที่ QB64 ถือว่า CR เป็นบรรทัดใหม่ในขณะที่ regex ของ Python ไม่ได้ทำดังนั้นเราสามารถส่งต่อREM\rที่นี่ได้ จากห้ารสชาติที่ได้รับอนุญาตของ regex

ดังนั้นรอยแตกนี้ใช้ได้ตราบใดที่เราไม่พูดถึง JavaScript ... 🤐


ฉันจะยอมรับสิ่งนี้เพราะมันใช้งานได้ใน QB64 อย่างไรก็ตามฉันจะบอกว่าQBasic ของarchive.org (ซึ่งฉันคิดว่าเป็น QBasic จริง ๆ มากกว่าการจำลอง) บ่นเกี่ยวกับการREMติดตามข้อความทันทีโดยไม่มีตัวคั่นคำสั่ง โซลูชันดั้งเดิมของฉันไม่ได้ใช้ความคิดเห็น ฉันมีรูปแบบอื่นที่ฉันจะโพสต์ในไม่ช้า : D
DLosc



1

C, @Yimin Rong

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

โปรแกรมไม่สามารถมีตัวเลข แต่เราสามารถรับตัวเลขผ่าน:

  1. cที่รู้จักกันทั่วไปว่า "argc" ซึ่งมักจะเป็น 2
  2. +และ-ที่มีอยู่เพื่อให้เราสามารถสร้าง 0 พร้อมด้วยn-nและสร้าง o=c;--o1

ปัญหาเล็กน้อยรุ่นตำรวจถูกคั่นด้วยแท็บซึ่งต่างจากการปรับพื้นที่ให้เหมาะสม แต่ไม่มีปัญหา

1

Ruby, @Value Ink

->n{(1..n).map{|r|x=(r*n-n+1..r*n).to_a;if(r.modulo(2)==1)then(x)else(x.reverse)end}}#1-2-3-4-5-6--

[(-=Z-~]* หมายถึง "ฉันสามารถเขียนอะไรก็ได้ที่ฉันชอบ :)"


อาฉันสับสนว่าฉันไม่ได้
Value Ink

1

tinylisp, @DLosc

ทางออกที่ตรงไปตรงมามากและไม่เพิ่มประสิทธิภาพทั้งหมด :)

(d p(q((m n)(s m(s(s 1 1)n)))))(d j(q((f g)(i(l f g)(c f(j(p f 1) g))()))))(d r(q((f g)(i(l f g)(c(s g 1)(r f(s g 1)))()))))(d k(q((m o f g n)(i(l n g)()(c(m f(p f n))(k o m(p f n)(p g 1) n))))))(d f(q((n)(k j r 1 1 n))))

(disp (f 4))เรียกว่าเป็น

  • (p m n)คำนวณ m + n โดยใช้การลบs(m + n == m - ((1 - 1) - n))
  • (j f g) สร้าง (f f+1 f+2 ... g-1)
  • (r f g) สร้าง (g-1 g-2 g-3 ... f)
  • (k m o f g n)สร้างงูแถวหนึ่งของเมทริกซ์งูจากนั้นจึงวนซ้ำแถวถัดไปจนกระทั่งสร้างแถว n แถว ข้อโต้แย้งm, oถูกเปลี่ยนตัวโดยj/ rการสร้างการเพิ่มหรือลดแถว ข้อโต้แย้งf,gกำลังเรียกใช้ดัชนีที่จะทราบว่าแถวที่เราอยู่ใน
  • (f n)สาย(k j r 1 1 n)เพื่อเริ่มรุ่น

การทำงานที่ดี. (BTW มันเป็นเรื่อง(f 4)disp
งี่เง่า

1

PHP, @Iut Botizan

ในขณะนี้ฉันไม่มีความคิดที่ดีกว่าในการถอดรหัสโซลูชันเดิม

รองรับ n <= 15

เป็นครั้งแรกที่ฉันใช้ getopt อาจไม่ใช่ความคิดที่ดีที่สุดในการใช้ตัวเลือกเป็นอินพุต

เริ่มจากบรรทัดคำสั่งเช่นนี้

php hack.php -a=4

Regex ดั้งเดิม

ระดับ 1:

^<[^'"\d{vV;<$]+$

การรวมกันของตัวอักษรที่ดีมาก รู้สึกอิสระที่จะลงคะแนนด้ายตำรวจ

มันบล็อกฉันฟังก์ชั่นเช่น - strrev - array_reverse - get_defined_vars

https://regex101.com/r/5rGTnw/2

ระดับ 2:

^<[^'"\d{v;<$_~|&A-Z]+$

https://regex101.com/r/XtVl9G/1

วิธีการแก้

 <?php
    error_reporting(~E_NOTICE)&
    define(A,a.chr(E_COMPILE_ERROR-E_NOTICE+E_WARNING))
    &define(B,getopt(A,[])[a])&print_r(array_chunk(
    array_slice(
    array_merge(
    range(E_ERROR,B)
    ,range(E_WARNING*B,E_ERROR+B)
    ,range(E_WARNING*B+E_ERROR,(E_WARNING+E_ERROR)*B)
    ,range(E_PARSE*B,+E_ERROR+(E_WARNING+E_ERROR)*B)
    ,range(E_PARSE*B+E_ERROR,(E_PARSE+E_ERROR)*B)
    ,range((E_PARSE+E_WARNING)*B,+E_ERROR+(E_PARSE+E_ERROR)*B)
    ,range((E_PARSE+E_WARNING)*B+E_ERROR,(E_NOTICE-E_ERROR)*B)
    ,range(E_NOTICE*B,+E_ERROR+(E_NOTICE-E_ERROR)*B)
    ,range(E_NOTICE*B+E_ERROR,(E_NOTICE+E_ERROR)*B)
    ,range((E_NOTICE+E_WARNING)*B,E_ERROR+(E_NOTICE+E_ERROR)*B)
    ,range((E_NOTICE+E_WARNING)*B+E_ERROR,(E_NOTICE+E_WARNING+E_ERROR)*B)
    ,range((E_NOTICE+E_PARSE)*B,E_ERROR+(E_NOTICE+E_WARNING+E_ERROR)*B)
    ,range((E_NOTICE+E_PARSE)*B+E_ERROR,(E_NOTICE+E_PARSE+E_ERROR)*B)
    ,range((E_CORE_ERROR-E_WARNING)*B,E_ERROR+(E_NOTICE+E_PARSE+E_ERROR)*B)
    ,range((E_CORE_ERROR-E_WARNING)*B+E_ERROR,(E_CORE_ERROR-E_ERROR)*B)
    )
    ,B-B,B*B
    ),B)
    )
    ?>

ระดับ 2:

<?php
define(aa,a.chr(ord(strtoupper(a))-ord(h)+ord(a)))and
define(bb,getopt(aa,[])[a])and
define(us,chr(ord(a)-true-true))and
(prin.t.(us).r)(
(arra.y.(us).chunk)(
(arra.y.(us).slice)(
(arra.y.(us).merge)(
range((ord(b)-ord(a)),bb)
,range((ord(c)-ord(a))*bb,(ord(b)-ord(a))+bb)
,range((ord(c)-ord(a))*bb+(ord(b)-ord(a)),((ord(c)-ord(a))+(ord(b)-ord(a)))*bb)
,range((ord(e)-ord(a))*bb,+(ord(b)-ord(a))+((ord(c)-ord(a))+(ord(b)-ord(a)))*bb)
,range((ord(e)-ord(a))*bb+(ord(b)-ord(a)),((ord(e)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(e)-ord(a))+(ord(c)-ord(a)))*bb,+(ord(b)-ord(a))+((ord(e)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(e)-ord(a))+(ord(c)-ord(a)))*bb+(ord(b)-ord(a)),((ord(e)-ord(a))-(ord(b)-ord(a)))*bb)
,range((ord(e)-ord(a))*bb,+(ord(b)-ord(a))+((ord(e)-ord(a))-(ord(b)-ord(a)))*bb)
,range((ord(e)-ord(a))*bb+(ord(b)-ord(a)),((ord(e)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(e)-ord(a))+(ord(c)-ord(a)))*bb,(ord(b)-ord(a))+((ord(e)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(e)-ord(a))+(ord(c)-ord(a)))*bb+(ord(b)-ord(a)),((ord(e)-ord(a))+(ord(c)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(e)-ord(a))+(ord(e)-ord(a)))*bb,(ord(b)-ord(a))+((ord(e)-ord(a))+(ord(c)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(e)-ord(a))+(ord(e)-ord(a)))*bb+(ord(b)-ord(a)),((ord(e)-ord(a))+(ord(e)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(q)-ord(a))-(ord(c)-ord(a)))*bb,(ord(b)-ord(a))+((ord(e)-ord(a))+(ord(e)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(q)-ord(a))-(ord(c)-ord(a)))*bb+(ord(b)-ord(a)),((ord(q)-ord(a))-(ord(b)-ord(a)))*bb)
)
,bb-bb,bb*bb
),bb)
)
?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.