คำนวณก้อนหินกลิ้งลงเขา


17

บทนำ

Sisyphus มีปัญหาในการทำงานเมื่อเร็ว ๆ นี้ ดูเหมือนว่าเขาจะไม่ทำอะไรเลยและเขาก็รักที่จะหาทางแก้ไขปัญหานี้

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

เขารู้สึกหงุดหงิดกับงานของเขามากและต้องการแก้ปัญหาทางวิทยาศาสตร์โดยให้คอมพิวเตอร์จำลองก้อนหินกลิ้งลงมาจากเนินเขา

มันเกิดขึ้นแล้วที่ซิสฟีฟไม่ดีในการเขียนโปรแกรมเป็นพิเศษดังนั้นบางทีคุณสามารถช่วยเขาออกมาได้?

ความท้าทาย

หลังจากการแนะนำที่ไร้สาระนี้เรามาทำธุรกิจ โปรแกรมของคุณจะได้รับภาพประกอบของเนินเขาและก้อนหินซึ่งมีลักษณะคล้ายกับนี้:

#o        
##
###
######
######## 

ซึ่ง#เป็นส่วนหนึ่งของเนินเขาและoเป็นตัวแทนของหิน

ตอนนี้คุณต้องใช้โปรแกรมที่เคลื่อนเลเยอร์ 1 ลงมา ตัวอย่างเช่นผลลัพธ์ข้างต้นควรเป็น:

#        
##o
###
######
######## 

หากมีพื้นที่ในแนวนอนเขาจะม้วนในแนวนอนดังนั้น ...

o
######## 

... นี่จะทำให้หินกลิ้งไปด้านข้าง

 o
######## 

หากมีพื้นที่แนวตั้งหินจะตกลงไปหนึ่งขั้นดังนั้น ...

#o
#
#
##### 

... จะให้ผล ...

#
#o
#
##### 

คุณจะได้รับความกว้างและความสูงของภาพตามลำดับในหนึ่งบรรทัดเหนือภาพ ดังนั้นสมบูรณ์อินพุตตัวอย่างของเราจะมีลักษณะเช่นนี้:

10 5
#o        
##        
###       
######    
######### 

(โปรดทราบว่าช่องว่างที่นี่คือช่องว่างเลือกข้อความและดูสิ่งที่ฉันหมายถึง)

รายละเอียดบางอย่าง

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

  • คุณสามารถสันนิษฐานได้ว่ามีวิธีที่ด้านล่างเสมอดังนั้นการป้อนข้อมูลที่เส้นทาง "บล็อก" อาจทำให้เกิดพฤติกรรมที่ไม่ได้กำหนด

  • คุณสามารถสมมติว่ามีช่องว่างในบรรทัดสุดท้ายเสมอ หินควร "หยุดพัก" ที่นั่นดังนั้นหลังจากเรียกโปรแกรมสองสามครั้งแล้วให้ส่งออกไปยังตัวเองเสมอคุณควรท้ายด้วยหินในบรรทัดสุดท้ายวางพื้นที่ที่เคยอยู่

  • คุณสามารถรับอินพุตในรูปแบบใดก็ได้ที่คุณต้องการ (stdin, file, ... ) คุณต้องโพสต์โปรแกรม WHOLE (ดังนั้นตัวแปรที่เตรียมข้อมูลเบื้องต้นทั้งหมดจะนับเป็นรหัส)

  • \nเส้นจะสิ้นสุดลงด้วย

  • คุณสามารถรับอินพุตตัวอย่างได้ที่นี่ (ให้แน่ใจว่าคุณคัดลอกช่องว่างอย่างถูกต้อง!)

  • นี่คือดังนั้นการส่งการทำงานที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ

  • ผู้ชนะจะได้รับการคัดเลือกในวันที่ 26 กรกฎาคม 2014 คุณสามารถโพสต์โซลูชั่นหลังจากนั้น แต่คุณไม่สามารถชนะได้

หากคุณมีคำถามใด ๆ แจ้งให้เราทราบในความคิดเห็น

