สร้างภาพเคลื่อนไหวกรรไกร!


21

ลองสร้างภาพเคลื่อนไหวกรรไกรศิลปะ ASCII แบบง่าย ๆ !

ท้าทาย

อินพุตทั้งหมดจะเป็นจำนวนเต็ม -31 ถึง 31

เอาต์พุตจะเป็นภาพเคลื่อนไหว (หากต้องการแสดงผลที่ไหนสักแห่งตราบใดที่มีการแทนที่เฟรมก่อนหน้าอนุญาตให้ใช้ GIFs) โดยคั่นด้วย (ประมาณ) 1 ใน 4 ของวินาที

หากอินพุต ( n) เป็นค่าบวก:

  • ภาพเคลื่อนไหวควรเริ่มต้นด้วย8<กรรไกรเปิด AKA
  • 8=กรอบต่อไปคือ นี่แสดงให้เห็นว่ากรรไกร "ตัด"
  • เส้นประ (เครื่องหมายถูกตัด) จะถูกเพิ่มไว้ด้านหลังกรรไกรและภาพเคลื่อนไหวจะปรากฏซ้ำจนกว่าจะมีnเส้นประ

หากอินพุตเป็นลบ:

  • กรรไกรเริ่มเปิดและหันไปทางซ้าย (เช่นนี้:) >8โดยมีnช่องว่างด้านหน้า
  • กรรไกรอยู่ใกล้และหันไปทางด้านซ้าย ( =8)
  • กรรไกรจะเปิดอีกครั้งเมื่อพื้นที่ถูกลบออกและมีเส้นประเพิ่มอยู่ด้านหลังกรรไกร

หากอินพุตเป็นศูนย์:

  • เอาต์พุตเพียงการเปิดและปิดกรรไกรสำหรับ 10 เฟรม พวกเขาสามารถหันหน้าไปทางใดก็ได้ตราบใดที่มันสอดคล้องกัน

นี่คือดังนั้นการส่งที่สั้นที่สุดในหน่วยไบต์ชนะ (แม้ว่าผลงานของคุณจะไม่ชนะอย่างชัดเจนเพราะภาษา "ภาษากอล์ฟ" แบบใหม่ที่ยังไม่จบเราก็ยังอยากเห็น)

อนุญาตข้อความแสดงข้อผิดพลาดได้ตราบใดที่ข้อความแสดงข้อผิดพลาดนั้นไม่รบกวนการเคลื่อนไหว

ตัวอย่างอินพุตและเอาต์พุตคู่:

(ฉันแยกเฟรมเพื่อความชัดเจน แต่ควรมีประมาณระหว่าง. 25 วินาทีในแต่ละเฟรม)

Input: 1
Output: 
8<
8=
-8<

Input: 2
Output:
8<
8=
-8<
-8=
--8<

Input: 5
Output:
8<
8=
-8<
-8=
--8<
--8=
---8<
---8=
----8<
----8=
-----8<

Input: 0
Output:
8<
8=
8<
8=
8<
8=
8<
8=
8<
8=

Input: -2
Output:
  >8
  =8
 >8-
 =8-
>8--

Input: -3
Output:
   >8
   =8
  >8-
  =8-
 >8--
 =8--
>8---

สนุก!


ใช่แล้ว. ฉันจะเพิ่มที่
iPhoenix

แบบอักษรจำเป็นต้องมีการผูกขาดหรือไม่
Οurous

@ Οurousหากภาษาของคุณรองรับใช่ มิฉะนั้นจะไม่
iPhoenix

คำตอบ:



5

MATL , 59 58 57 ไบต์

|EQG~10*+:"&FXx45@q2/kGg*XHY"8Vh61@oGO<Eq*+h4M?G|H-Z"hP]D

ลองที่MATL Online! หรือดูตัวอย่างการรันจากคอมไพเลอร์ออฟไลน์:

ป้อนคำอธิบายรูปภาพที่นี่


มันอาจเป็นฉัน แต่ดูเหมือนว่าภาพเคลื่อนไหวของกรรไกรที่ปิดจะยาวกว่าภาพกรรไกรที่เปิดอยู่ นี่เป็นเพียงการประมวลผลภาษาใช่หรือไม่
iPhoenix

1
ฉันไม่ได้สังเกตสิ่งนั้น แต่อาจเป็นไปได้ สิ่งที่ฉันสังเกตคือด้านซ้ายช้ากว่าเล็กน้อย และนั่นก็สมเหตุสมผลเพราะมีการประมวลผลเพิ่มเติม อย่างไรก็ตามเพื่อให้แน่ใจว่าเนื่องจากความท้าทายบอกว่าคั่นด้วย (ประมาณ) 1 ใน 4 ของวินาทีฉันเดาว่ามันเป็นที่ยอมรับใช่ไหม
Luis Mendo

