คลื่นคู่ - อนุภาคคู่ทางโปรแกรม


30

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในสายอักขระบรรทัดเดียวแบบไม่มีเงื่อนไข สตริงทั้งจะเป็นศูนย์หรือมากกว่าช่องว่างตามระยะเวลาหนึ่ง (เป็นอนุภาค ) เช่น.หรือ         ., หรือสตริงจะเป็นลำดับที่หนึ่งหรือสลับไปข้างหน้าและทับกลับ (เป็นคลื่น ) ที่สามารถเริ่มต้นด้วยคนใดคนหนึ่งเช่น เป็น\หรือหรือ/\/\/\/\/\/\/\/

ไม่ว่าในกรณีใดก็ตามให้แพร่กระจายอนุภาค / คลื่นไปทางขวาทีละหนึ่งหน่วย

โดยเฉพาะอย่างยิ่งในกรณีของอนุภาคให้แทรกช่องว่างไว้ก่อนหน้า.แล้วย้ายที่เดียวไปทางขวาแล้วส่งออกสตริงผลลัพธ์ ตัวอย่างเช่น:

.→การ .
 .→การ  .
  .→การ   .
   .→การ    .
    .→การ     .
     .→การ      .
      .→การ       .
       .→การ        .

ในกรณีของคลื่นให้ผนวกอย่างใดอย่างหนึ่ง/หรือ\อย่างเหมาะสมเพื่อให้คลื่นยังคงสลับกันและความยาวจะเพิ่มขึ้นทีละหนึ่งแล้วจึงส่งออกสตริงผลลัพธ์ ตัวอย่างเช่น:

/→การ/\
\→การ\/
/\→การ/\/
\/→การ\/\
/\/→การ/\/\
\/\→การ\/\/
/\/\→การ/\/\/
\/\/→การ\/\/\

ในทั้งสองกรณีเอาต์พุตอาจไม่มีช่องว่างต่อท้าย แต่ขึ้นบรรทัดใหม่ที่เป็นทางเลือกได้รับอนุญาต

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
เดนนิส

คำตอบ:


16

C, 69 ไบต์

p;f(char*s){p=s[strlen(s)-1]^46;p^=p?93:3022856;printf("%s%s",s,&p);}

สิ่งนี้ต้องใช้เครื่องจักรเล็ก ๆ น้อย ๆ และส่งออกไปยังเทอร์มินัลที่รองรับรหัสหลบหนี ASCII

p=s[strlen(s)-1]^46 คว้ารหัส ASCII ล่าสุดของสตริงอินพุตและ XORs ด้วยรหัส ASCII ของจุด

p^=p?93:3022856จะทำให้เกิดการpที่จะเป็นp^93หากรหัส ASCII ไม่ได้เป็น (ด้านหลัง) เฉือนที่p^46^93 == p^115ซึ่งจะสลับไปมาระหว่างกลับมาและทับ ถ้าpเป็นจุดมันแทนจะเป็น3022856ซึ่งเป็นเล็ก ๆ น้อย ๆ "\b ."สำหรับ

printf("%s%s",s,&p);พิมพ์สตริงอินพุตตามด้วยจำนวนเต็มpตีความว่าเป็นสตริงไบต์ little-endian


1
นี่คืออัจฉริยะบริสุทธิ์
Leun Nun

คุณสามารถบันทึกหนึ่งไบต์โดยแทนที่3022856ด้วย'. \b'ตัวอักษรหลายไบต์ตามตัวอักษร คำตอบที่ยอดเยี่ยม!
เควนติน

มีใครบ้างที่มีรุ่นของรุ่นนี้ที่ไม่ได้ใช้ stdlib :)
TylerY86

12

เยลลี่ , 17 14 ไบต์

ṪO*2.ị“ .\/\”ṭ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

ṪO*2.ị“ .\/\”ṭ  Main link. Argument: s (string)