มีความสุขในการเล่นกอล์ฟ!


จะมีคอลัมน์ต่อท้ายของช่องว่างเช่นเดียวกับในตัวอย่างสุดท้ายของคุณ? (เพราะคนอื่นไม่มี)
Martin Ender

@ m.buettner ในตัวอย่างสุดท้ายมีเพียง 9 #วินาทีดังนั้นจึงมีหนึ่งช่องว่างท้ายเพราะความกว้างคือ 10 ในกรณีนี้ (หลังจากการทำซ้ำสองสามครั้ง) หินจะวางที่ช่องว่าง (ดังนั้นที่ด้านล่าง มุมขวา)
Christoph Böhmwalder

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

6
พลาดโอกาสที่ดีที่จะเรียกมันว่า "ร็อคแอนด์โรล"
qwr

1
@ แฮ็คเกอร์คุณพูดถูก แก้ไขโดยการลบตัวอักษร: D
Martin Ender

คำตอบ:


35

Regex (.NET, Perl, PCRE, JavaScript, ... รส), 25 ไบต์

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

ดังนั้นนี่คือโซลูชันการเปลี่ยน regex บริสุทธิ์

รูปแบบ (สังเกตพื้นที่ต่อท้าย):

o(( *)\n#*)(?=\2) |o 

เปลี่ยน (หมายเหตุพื้นที่นำหน้า):

 $1o

จำนวนไบต์เป็นผลรวมของทั้งสอง

คุณสามารถทดสอบได้ที่http://regexhero.net/tester/ ตรวจสอบให้แน่ใจว่าได้เลือกจุดสิ้นสุดบรรทัดสไตล์ Unix และ "สงวนการจัดรูปแบบที่วางไว้" เมื่อวาง หากยังไม่สามารถใช้งานได้แสดงว่าคุณยังวางส่วนท้ายของบรรทัดสไตล์ Windows ไว้ การแก้ไขที่ง่ายที่สุดในกรณีนั้นคือการแทนที่\nด้วย\r\nในรูปแบบเพื่อดูว่ามันใช้งานได้

นี่คือฟังก์ชัน ECMAScript 6 ขนาด 48 ไบต์ที่ใช้ฟังก์ชันนี้

f=(s)=>s.replace(/o(( *)\n#*)(?=\2) |o /,' $1o')

ในที่สุดฉันก็มีโปรแกรมจริง มันคือ31 ไบต์ของ Perl (รวมถึงสองไบต์สำหรับpและ0ธงขอบคุณ Ventero สำหรับคำแนะนำ!)

s/o(( *)\n#*)(?=\2) |o / $1o/

หากคุณต้องการทดสอบอย่าบันทึกไว้ในไฟล์เพียงแค่ทำ

perl -p0e 's/o(( *)\n#*)(?=\2) |o / $1o/' < hill.txt

ไม่ทำงานสำหรับฉันโชคไม่ดี (ในผู้ทดสอบออนไลน์) มันขยับหินไปทางขวาเสมอ 40 ไบต์เป็นการเริ่มต้นที่ดีแม้ว่าจะยากที่จะเอาชนะ!
Christoph Böhmwalder

@ แฮ็คเกอร์คุณพูดถูกฉันเพิ่งพบว่ามีปัญหา กำลังแก้ไข ...
Martin Ender

@HackerCow ไม่มีฉันคิดว่ามันใช้งานได้จริง แต่ "รักษารูปแบบ" เขียนทับเส้นสิ้นสุดดังนั้นหากคุณวางของ Windows สไตล์ปลายสายมันไม่ทำงาน (ลองเปลี่ยน\nด้วย\r\n)
มาร์ตินเอนเดอร์

สำหรับฉันแล้วหินไม่ตกลงเมื่อถูกกับกำแพงด้านขวานั่นคือ มันจะจับคู่เมื่อมีพื้นที่ต่อท้ายเท่านั้น
BrunoJ

4
ฉันควรจะเอาชนะสิ่งนี้ได้อย่างไร ทางออกที่ดี
qwr

3

Python - 190

สยองขวัญการแบ่งและการต่อกันพร้อมกับตัวแปรมากเกินไป ฉันแน่ใจว่านี่สามารถเล่นกอล์ฟได้มากกว่านี้ แต่ฉันไม่สามารถนึกถึงฟังก์ชั่นหลามที่ฉลาดได้ในตอนนี้ sการป้อนข้อมูลจะถูกเก็บไว้ในสตริง

r=" "
o="o"
i=s.index(o)
b=i+int(s.split(r)[1])
q=s[:i]+r
x=s[b+3:]
try:
 a=s[b+1:b+3]
 if a[0]==r:s=q+s[i+1:b+1]+o+r+x
 elif a[1]==r:s=q+s[i+1:b+2]+o+x
 else:s=q+o+s[i+2:]
except:1
print(s)

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


3
ดวงตาของฉันเจ็บ +1
Christoph Böhmwalder

2

Ruby, 65/55 ตัวอักษร

คิดว่าฉันจะเห็นว่าการแก้ปัญหานานแค่ไหนที่ไม่เพียงแค่โยน regex กับปัญหา

r=gets p
r[r[(r[k=1+~/o/+x=r.to_i,2]=~/ /||-x)+k]&&=?o]=" "
$><<r

อย่างที่คาดไว้มันไม่สั้นเท่ากับโซลูชัน regex ของ m.buettner - แต่ก็ไม่นานเหมือนกัน

เมื่อใช้การตั้งค่าสถานะของล่ามสิ่งนี้สามารถย่อให้เหลือ 55 ตัวอักษร (53 สำหรับรหัส 2 สำหรับธง):

sub$_[($_[k=1+~/o/+x=$_.to_i,2]=~/ /||-x)+k]&&=?o," "

เรียกใช้รหัสเช่นนี้:

ruby -p0e 'sub$_[($_[k=1+~/o/+x=$_.to_i,2]=~/ /||-x)+k]&&=?o," "' < input

2

HTML JavaScript - 251 ตัวอักษร

( 251หากคุณนับรหัสภายในเครื่องหมายคำพูดเดี่ยวที่อ่านอินพุตและส่งคืนเอาต์พุต359ถ้าคุณนับกล่องอินพุตสตริงอินพุตปุ่ม ฯลฯ192ถ้าคุณนับว่าใช้งานได้)

รหัสกอล์ฟ:

<pre id="i">10 5
#o        
##        
##        
######    
######### </pre><button onclick='i=document.getElementById("i");h=i.innerHTML;if(p=h.
match(/([\s\S]*?)([# ]+)(o *\n)(#+)([\s\S]*)/)){if(p[4].length>p[2].length+1)p[3]=p[3].
replace("o "," o");else{p[3]=p[3].replace("o"," ");p[5]="o"+p[5].substr(1);}p[0]="";
h=p.join("");}i.innerHTML=h;'>Go</button>

http://goo.gl/R8nOIK
คลิก "ไป" ซ้ำแล้วซ้ำอีก
คลิก "ไป" ซ้ำแล้วซ้ำอีก

วิธี

ฉันใช้ String.match () เพื่อแบ่งเนินเขาออกเป็น 5 ส่วนจากนั้นฉันเปลี่ยนหนึ่งหรือสองส่วน ฉันกำลังเรียนรู้ JavaScript ดังนั้นข้อเสนอแนะใด ๆ จะได้รับการชื่นชม

รหัสที่อ่านได้

<pre id="io">10 5
#o        
##        
##        
######    
######### </pre>

<button onclick='

    // get image
    io = document.getElementById("io");
    image = io.innerHTML;

    // break image into five parts
    // 1(10 5\n#         \n##        \n) 2(### ) 3(o     \n) 4(######) 5(    \n######### )
    if (parts = image.match(/([\s\S]*?)([# ]+)(o *\n)(#+)([\s\S]*)/)) {

        // move rock to the right
        if (parts[4].length > parts[2].length + 1)
            parts[3] = parts[3].replace("o ", " o");

        // or move rock down
        else {
            parts[3] = parts[3].replace("o", " ");
            parts[5] = "o" + parts[5].substr(1);
        }

        // return new image
        parts[0] = "";
        image = parts.join("");

        // MAP io:i image:h parts:p
    }
    io.innerHTML = image;
'>Go</button>

1

Python 2 - 289 252 ไบต์

p=raw_input
w,h=map(int,p().split())
m=[p()for a in[0]*h]
j=''.join
f=lambda s:s.replace('o ',' o')
for i,r in enumerate(m):
 x=r.find('o')
 if x+1:y=i;break
if m[y+1][x]=='#':m=map(f,m);x+=1
print w,h
print'\n'.join(map(j,zip(*map(f,map(j,zip(*m))))))

ฉันทำการปรับปรุงที่สำคัญบางอย่าง แต่นี่ก็ยังน่ากลัว สามารถบันทึกได้อีกสองสามไบต์โดยการแปลงเป็น Python 3 แต่ไม่สามารถใช้งานได้

ก่อนอื่นฉันจะพบหิน หากตัวละครด้านล่างทันที'#'ให้แทนที่'o 'ด้วย' o'เช่น เนื่องจากมีการรับประกันว่าจะมีพื้นที่พิเศษในตอนท้ายนี่จะย้ายหินไปทางขวาเสมอ

zip(*m)โดยไม่คำนึงถึงถ้าผมก็ไม่ได้ว่าหรือไม่ผมย้ายตารางทั้งหมดที่มี แล้วฉันจะทำทดแทนของผู้อื่นด้วย'o ' ' o'หากมีช่องว่างทางด้านขวาของหินนั่นหมายความว่าในกริดจริงมีช่องว่างด้านล่างดังนั้นมันจึงถูกย้าย จากนั้นฉันแปลงกลับและพิมพ์


นี่จะไม่ทำให้ตัวอย่างที่ 3 ของ OP สับสนหรือเปล่าซึ่งมีพื้นที่ว่างทางด้านขวาและด้านล่างของหินแล้วเลื่อนเป็นแนวทแยงมุม?
Doorknob

@ หรือมันไม่ควร ฉันย้ายไปทางขวาเท่านั้นหากพื้นที่ด้านล่างเป็น#และฉันจะตรวจสอบก่อนที่จะทำการตรวจสอบเพื่อย้ายในแนวตั้ง
undergroundmonorail

1

Python (201)

import sys
print(input())
g=list(sys.stdin.read())
o='o'
x=g.index(o)
n=x+g.index('\n')+1
try:
 if g[n]==' ':g[n]=o
 elif g[n+1]==' ':g[n+1]=o
 else:g[x+1]=o
 g[x]=' '
except:1
print(*g,sep='',end='')

1

awk, 152

awk 'NR==1{w=$2}{if(NR<=w&&$0~/o/){r=index($0,"o");g=$0;getline;if(index($0,"# ")<=r){sub("o"," ",g);sub(" ","o")}else{sub("o "," o",g)}print g}print}'

อ่านเพิ่มเติม

    awk '
  NR==1{  //If we're at the first line, set the width from the second column in the header.
    width=$2
  }
  {
    if(NR<=width && $0~/o/){   //If not at the bottom, look for the line with the rock.
      rockIndex=index($0,"o"); //Set the position of the rock.
      orig=$0;                 //Remember the current line so we can compare it to the next.
      getline;                 //Get the next line.

      if(index($0,"# ")<= rockIndex){  //Move down: if the rock is on a cliff or on a slope,
        sub("o"," ",orig);             //update the orig so that the rock is removed
        sub(" ", "o")                  //and update the current (first available position).
      }                                         
      else {                           //Move right: if the rock is on flat ground,
        sub("o "," o", orig)           //update the orig so the the rock is advanced.
      }
      print orig                       //Print the line we skipped (but stored      
    }                                  //and updated based on the line we're now on).
    print                              //Print the line we're now on.
  }
'

0

php 485 484 ตัวอักษร

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

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

นี่คือรหัสของฉัน: อินพุตอยู่ในตัวแปรแรก

<?
$a.='10 5
#o         
##       
###       
######    
#########';$b=array();$c=explode("\n",$a);$d=explode(" ",$c[0]);$e=$d[0];$f=$d[1];unset($c[0]);$g=0;foreach($c as $h){$b[$g]=str_split($h);++$g;}for($i=0;$i<$f;++$i){for($j=0;$j<$e;++$j){if($b[$i][$j]=='o'){$k=$j;$l=$i;$b[$i][$j]=' ';}}}if($b[$l+1][$k]!='#'){$b[$l+1][$k]='o';}else if($b[$l+1][$k+1]!='#'){$b[$l+1][$k+1]='o';}else{$b[$l][$k+1]='o';}echo"$e $f\n";for($i=0;$i<$f;++$i){for($j=0;$j<$e;++$j){echo $b[$i][$j];}echo "\n";}

คุณสามารถดูได้ที่นี่ในการใช้งานบนแผ่นจดบันทึก

แก้ไข: เปลี่ยนแผ่นจดบันทึกและรหัสด้านบนเช่นเดียวกับเอาท์พุท 0 แทนที่จะเป็น o ซึ่งทำให้เกิดปัญหาเมื่อฉันพยายามป้อนผลลัพธ์กลับเข้าไปในโปรแกรม แก้ไขทันทีและบันทึกหนึ่งตัวอักษร!


0

Groovy - 263 261 256 ตัวอักษร

แข็งแรงเล่นกอล์ฟ อ่านไฟล์ลงใน String และใช้ฟังก์ชั่นpเพื่อเลียนแบบฟังก์ชั่นString.putAtIndex(index,value):

o="o"
b=" "
s=new File(args[0]).text
z={s.size()-it}
s=s[0..z(2)]
w=s.find(/\n.*?\n/).size()-1
p={i,v->s=s[0..i-1]+v+((i<z(0)-2)?s[i+1..z(1)]:"")}
try{
t=s.indexOf o
i=w+t
j=i+1
x=t+1
(s[i]==b)?x=i:(s[j]==b)?x=j:0
p x,o
p t,b
}catch(Exception e){}
print s

Ungolfed (บ้าง):

o = "o"
b = " "
s = new File(args[0]).text
z = {s.size()-it}
s = s[0..z(2)]
w = s.find(/\n.*?\n/).size()-1

putAtIndex = { i,val -> 
    s = s[0..i-1] + val + ((i<z(0)-2)?s[i+1..z(1)]:"") 
}

try {
    t=s.indexOf o
    i=w+t
    j=i+1
    x=t+1
    // default x as horizontal move
    // check for (a) directly below (b) below and over one
    (s[i]==b) ? x=i : ( (s[j]==b) ? x=j : 0)
    putAtIndex x,o
    putAtIndex t,b
} catch (Exception e) {}
print s

ดี ผมไม่ทราบว่าภาษา แต่ฉันเกือบจะแน่ใจว่าคุณสามารถกำจัด (อย่างน้อย) ไบต์ที่สองถ้าคุณเขียนtry{แทนtry {และแทนcatch(Exception catch (Exception
Christoph Böhmwalder

แน่นอน! ขอบคุณสำหรับบันทึก ....
Michael Easter

0

R, 234

require(stringr)
g=scan(,"")
g=do.call(rbind,strsplit(str_pad(g,m<-max(nchar(g)),"r"),""))
if(g[(x<-which(g=="o"))+1]==" "){g[x+1]="o";g[x]=""}else{if(!is.na(g[x+1])){g[x+(n<-nrow(g))]="o";g[x]=""}}
for(i in 1:n) cat(g[i,],"\n",sep="")

การจัดการสตริงไม่ใช่จุดที่แข็งแกร่งที่สุดของ R

อ่านง่ายขึ้น:

require(stringr) # load package `stringr`, available from CRAN. required for `str_pad`
g=scan("")       # read input from console
g=do.call(       # applies the first argument (a function) to the second argument (a list of args to be passed) 
  rbind,         # "bind" arguments so that each one becomes the row of a matrix
  strsplit(      # split the first argument by the second
    str_pad(g,max(nchar(g)),"r"," "), # fill each row with whitespace
    "")
)
if(g[(x<-which(g=="o"))+1]==" ") { # if the next element down from the "o" is " "...
  g[x+1]="o";g[x]=""               # make it an "o" and replace the current element with ""
} else {
  if(!is.na(g[x+1])) {             # if the next element down is not empty (i.e. out of range)
    g[x+nrow(g)]="o"; g[x]=""      # move "o" right
  }
}
for(i in 1:n) cat(g[i,],"\n",sep="") # print to console

0

C (182)

char b[1024],*x,*n;main(z){read(0,b,1024);n=index(b,10)+1;x=index(n,'o');z=index(n,10)-n;n=x+z+1;if(n[1]){if(*n==32)*n='o';else if(n[1]==32)n[1]='o';else x[1]='o';*x=32;}printf(b);}

หรือถ้าคุณต้องการอ่านรหัส:

char b[1024],*x,*n; //1024 byte buffer hard coded
main(z){
    read(0,b,1024);
    n=index(b,10)+1; //start of line 2
    x=index(n,'o');
    z=index(n,10)-n; //10='\n'
    n=x+z+1; //reusing n
    if(n[1]){ //if not 0
        if(*n==32) //32=' '
            *n='o';
        else if(n[1]==32)
            n[1]='o';
        else
            x[1]='o';
        *x=32;
    }
    printf(b);
}

0

Clojure - 366 ตัวอักษร

โดยไม่ต้อง regex ไฟล์อินพุตที่ต้องการชื่อ "d" แข็งแรงเล่นกอล์ฟ:

(def s(slurp "d"))(def w(-(.length(re-find #"\n.*?\n" s))2))(def t(.indexOf s "o"))(def i(+ t w 1))(defn g[i,j,x,c](cond (= x i) \ (= x j) \o :else c))(defn j[i,j] (loop[x 0](when(< x (.length s))(print(g i j x (.charAt s x)))(recur(inc x)))))(try(cond(= \ (.charAt s i))(j t i)(= \ (.charAt s (inc i)))(j t (inc i)):else (j t (inc t)))(catch Exception e (print s)))

Ungolfed:

(def s (slurp "d"))
(def w (- (.length (re-find #"\n.*?\n" s)) 2))
(def t (.indexOf s "o"))
(def i (+ t w 1))
(defn g [i,j,x,c] (cond (= x i) \ (= x j) \o :else c))

(defn j [i,j] (loop [x 0]
     (when (< x (.length s))
     (print (g i j x (.charAt s x))) (recur (inc x)))))

(try (cond (= \ (.charAt s i)) (j t i)
           (= \ (.charAt s (inc i))) (j t (inc i))
           :else (j t (inc t)))(catch Exception e (print s)))

เรียกใช้ตัวอย่าง (เพียงกรณีเดียวเพื่อความกระชับ):

bash-3.2$ cat d
6 7
#     
#     
#     
## o  
####  
####  
##### 

bash-3.2$ java -jar clojure-1.6.0.jar hill.clj 
6 7
#     
#     
#     
##    
####o 
####  
##### 

ฉันเป็นมือใหม่ ยินดีต้อนรับข้อเสนอแนะ


0

MATLAB, 160

function r(f)
F=cell2mat(table2array(readtable(f)));
m=@(d)mod(d-1,size(F,1));C=find(F=='o');P=find(F==' ');N=min(P(P>C&m(P)>=m(C)));F([C,N])=F([N,C]);
disp(F);

ส่วนที่เจ็บปวดคือไฟล์อินพุต การคำนวณจริงจะมีเพียง 114 ไบต์:

function F=r(F)
m=@(d)mod(d-1,size(F,1));C=find(F=='o');P=find(F==' ');N=min(P(P>C&m(P)>=m(C)));F([C,N])=F([N,C]);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.