ฉันพบคนที่รู้จัก MATL และพวกเขาแสดงให้ฉันเห็นว่าโค้ดของคุณกำลังทำอะไรและดูเหมือนดี :)
iPhoenix

@iPhoenix ฉันควรเพิ่มคำอธิบาย :-)
Luis Mendo

4

JavaScript (ES2017) + HTML, 165 + 10 ไบต์

-16 ไบต์โดย @Shaggy

n=>(g=i=>i<-~(n?2*m:9)&&setTimeout(g,250,i+1,s=8+"<>="[i%2?2:n<0|0],o=("-".repeat(i/2)+s).padEnd(m+2),e.innerHTML=(n?n<0?[...o].reverse().join``:o:s)))(0,m=n<0?-n:n)
<pre id=e>

ลองในตัวอย่างด้านล่าง:

let globalTimeout;
const _setTimeout = setTimeout;
window.setTimeout = function(){ globalTimeout = _setTimeout.apply(this, arguments); }
// Code above is to support user input

f=
n=>(g=i=>i<-~(n?2*m:9)&&setTimeout(g,250,i+1,s=8+"<>="[i%2?2:n<0|0],o=("-".repeat(i/2)+s).padEnd(m+2),e.textContent=(n?n<0?[...o].reverse().join``:o:s)))(0,m=n<0?-n:n)

// Code below is to support user input
f(10)
const $inp = document.getElementById("inp");
inp.addEventListener("change", ()=>{
  clearTimeout(globalTimeout);
  f(+inp.value);
});
<input type="number" id="inp" min="-31" max="31" value="10" />

<pre id=e>


1
ประหยัดด่วนเพียงไม่กี่ขั้นเพื่อให้คุณลงได้ถึง157 ไบต์โดยใช้เพียง JS (ถึงแม้ว่าalertแต่ละเฟรม "" อาจไม่สอดคล้องกับสเป็ค แต่คุณอาจต้องการความกระจ่างเกี่ยวกับเรื่องนี้)
Shaggy

@Shaggy ขอบคุณสำหรับการปรับปรุง! ฉันไม่ได้ใช้โดยเจตนาalertเนื่องจากข้อกำหนดคือเฟรมมาที่ช่วงเวลา ~ 0.25 ซึ่งalertไม่สนับสนุนหากไม่มีการป้อนข้อมูลจากผู้ใช้เพิ่มเติม
Birjolaxew

2

TI-BASIC, 173 ไบต์