Ṫ               Tail; pop and yield the last character.
 O              Ordinal; map “./\” to [46, 47, 92].
  *2.           Elevate the code point to the power 2.5.
                This maps [46, 47, 92] to [14351.41, 15144.14, 81183.84].
     ị“ .\/\”   Index into that string.
                Jelly's indexing is modular, so this takes the indices modulo 5,
                which gives [1.41, 4.14, 3.84].
                Also, for a non-integer index, ị retrieves the elements at both
                adjacent integer indices (1-based). Here, these are [1, 2], [4, 5],
                and [3, 4], so we get " .", "/\", or "\/".
             ṭ  Tack; append the characters to the popped input string.

7

CJam, 16 ไบต์

l)_'.={S\}"\/"?|

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

l                 Read a line from STDIN.
 )_               Shift out the last character and copy it.
   '.=            Compare the copy with a dot.
              ?   If the last character is a dot:
      {S\}            Push " " and swap the dot on top.
          "\/"    Else, push "\/".
               |  Perform set union, ordering by first occurrence.
                    " " '.  | -> " ."
                    '/ "\/" | -> "/\"
                    '\ "\/" | -> "\/"

1
หมายเหตุถึงตนเอง: เรียนรู้วิธีการตั้งค่าการรวมสหภาพ นี่น่าจะเป็นที่ที่ไบต์ส่วนใหญ่ถูกบันทึกไว้เมื่อเทียบกับของฉัน
Zwei

6

Python ขนาด 41 ไบต์

lambda s:[s+'\/'[s[-1]>'/'],' '+s][s<'/']

casework ' ', '.', '/', '\'ใช้เรียงลำดับ สำหรับช่องว่างและระยะเวลาเตรียมช่องว่าง มิฉะนั้นผนวกเครื่องหมายทับขวาหรือเครื่องหมายทับขวาตรงข้ามกับอักขระตัวสุดท้าย


5

งูหลาม44 42 ไบต์

lambda s:s[:-1]+"\/ /\."[-ord(s[-1])&3::3]

แทนที่อักขระตัวสุดท้ายด้วยชุดชุดอักขระสองตัวที่สอดคล้องกัน ลิงค์ ideone

(-2 bytes ด้วยฟังก์ชั่นการทำแผนที่ที่สั้นกว่าของ @ xsot)


-ord(s[-1])&3ยังให้ 3 ดัชนีที่แตกต่างกัน
xsot

@xsot โอ้ดีฉันไม่ได้คิด&!
Sp3000

ไม่มีมส์ครั้งนี้เหรอ? : '(
ThreeFx


5

เป็นกลุ่ม27 การกดแป้น 23

คำตอบที่เป็นกลุ่มแรกไม่เคยใช้เป็นกลุ่มเลยแม้แต่นิดเดียว

A/<esc>:s#//#/\\<cr>:s#\./# .<cr>

มันทำงานอย่างไร: มันจะผนวก a /ท้ายบรรทัด, subs //for /\, subs ./สำหรับ .


คุณสามารถหลีกเลี่ยงการหลบหนี/ถ้าคุณใช้ตัวคั่นs#//#/\\ อื่น
m-chrzan

ขอบคุณฉันไม่มีความคิดอะไรเลยที่มีอยู่จริง
มะนาวที่ถูกทำลายได้

4

MATL , 19 ไบต์

t47<?0w}'\/'yO)o)]h

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

t        % Input string implicitly. Duplicate
47<      % Are entries less than 47 (i.e dot or spaces)?
?        % If all are
  0      %   Push a 0. When converted to char it will be treated as a space
  w      %   Swap, so that when concatenated the space will be at the beginning
}        % Else
  '\/'   %   Push this string
  y      %   Duplicate the input string onto the top of the stack
  O)     %   Get its last element
  o      %   Convert to number    
  )      %   Use as (modular) index to extract the appropripate entry from '\/'
]        % End
h        % Concatenate string with either leading 0 (converted to char) or
         % trailing '\'  or '/'. Implicitly display

3

CJam, 35 26 25 ไบต์

บันทึกแล้ว 9 ไบต์ขอบคุณเดนนิส

บันทึกอีก 1 ไบต์ขอบคุณเดนนิส

q:I'.&SI+IW='/=I'\+I'/+??

ลองออนไลน์!

น่าจะเป็นสนามกอล์ฟไม่ดี แต่ฉันไม่คุ้นเคยกับ CJam มากเกินไป อาจเป็นวิธีที่ดีกว่าในการตรวจสอบว่าองค์ประกอบอยู่ในอาร์เรย์หรือไม่ แต่ฉันไม่พบผู้ประกอบการใด ๆ

คำอธิบาย:

q:I e# take input
'.& e# push union of input and ".", effectively checking if input contains it
SI+ e# push string with space in beginning
IW='/= e# push 1 if the last chsaracter in the input is /
I'\+ e# push the input with a \ appended
I'/+ e# push the input with a / appended
? e# ternary if to select correct /
? e# ternary if to select final result

1
Wเป็นครั้งแรก-1และ?ทำงานได้ทั้งกับบล็อกและรายการสแต็กอื่น ๆ ดังนั้นคุณสามารถลดรหัสของคุณเป็นq:I'.#)SI+IW='/=I'\+I'/+??
Dennis

1
&เพื่อทดสอบว่าตัวละครที่เป็นสตริงคุณสามารถตัดพวกเขาด้วย
เดนนิส

ฉันแย่มากที่ CJam lol
Zwei


2

C, 85 ไบต์

j;f(char*n){j=strlen(n)-1;printf("%s%s",n[j]<47?" ":n,n[j]==46?n:n[j]==47?"\\":"/");}

Ideone

ฉันไม่ได้นอนประมาณ 20 ชั่วโมงรหัสของฉันอาจจะเล่นกอล์ฟได้มาก



2

Matlab, 74 71 62 57 ไบต์

@(s)[s(1:end-1) ' .'+(s(1)>46)*'/.'+(s(end)>47)*[45 -45]]

มันคำนวณตัวละครสองตัวสุดท้ายตามs(1)(ตัวอักษรตัวแรก) - เพื่อตรวจสอบว่าเรากำลังจัดการกับ\/กรณีและตัวละครตัวสุดท้ายที่s(end)จะทำให้ tuple ที่ถูกต้องสำหรับ\/ตัวละคร


2

เรติน่า 19 ไบต์

\.
 .
/$
/\^H
\\$
\/

^Hหมายถึง BS ไบต์ ลองออนไลน์!


ทำไมต้องเป็นอักขระ backspace
Robert Fraser

หากไม่มีมันการแทนที่ครั้งต่อไปจะตรงกับเครื่องหมายแบ็กสแลช ยกตัวอย่างเช่นการป้อนข้อมูลจะกลายเป็น/ /\/
เดนนิส

2

> <> , 47 ไบต์