:"-
:For(X,1,5
:Ans+Ans
:End
:For(X,1,32
:" "+Ans+" →Str1
:End
:ClrHome
:Input N
:N<0→X
:For(A,not(N),abs(N+5not(N
:For(B,4-3X,6-3X-(A=abs(N)),2
:33X-Anot(not(N
:Output(1,16,sub(Str1,33X+32,abs(Ans-1)-NX-31X)+sub(">8=8<8=",B,2)+sub(Str1,Ans+32,1
:rand(11
:End
:End

การป้อน 0 จบในเฟรมที่แตกต่างจากที่อื่นเป็นอุปสรรคที่น่าสนใจมาก!

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

หมายเหตุบางประการสำหรับอุปกรณ์ที่แปลกใหม่: ขนาดรหัส TI-BASIC วัดเป็นโทเค็นไม่ใช่ตัวอักษร สำหรับการเปรียบเทียบตัวคำนวณข้ามที่สอดคล้องกันเรามักจะไม่สนใจจำนวนไบต์ที่จัดการกับความยาวส่วนหัว (เช่นเราลบ 8 จาก PROGRAM: SCISSORS) นอกจากนี้สำหรับกิจวัตรที่มีความประพฤติอย่างสมบูรณ์บนหน้าจอหลัก (ส่วนที่ขาดในโครงสร้างการควบคุมส่วนใหญ่) เรายังกำจัดขนาดของโปรแกรมว่างเปล่าเพื่อ "บันทึก" ใน 9 ไบต์เช่นกัน โดยเฉพาะอย่างยิ่งโปรแกรมนี้ไม่สามารถพิมพ์ได้บนหน้าจอหลักเพื่อไม่ให้มีเสรีภาพ


ฉันลองความท้าทายนี้ใน TI-BASIC (ในห้องอ่านหนังสือบน CE ของฉันอยู่ที่ไหนอีก) เมื่อฉันนึกถึงมันและโปรแกรมของฉันก็ใหญ่เป็นสองเท่าอย่างนี้ ทำได้ดี.
iPhoenix

2

คู่ , 190 186 ไบต์

k=32+~e((a=abs(n=(z=input(''))+~z*10))+1,1);for i=1:a
clc
k(i:i+1)=[56,61-(s=sign(n))];q=@(m)fprintf(rot90([m ''],s));q(k)
if(i-a)pause(.25)
clc
k(i+1)+=s;q(k)
pause(.25);k(i)=45;end
end

ลองออนไลน์! (หมายเหตุ: clcใช้งานไม่ได้ใน TIO ดังนั้นจึงเป็นเพียงเฟรมภาพเคลื่อนไหวทั้งหมดที่แสดงผลตามลำดับ) ขอบคุณสำหรับ @LuisMendo ทำให้ผมตระหนักถึงฟังก์ชั่นในคู่ซึ่งจะมีค่าเท่ากับe(...)exp(1)*ones(...)

ปรากฎว่าการมอบหมายแบบอินไลน์จะส่งกลับเฉพาะรายการอาเรย์ที่เปลี่ยนไปไม่ใช่เฉพาะอาเรย์ทั้งหมด ซึ่งหมายความว่าการสร้างเช่นq(k(i+1)+=s)นั้นเป็นไปไม่ได้ดังนั้นโปรแกรมจึงเกือบจะเหมือน MATLAB ในความเป็นจริงรายการ MATLAB มีความยาวเพียงเล็กน้อยเท่านั้น

MATLAB, 198 195 ไบต์

n=input('');n=n+~n*10;a=abs(n);s=sign(n);k=zeros(a+1,1);q=@(k)fprintf(rot90([k ''],s));for i=1:a
k(i:i+1)=[56 61-s];clc
q(k)
if(i-a)pause(.25);
k(i+1)=k(i+1)+s;clc
q(k)
pause(.25)
k(i)=45;end
end

ในคู่ผมคิดว่าคุณสามารถแทนที่โดยไม่สวยงามเท่า+ones +~eนอกจากนี้ในคู่และใน Matlab แทนที่โดย[i i+1] i:i+1
Luis Mendo

@LuisMendo สิ่งที่บนโลกคือการใช้e(...)เช่นนั้น? ฉันไม่คิดว่าฉันเคยรู้สึกว่าจำเป็นสำหรับเมตรโดย n eเมทริกซ์ของ ทำให้การเล่นกอล์ฟที่ดีแม้ว่า
Sanchises

บางทีนักพัฒนาของอ็อฟเทฟก็มีโค้ดกอล์ฟอยู่ในใจฮ่าฮ่า
หลุยส์เมนโด

1

ทำความสะอาด , 294 ไบต์

import StdEnv,System.Time,ArgEnv,System._Unsafe
Start#n=toInt(select(getCommandLine)1)
=[?k l\\k<-[1..]&l<-if(n==0)(flatten o$5)(init)[$(abs n+2)'\b'++if(n<0)(rjustify(abs n+2))reverse[c,'8': $i'-']\\i<-[0..abs n],c<-[if(n<0)'>''<','=']]]
?t#(Clock n)=accUnsafe clock
|n>t*250=id= ?t
$ =repeatn

ลองออนไลน์!

โปรดทราบว่านี่ใช้งานไม่ได้กับ TIO ลิงค์นี้มีวัตถุประสงค์เพื่อการนำเสนอเท่านั้น

ผลลัพธ์ของคุณอาจแตกต่างกันหากคุณมีCLOCK_PER_TICKค่าคงที่อื่นนอกจาก1000ค่าเริ่มต้นสำหรับ x86 Windows Clean



0

ทับทิม, 169 ไบต์

->x{i="";o=?=;(x!=0&&x.abs*2+1||10).times{|l|o=o[?=]?x>0?"8<":">8":x>0?"8=":"=8";f=?\s*(x<0&&-x-l/2||0);system"cls";puts x>0?i+o:f+o+i;i+=?-if(l).odd?&&x!=0;sleep 0.25}}

อธิบายตัวเองได้สวยมากเมื่อคุณขุดมันอย่างน้อยก็ในความคิดของฉัน โปรแกรมจะต้องทำงานบนคอมพิวเตอร์ที่มีคำสั่ง / นามแฝง cls

ลองออนไลน์! (ต้องเขียนทับระบบ () วิธีเพียงสคริปต์นี้เนื่องจากข้อ จำกัด ดังกล่าวข้างต้น)

ฉันพยายามใช้

puts `cls`, ...

แต่มันก็แค่พิมพ์ตัวละครที่มองไม่เห็นใคร ๆ ก็รู้ว่าทำไม

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