i:0(?\
*=?$r\~:1[:"./ \/"{=?@r=?$r~~]:48
l?!;o>

ลองออนไลน์!

บรรทัดแรกคือมาตรฐาน> <> อินพุตลูป บรรทัดที่สองเลือกอักขระที่เหมาะสมจาก/ \เพื่อผนวกเข้ากับสตริงโดยยึดตามอักขระอินพุตล่าสุด นอกจากนี้หากอักขระอินพุตสุดท้ายคือ a .องค์ประกอบสองอันดับแรกจะถูกสลับ ในที่สุดเนื้อหาสแต็กจะถูกพิมพ์แบบย้อนกลับ


2

JavaScript, 79 70 65 58 ไบต์

(a,b="/\\/",i=b.indexOf(a[a.length-1]))=>i<0?" "+a:a+b[i+1]

1
แทนที่b.charAt(i+1)ด้วยb[i+1]เพื่อบันทึกบางไบต์ นอกจากนี้ยังใช้ไม่ได้กับทุกกรณีทดสอบ \/ยกตัวอย่างเช่น '/ \'
user2428118

@ user2428118 ขอบคุณแก้ไขข้อผิดพลาดและรหัสสั้นลง!
kamoroso94

1
เริ่มต้นbและiเป็นพารามิเตอร์ที่มีค่าเริ่มต้น: (a,b=...,i=...)=>เพื่อหลีกเลี่ยงreturn
charlie

อ่าใช่ฉันลืมเกี่ยวกับคุณสมบัติใหม่นั้น ยังสามารถที่จะลบได้{ }เช่นกันเพราะด้วยเหตุนี้
kamoroso94

ในความเป็นจริงมีขั้นตอนอีกไม่กี่คุณจะมาบรรจบกันที่จะตอบของ @ TylerY86
ชาร์ลี


2

Haskell, 46 45 44 ไบต์

f z@(x:_)|x<'/'=' ':z|x<'0'='\\':z|1<2='/':z

ใช้ประโยชน์จากความจริงที่ว่า< .< /< 0< \ในตาราง ASCII ที่จะบันทึกไบต์ที่สอง


1

Python 2, 72 ไบต์

lambda x:x[:-1]+(" .","\/","/\\")[ord(x[-1])/46+(-1,1)[ord(x[-1])%46>0]]

ความช่วยเหลือในการเล่นกอล์ฟมากขึ้นจะได้รับการชื่นชมอย่างมาก

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


1

SQF, 91

การใช้รูปแบบฟังก์ชั่นเป็นไฟล์:

s=_this;switch(s select[(count s)-1])do{case".":{" "+s};case"\":{s+"/"};case"/":{s+"\"};}

โทรมา "STRING" call NAME_OF_COMPILED_FUNCTION


1

Perl, 30 + 1 ( -p) = 31 ไบต์

s/\./ ./,s|/$|/\\|||s|\\$|\\/|

ความต้องการ-pและ-M5.010หรือ-Eเพื่อทำงาน:

perl -pE 's/\./ ./,s|/$|/\\|||s|\\$|\\/|' <<< ".
  .
    .
/
/\/" 

การดำเนินการท้าทายตรงไปตรงมา (โปรดทราบว่า||ระหว่างสอง regex ล่าสุดorนั้นอาจยากต่อการอ่านดังนั้นทั้งสาม regex จึงเป็น: s/\./ ./และs|/$|/\\|และs|\\$|\\/|)



1

PowerShell v2 +, 59 58 52 51 ไบต์

param($n)(" $n","$n/","$n\")['.\/'.IndexOf($n[-1])]

รับอินพุต$nทิ้งการดำเนินการดัชนีอาร์เรย์ เราเลือกองค์ประกอบของอาร์เรย์ขึ้นอยู่กับดัชนี['.\/'.IndexOf($n[-1])- คือขึ้นอยู่กับตัวอักษรตัวสุดท้ายของท่าน$nนี้จะมีผลใน0, หรือ1 2ที่สอดคล้องกับสตริงที่เหมาะสมของอาร์เรย์ ไม่ว่าในกรณีใด ๆ สตริงผลลัพธ์จะถูกทิ้งไว้บนไปป์ไลน์และการพิมพ์นั้นมีความหมายโดยนัย

กรณีทดสอบ

PS C:\Tools\Scripts\golfing> 0..7|%{' '*$_+'.'}|%{"$_ => "+(.\wave-particle-duality.ps1 "$_")}
. =>  .
 . =>   .
  . =>    .
   . =>     .
    . =>      .
     . =>       .
      . =>        .
       . =>         .

PS C:\Tools\Scripts\golfing> '/,\,/\,\/,/\/,\/\,/\/\,\/\/'-split','|%{"$_ => "+(.\wave-particle-duality.ps1 "$_")}
/ => /\
\ => \/
/\ => /\/
\/ => \/\
/\/ => /\/\
\/\ => \/\/
/\/\ => /\/\/
\/\/ => \/\/\

1

C #, 80 63 ไบต์

s=>{var c=s[s.Length-1];retu‌​rn c<'/'?" "+s:c>'/'?s+"/":s+"\\‌​";}

คุณช่วยให้มันทำงานโดยใช้การแสดงออกแลมบ์ดาได้ไหม
TylerY86

s=>{var c=s[s.Length-1];return c<'/'?" "+s:c>'/'?s+"/":s+"\\";}63 dotnetfiddle.net/8x79az
TylerY86

s=>{var c=s[s.Length-1];return c<47?' '+s:s+(c>47?'/':'\\');}61 dotnetfiddle.net/ykKIL1
TylerY86

เพิ่มผู้แข่งขัน 46 ไบต์สำหรับคุณ :)
TylerY86

1

รหัสเครื่อง ARM บน Linux, 50 ไบต์

การถ่ายโอนข้อมูล Hex:

b580 1e41 f811 2f01 2a00 d1fb 3901 780b 1a0a 4601 2001 2704 df00 2000 a103 2202 f013 0303 2b03 4159 df00 bd80 2e202f5c 5c2f

โพสต์แรกที่นี่หวังว่าฉันทำถูกแล้ว นี่คือชุดประกอบแบบ 32 บิตโดยเฉพาะ Thumb-2 สตริงอินพุตเป็นสตริงที่สิ้นสุดด้วย NUL ที่ใช้ในถึง r0 เอาต์พุตจะถูกพิมพ์ไปยัง stdout ใน C-syntax ต้นแบบของฟังก์ชั่นจะเป็นโมฆะ func_name (สตริง * char) มันเป็นเรื่องร้องเรียนของ AAPCS (การประชุมเรียก ARM) หากไม่สามารถลบได้ 2 ไบต์

นี่คือการประกอบที่เทียบเท่าโดยมีความคิดเห็นอธิบายสิ่งที่เกิดขึ้น:

    @Input: r0 is char* (the string)
    @Output: Modified string to console
    push {r7,lr} @Save r7 and the link register
    subs r1,r0,#1 @Make a copy of the char*, subtracting because we're
    @going to pre-increment.
    loop: @This loop is a little strlen routine
            ldrb r2,[r1,#1]! @In C-syntax, r2=*++r1;
            cmp r2,#0
            bne loop
    @Now r1 points to the null character that terminates the string
    subs r1,r1,#1 @Make r1 point to the last character
    ldrb r3,[r1] @Load the last character into r3
    subs r2,r1,r0 @r2=length(r0) - 1;
    mov  r1,r0 @r0 holds the original char*
    movs r0,#1 @1 is the file descriptor for stdout
    movs r7,#4 @4 is write
    swi #0

    @Now all the characters from the initial string have been printed,
    @except for the last one, which is currently in r3.

    movs r0,#1 @1 is stdout, have to reload this since the system call
    @returns in r0.
    adr r1,msg @Load msg into r1 (the pointer to the string)
    movs r2,#2 @We're going to print two more characters.

    @Now the bit magic. The ascii codes for '\', '.', and '/' map onto
    @0, 2, and 3 when bitwise anded with 3 (0b11).
    @This will be the offset into our string. However, since we must print
    @2 characters, we need our offsets to be 0, 2, and 4.
    @Therefore, we only set the carry if our value is >=3, then add with
    @carry (adcs). Thus we get the correct offset into the string msg.
    ands r3,r3,#3
    cmp r3,#3 @Sets carry if r3>=3
    adcs r1,r1,r3 @Add the offset to r1
    swi #0 @Make the system call
    pop {r7,pc} @Return and restore r7
msg:
    .ascii "\\/ ./\\" @The three different sequences of 2 characters that
    @can go at the end.

1

ECMAScript 6/2558 (JavaScript), 41 ไบต์

s=>s<'/'?' '+s:s+'\\/'[s.slice(-1)>'/'|0]

จับนีลได้ดี


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

ปรับคำตอบแล้ว
TylerY86

ทำไมไม่+(s+1)?
Neil

s<'/'ยังดีกว่า
Neil

1

R, 119 ไบต์

a=scan(,"");if((q=strsplit(a,"")[[1]][nchar(a)])=="."){cat(" ",a,sep="")}else{s=switch(q,"/"="\\","/");cat(a,s,sep="")}

Ungolfed:

a=scan(,"")
if((q=strsplit(a,"")[[1]][nchar(a)])==".")
    cat(" ",a,sep="")

else
s=switch(q,"/"="\\","/")
cat(a,s,sep="")

1

SED, 41 36 27

บันทึกแล้ว 7 ขอบคุณ charlie

 s|\.| .|;s|/$|/\\|;t;s|$|/|

ใช้การทดแทน 3 รายการ:
s/\./ ./เพิ่มช่องว่างหากมี a .
s|/$|/\\|, s|$|/|เพิ่มเครื่องหมายสแลชที่เหมาะสมสำหรับการ
ใช้งานปลายทาง|แทนการใช้/ตัวคั่น

t สาขาไปยังจุดสิ้นสุดถ้า regex ที่สองตรงกันดังนั้นจะไม่เพิ่มเครื่องหมายทับอื่น ๆ


ฉันเพิ่งมาถึงวิธีแก้ปัญหาที่เกือบจะเหมือนกัน: s/\./ ./;s./$./\\.;t;s.$./.- มันคือ 27 ไบต์ การทดแทนที่ 3 นั้นง่ายขึ้นและในระบบของฉัน-reไม่จำเป็นต้องใช้ นอกจากนี้ฉันใช้.แทน#การอยู่ในพื้นที่อินพุต ; o)
charlie

1

Turtlèd , 32 ไบต์ (ไม่ใช่การแข่งขัน)

l!-[*+.r_]l(/r'\r)(\r'/)(." .")$

คำอธิบาย:

[implicit]                       first cell is an asterisk

l                                move left, off the asterisk, so the '[*+.r_]' loop runs
 !                               take input into string var, char pointer=0, 1st char
  -                              decrement char pointer, mod length input             

   [*    ]                       while current cell isn't *:
     +.                          increment string pointer, and write the pointed char
       r_                        move right, write * if pointed char is last char, else " "

          l                      move left

           (/    )               if the current cell is /
             r'\r                move right, write /, move right

                  (\   )         If the current cell is \
                    r'/          move right, write /

                        (.    )  If the current cell is .
                          " ."   Write " .", the first space overwriting the existing '.'

                               $ Program won't remove leading spaces when printing

    [implicit]                   Program prints grid after finishing execution

1

Java 7, 76 ไบต์

String c(String i){return i.contains(".")?" "+i:i+(i.endsWith("/")?92:'/');}

ตรงไปตรงมาสวย

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

class M{
  static String c(String i){
    return i.contains(".")
            ? " " + i
            : i + (i.endsWith("/")
                    ? 92
                    : '/');
  }

  public static void main(String[] a){
    System.out.println(c(" ."));
    System.out.println(c("  ."));
    System.out.println(c("   ."));
    System.out.println(c("    ."));
    System.out.println(c("     ."));
    System.out.println(c("      ."));
    System.out.println(c("       ."));
    System.out.println(c("        ."));
    System.out.println(c("/"));
    System.out.println(c("\\"));
    System.out.println(c("/\\"));
    System.out.println(c("\\/"));
    System.out.println(c("/\\/"));
    System.out.println(c("\\/\\"));
    System.out.println(c("/\\/\\"));
    System.out.println(c("\\/\\/"));
  }
}

เอาท์พุท:

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