เขียนบรรทัดในการควบคุมตัว


63

บทนำ

พวกข่าวร้าย - คุณถูกคุมขัง ครูสอนภาษาอังกฤษของคุณไม่เข้าใจเว็บไซต์นี้และต้องการให้คุณ"หยุดทำคณิตศาสตร์ในดิจิทัล dohickeys ของคุณนี่คือชั้นเรียนภาษาอังกฤษ!"

เธอตัดสินให้คุณเขียนคำพูดที่เธอโปรดปรานบนกระดานดำ 25 ครั้งซึ่งจะให้ 100 บรรทัดบนกระดานดำ

The eighteen-hundreds were a time for rum.
The nineteen-hundreds were a time for fun.
The two-thousands are a time to run
a civilized classroom.

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

Foxtrot

(Foxtrot โดย Bill Amend)

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

เขียนโปรแกรมที่สอดคล้องกับกฎต่อไปนี้:

  • โปรแกรมของคุณต้องพิมพ์ 4 บรรทัดด้านบน 25 ครั้ง บรรทัดต้องถูกเอาต์พุตในลำดับนั้นซ้ำ รวมเอาท์พุท 100 บรรทัด (ขึ้นบรรทัดใหม่ที่ท้ายสุดหรือขึ้นบรรทัดใหม่ที่จุดเริ่มต้นมากก็โอเค)
  • 0123456789คุณไม่สามารถใช้ตัวอักษร ครูของคุณสับสนกับคณิตศาสตร์และจะโทรห
  • คุณสามารถใช้การนำเข้าและไลบรารีภายนอกโดยไม่ต้องนับการนำเข้า ครูสอนภาษาอังกฤษของคุณไม่รู้เกี่ยวกับการเขียนโปรแกรม เจสันสามารถบันทึกงานจำนวนมากโดยไม่เขียน#include <stdio.h>และคุณไม่ต้องการทำผิดพลาดแบบเดียวกัน!
  • ให้คะแนนโปรแกรมของคุณด้วยการbyteนับ คะแนนต่ำสุดชนะ!

2
หากข้อความอ่าน "1900" การเขียนผลลัพธ์จะค่อนข้างยุ่งยากเล็กน้อย
Ingo Bürk

30
ถึง comix: เขาไม่ได้พิมพ์ \ n และห่วงจาก 1 นั้นค่อนข้างงุ่มง่าม (เหมือนกับธรรมชาติของ C) ...
VX

11
@VX Bill Amend เป็นเกม Pascal ที่กินเวลานานและเมื่อใดก็ตามที่เขาเขียน C ที่ค่อนข้างชัดเจน
ปุย

5
ฟังดูเหมือนครูสอนภาษาอังกฤษคนหนึ่งของฉันมาก
Kaz Wolfe

2
การแบน + จะทำให้เข้าใจได้ที่นี่ แต่อาจจะยากเกินไป
Pharap

คำตอบ:


9

CJam, 109 107 106 104 103 ไบต์

0000000: 22 0c 20 4f 18 41 e4 d8 a5 f3 95 cf 5e 2b cb 1c  ". O.A......^+..
0000010: 44 64 2f bf 28 23 e2 47 4e 4e 77 73 fc 43 09 a2  Dd/.(#.GNNws.C..
0000020: 09 0b fb 18 29 e8 e8 49 5d fc 00 da b8 70 b6 3e  ....)..I]....p.>
0000030: 0c 24 d7 5a 5b 28 1c 45 2e 90 63 86 04 5c 3e 95  .$.Z[(.E..c..\>.
0000040: 4b ae 66 22 48 48 2a 62 46 47 2b 62 22 54 0a 20  K.f"HH*bFG+b"T. 
0000050: 2d 2e 22 27 7b 2c 57 25 7c 66 3d 7b 28 2f 29 2a  -."'{,W%|f={(/)*
0000060: 7d 5a 2a 43 44 2b 2a                             }Z*CD+*

ด้านบนคือการถ่ายโอนข้อมูล xxd แบบพลิกกลับได้

การทดสอบ

คุณสามารถสร้างและเรียกใช้โค้ดข้างต้นได้โดยใช้คำสั่งนี้ในล่ามออนไลน์ :

"bxyyeighxrum.yninexfun.ytwo-thousands abto run
a civilized classroom.y
The xteen-hundreds webfor bre a time ""T
 -."'{,W%|f#31bHH*b:c`'\2*/'\*"HH*bFG+b""T
 -."`"'{,W%|f={(/)*}Z*CD+*"]:+~

หากต้องการดูรหัสที่สร้างขึ้น (โดยไม่ดำเนินการมัน) ~เอาสุดท้าย

การนับจำนวนของไบต์ (ตัวละครตัวหนึ่งเป็นหนึ่งไบต์ใน ISO-8859-1) แทนที่สุดท้ายด้วย~,

รุ่นที่พิมพ์ได้ (122 ไบต์)

"bxyyeighxrum.yninexfun.ytwo-thousands abto run
a civilized classroom.y
The xteen-hundreds webfor bre a time "{(/)*}Z*CD+*

หลังจากกดสตริง (S) ข้อมูลต่อไปนี้จะถูกเรียกใช้งาน:

{    }Z*        " Repeat 3 times:     ";
 (              "     Q := S.shift()  ";
  /             "     T := S.split(Q) ";
   )            "     R := T.pop()    ";
    *           "     S := T.join(R)  ";
        CD+*    " S *= 12 + 13        ";

การเล่นกอล์ฟ Moar

หลังจากกดสตริงที่ไม่สามารถพิมพ์ได้ (U) ข้อมูลต่อไปนี้จะถูกดำเนินการ:

HH*b                        " U := U.base(17 * 17) ";
    FG+b                    " U := U.base(15 + 16) ";
        "T\n -."            " P := 'T\n -.'        ";
                '{,W%|      " P |= 'zyx...\0'      ";
                      f=    " U[i] -> P[U[i]]      ";

สิ่งนี้จะดันสตริงของเวอร์ชันที่พิมพ์ได้ ส่วนที่เหลือของรหัสทำงานเหมือนก่อน


ใช้รหัสฉันได้รับรหัสที่สร้างนี้ซึ่งเป็น 144 ไบต์ ฉันกำลังทำอะไรผิดหรือเปล่า?
เครื่องมือเพิ่มประสิทธิภาพ

การเข้ารหัส UTF-8 จะส่งผลให้จำนวนไบต์สูงขึ้นใช่ ด้วย ISO-8859-1 จำนวนไบต์คือ 109 คุณสามารถแทนที่~ด้วย,เพื่อตรวจสอบ
เดนนิส

2
ฉันได้รับเครื่องมือเพิ่มประสิทธิภาพผลลัพธ์ที่แน่นอน แต่การเพิ่ม]:+~ทำให้มันทำงานได้ ทำไมคุณไม่เพิ่มรหัสของคุณลงไป?
การส่องสว่าง

1
@ user23013: ล่าม Java เคารพ$ LANGสำหรับ I / O ภายใน CJam มีตัวอักษร 16 บิต
เดนนิส

3
คุณไม่จำเป็นต้อง unicode-ize โซลูชันของคุณโดยไม่มีการบีบอัดตัวเองมันเป็นเพียง 124 ไบต์เต้นอื่น ๆ ทั้งหมด
เครื่องมือเพิ่มประสิทธิภาพ

77

JavaScript (ES6) 164

B='teen-hundreds were a time',alert(B.replace(/./g,
"The eigh"+B+" for rum.\nThe nine"+B+" for fun.\nThe two-thousands are a time to run\na civilized classroom.\n"))

ทดสอบในคอนโซล FireFox / FireBug



1
ใช่แทนที่ตัวละครแต่ละตัวด้วยสตริงที่มีขนาดใหญ่กว่า ทำสำเนา 25 ชุดของสตริงที่ใหญ่กว่า
เครื่องมือเพิ่มประสิทธิภาพ

1
@Optimizer นั่นคืออัจฉริยะ :)
FryAmTheEggman

3
@ Malvolio ในความเป็นจริงส่วนที่ซ้ำกันคือ 30 ตัวอักษร และฉันสามารถแสดงลำดับของความพยายามอย่างมากเพิ่มและตัดคำและแทนที่ส่วนที่เหลือก่อนที่จะหาวิธีแก้ปัญหาง่ายๆนี้
edc65

1
@IsmaelMiguel ฉันคิดว่าคุณหมายถึงเบราว์เซอร์ ES6 ใด ๆ ปัญหา: ณ เวลานี้การโพสต์ความท้าทาย, สตริงแม่แบบไม่ได้ดำเนินการในเบราว์เซอร์ใด ๆ : Firefox เป็นครั้งแรก - rel 34, ธันวาคมแรก 2014 - แล้ว Chrome, มีนาคม 2015. แต่ถึงแม้จะไม่มีสตริงแม่แบบของคุณ . คุณควรโพสต์มันเป็นคำตอบ
edc65

34

Python: 188 173 160 153

a="teen-hundreds were a time"
print"The eigh%s for rum.\nThe nine%s for fun.\nThe two-thousands are a time to run\na civilized classroom.\n"%(a,a)*len(a)

ฉันไม่ได้เป็นงูหลามมากนัก แต่มันค่อนข้างสั้นสำหรับฉัน

แก้ไข:ดังนั้นฉันผิดมันไม่สั้นเลย! ขอบคุณสำหรับความช่วยเหลือในความคิดเห็น: D


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

1
@Geobits ฉันทำอย่างนั้น 157
Holloway

1
@Geobits คุณทำงานบนเครื่อง windows หรือไม่? การเข้ารหัสบรรทัดใน windows มักจะเป็น \ r \ n แทนที่จะเป็นแค่ \ n นั่นอาจเป็นเหตุผลว่าทำไมมันถึงแสดงผล 157 ไบต์สำหรับเรา แต่ 160 สำหรับคุณ
Rob Watts

2
นี่คือ160เท่านั้น คุณอาจข้ามสาม\ใน\nอันเนื่องมาจากการหลบหนี ...
เพิ่มประสิทธิภาพ

1
คุณสามารถย้ายค่าสำหรับการbเข้าสู่print: มีลำดับความสำคัญสูงกว่า% *
FryAmTheEggman

29

CJam, 151 140 135 132 130 128ไบต์ (ทวีต)

"TeighYrum.TnineYfun.Ttwo-thousands are a time to run
a civilized classroom.""YT"["teen-hundreds were a time for ""
The "]erAF+*

ลองที่นี่

ฉันสามารถย่อขนาดให้สั้นลงเหลือ 110 ไบต์ด้วยการแปลงเป็น unicode แต่เนื่องจากไม่ได้ตีโซลูชัน unicode อื่น ๆ ฉันจึงไม่ควรใส่ :)


23
เฮ้:Dอิโมติคอนนั่นกำลังทำอะไรอยู่! คุณส่งข้อความถึงเพื่อนของคุณในระหว่างการควบคุมตัวหรือไม่? ไปที่สำนักงานของอาจารย์ใหญ่!
ลูกบิดประตู


บางทีคุณสามารถสร้างTนามแฝง.\nThe แล้วลบบรรทัดพิเศษที่สร้างจากจุดเริ่มต้นของสายออก (cjam-fu ของฉันไม่ดีพอที่จะคิดออกว่าคุณสามารถทำได้อย่างง่ายดาย)

@professorfish ที่จบลงด้วยการบริโภคไบต์มากกว่าที่จะช่วยประหยัด mothereff.in/… *% 28Y% 2F% 28% 40 \
เครื่องมือเพิ่มประสิทธิภาพ

Nitpicking: การใช้ 128 ไบต์ด้านบนของหน้ารหัสที่เข้ากันได้กับ ASCII นั้นไม่เกี่ยวข้องกับ Unicode
เดนนิส

23

PHP, 0 ไบต์



คุณสามารถใช้การนำเข้าและไลบรารีภายนอกโดยไม่ต้องนับการนำเข้า

ในการเรียกใช้รหัสนี้คุณต้องนำเข้าไลบรารีที่เรียกdata://text/plain,<?php...classroom.\n";ด้วย:

<?php require_once 'data://text/plain,<?php
  for($i=ord("z");$i>ord("a");$i--)
    echo "The eighteen-hundreds were a time for rum.
The nineteen-hundreds were a time for fun.
The two-thousands are a time to run
a civilized classroom.
";'; ?>

และคุณจะต้องมีการเปิดใช้งานในของคุณallow_url_includephp.ini

ไม่มีตัวเลขหรือส่วนขยายอีกต่อไปขอบคุณเดนนิส


9
สัญชาตญาณแรกของฉันคือตะโกนอะไรบางอย่างเกี่ยวกับช่องโหว่ แต่เนื่องจากคำตอบนี้มีอยู่ในตัวเองฉันคิดว่านี่เป็นวิธีที่ชาญฉลาดในการใช้ PHP เพื่อใช้ช่องโหว่ที่สร้างขึ้นโดยเจตนาสำหรับคำตอบของ Python เนื่องจากคุณกำลังโกงอยู่คุณสามารถใช้require_once "data://text/plain,The eighteen-hundreds...";ซึ่งไม่จำเป็นต้องใช้shไม่ใช้ตัวเลขและยังคงเป็น 0 ไบต์
เดนนิส

10
ฉันจะลงคะแนนให้กับความคิดสร้างสรรค์ แต่ฉันจะไม่ยอมรับสิ่งนี้
hmatt1

14

ทับทิม, 185 180 176 ไบต์

แก้ไข: การแก้ไขสตริงขอบคุณ @britishtea

มันเป็นสนามกอล์ฟแห่งแรกของฉันและฉันก็ไม่ได้เป็น Rubist มากนัก (แต่ฉันก็รัก Ruby) อย่างไรก็ตามนี่มัน (ย่อคำแนะนำของ Doorknob)

t=' were a time for '
s="The eighteen-hundreds#{t}rum.
The nineteen-hundreds#{t}fun.
The two-thousands are a time to run
a civilized classroom."
s.split.size.next.times{puts s}

1
คุณสามารถตีสิ่งนี้ลงไปอีกโดยแทนที่คำ / กลุ่มคำที่ซ้ำกันด้วยการแก้ไขสตริง
britishtea

3
+1 สำหรับการสังเกตว่ามี (เกือบ) 25 คำในสตริง
Digital Trauma

2
s.split.size.nextบันทึก 5 ตัวอักษร (คุณไม่จำเป็นต้องระบุพื้นที่ที่จะแยก)
Doorknob

ฉันไม่รู้ว่า Ruby แต่จะไม่(s.split.size+1).timesสั้นลง 1 ไบต์ใช่ไหม
seequ

1
@ ไม่อนุญาตให้ใช้หมายเลข!
rjdown

13

Java 249 231 230 222

คำตอบแรกของฉัน! ทำไมไม่เริ่มใช้ภาษาที่ฉันรู้จักดี

class c{public static void main(String[]g){for(int a='!';a++<':';out.println("The eighxrum.\nThe ninexfun.\nThe two-thousands are a time to run\na civilized classroom.".replaceAll("x","teen-hundreds were a time for ")));}}

Ungolfed

import static java.lang.System.*;
class c
{
    public static void main(String[]g)
    {
        for(int a='!';a++<':';out.println("The eighxrum.\nThe ninexfun.\nThe two-thousands are a time to run\na civilized classroom.".replaceAll("x","teen-hundreds were a time for ")));
    }
}

9
ยินดีต้อนรับ! คุณสามารถกำจัดpublicชั้นเรียนของคุณและย่อargsให้เหลือเพียงอักขระเดียว คุณสามารถทำได้a++<':'แทนที่จะเพิ่มมันแยกกัน เนื่องจาก OP ไม่ได้นับการนำเข้าคุณสามารถบันทึกได้อีกเล็กน้อยimport static java.lang.System.*;จากนั้นคุณไม่จำเป็นต้องเขียนในSystem.ภายหลัง (ที่มีการนับ) การทำเช่นนั้นทำให้ฉันลงถึง 230 คุณอาจต้องการดูหน้าเคล็ดลับ Javaหากคุณยังไม่ได้
Geobits

@Optimizer ขอบคุณ! ฉันไม่เห็นขีดฆ่าด้านบน
Luminous


@Geobits ขอบคุณ! เห็นได้ชัดว่าคุณยังสามารถใส่รหัสลงในลูปเองได้ ไม่ได้เพิ่มหรือลบอะไรเลย แต่ฉันคิดว่ามันดูเป็นแบบนั้นมากขึ้น
Luminous

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

11

171

a='a';b="teen-hundreds were a time for ";main(){for(;a++<'z';)printf("The eigh%srum.\nThe nine%sfun.\nThe two-thousands are a time to run\na civilized classroom.\n",b,b);}

ตอนแรกฉันลองเวอร์ชั่นง่าย ๆ (189 ไบต์) ซึ่งดีกว่าโซลูชัน C อื่น ๆ ...

main(a){for(a='a';a<'z';++a)printf("The eighteen-hundreds were a time for rum.\nThe nineteen-hundreds were a time for fun.\nThe two-thousands are a time to run\na civilized classroom.\n");}

ซึ่งภายหลังฉันปรับให้เหมาะสมเล็กน้อย ...


1
อืมนั่นช่างดี char *ผมไม่ทราบตัวแปรคงมีตัวอักษรของสตริงกำหนดให้พวกเขาโดยปริยายมีประเภท
FireFly

@FireFly GCC รวบรวมค่าปรับในกรณีที่aเป็นค่าเริ่มต้นintซึ่งสามารถยอมรับcharค่าได้ มันไม่ชอบbเว้นแต่ฉันจะเรียกมันchar[]ว่า VX คุณใช้คอมไพเลอร์อะไร?
Level River St

bก็intเช่นกัน แต่ก็ถือตัวชี้ไปที่ตัวอักษรสตริง ไม่เป็นไรใน GCC (ฉันมีในเครื่องของฉัน 4.8.2)
VX

1
for(a='a';++a<'z';)
seequ

9

JavaScript, ES6, 174 172 154ไบต์

ใช้replaceเคล็ดลับของ @ edc65 ขอบคุณ!

alert((d="teen-hundreds were a time").replace(/./g,`The eigh${d} for rum.
The nine${d} for fun.
two-thousands are a time to run
a civilized classroom.
`))

ใช้งานได้เฉพาะใน Firefox รุ่นล่าสุด (34 ขึ้นไป) เนื่องจากการใช้งานเทมเพลตสตริง


@Nijikokun คุณรู้ไหมว่าจะทำให้เกิดการซ้ำซ้อน 30 ครั้งแทนที่จะเป็น 25 ใช่ไหม?
เครื่องมือเพิ่มประสิทธิภาพ

ฉันเดาว่า ff 34 เป็นรุ่นเบต้าหรือบางอย่างเนื่องจากฉันเป็นรุ่นล่าสุด (เพิ่งตรวจสอบ) และมันคือ 33 และมันไม่สามารถใช้งานได้
Sammaye

8

BrainFuck ( 1,597 ตัวอักษร )

+++++++++++++++++++++++++[>->-[--->+<]>-.[---->+++++<]>-.---.--[--->+<]>-.+[->+++<]>++.++++.--.+.++++++++++++.+++[->+++<]>..+++++++++.[----->++<]>+.[->++++++++<]>.[--->+<]>---.-------.----------.++++++++++++++.-------------.-.--[--->+<]>---.+[---->+<]>+++.--[->++++<]>-.[->+++<]>.+++++++++++++.-------------.--[--->+<]>-.[->+++<]>+.-[->+++<]>.---[->++++<]>.-----------.++++.--------.--[--->+<]>-.++[->+++<]>.+++++++++.+++.[-->+++++<]>+++.---[----->++<]>.+++.--------.+[----->++<]>++.>++++++++++.>-[--->+<]>-.[---->+++++<]>-.---.--[--->+<]>-.+[----->+<]>+.-----.+++++.---------.[--->+<]>---.+++[->+++<]>..+++++++++.[----->++<]>+.[->++++++++<]>.[--->+<]>---.-------.----------.++++++++++++++.-------------.-.--[--->+<]>---.+[---->+<]>+++.--[->++++<]>-.[->+++<]>.+++++++++++++.-------------.--[--->+<]>-.[->+++<]>+.-[->+++<]>.---[->++++<]>.-----------.++++.--------.--[--->+<]>-.++[->+++<]>.+++++++++.+++.[-->+++++<]>+++.++[->+++<]>.-[--->+<]>--.-------.[----->++<]>++.>++++++++++.>-[--->+<]>-.[---->+++++<]>-.---.--[--->+<]>-.---[->++++<]>.+++.--------.[->+++++<]>++.+[--->++<]>.------------.+++++++.++++++.--.++[->+++<]>++.+++++++++++++.----------.--[--->+<]>---.+[---->+<]>+++.[->+++<]>+.--[--->+<]>---.-------------.--[--->+<]>-.[->+++<]>+.-[->+++<]>.---[->++++<]>.-----------.++++.--------.--[--->+<]>-.---[->++++<]>.-----.[--->+<]>-----.---[----->++<]>.+++.-------.>++++++++++.--[--->++++<]>+.-[->+++<]>.+[->+++<]>.++++++.[->++++++<]>.[------>+<]>.+++.---.-[--->+<]>++.---[->+++<]>.-.-[--->+<]>-.+[->+++<]>.+++++++++.-----------.--[--->+<]>--..-.---..--.+[----->++<]>++.>++++++++++.[[-]<+]<-]

สิ่งนี้ยังคงสามารถตีกอล์ฟต่อไปได้หากใครสนใจ

คุณสามารถทดสอบสิ่งนี้และยืนยันว่ามันให้ผลลัพธ์ที่ถูกต้องในขณะที่ปฏิบัติตามกฎทั้งหมด


5
นี่อะไรน่ะ? ฉันบอกให้คุณเขียนประโยคไม่ใช่ squiggles สุ่ม! ที่นี่ไม่มีแม้แต่คำพูด!
Riking

5
อืมมม .. ฉันคิดว่าเป้าหมายคือการใช้ตัวละครน้อยที่สุด คุณแน่ใจว่าชนะ "anti-
target

7

Perl - 145

ฉันดีใจที่ได้เห็นคำตอบมากมาย! นี่คือทางออกของ Perl

$s="teen-hundreds were a time for";print"The eigh$s rum.
The nine$s fun.
The two-thousands are a time to run
a civilized classroom.
"for b..z

7

เนื่องจากเธอเกลียดคณิตศาสตร์มากทำไมไม่ใช้ Mathematica (177)

   a = "teen-hundreds were a time for "; Do["The eigh" <> a <> "rum.
   The nine" <> a <> "fun.
   The two-thousands are a time to run a civilized classroom." // Print, {StringLength@a}]

6

Javascript ES6, 198 193 ไบต์

m=Math;alert("The eighteen-hundreds were a time for rum.\nThe nineteen-hundreds were a time for fun.\nThe two-thousands are a time to run\na civilized classroom.\n".repeat(~~(m.exp(m.PI)+m.E)))

คุณครูของคุณไม่ต้องการตัวเลขใด ๆ แต่เนื่องจากพวกเขาเป็นครูสอนภาษาอังกฤษพวกเขาไม่เข้าใจเลยว่ามีความMath.floor(Math.exp(Math.PI)+Math.E)หมายอะไร

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

alert("The eighteen-hundreds were a time for rum.\n\
 The nineteen-hundreds were a time for fun.\n\
 The two-thousands are a time to run\na civilized\n classroom.".repeat(Math.floor(Math.exp(Math.PI)+Math.E)))

ต้องทำงานใน firefox ล่าสุด


1
ไม่มีการขึ้นบรรทัดใหม่ในตอนท้ายดังนั้นแถวแรกและแถวสุดท้ายจะถูกผนวกเข้าด้วยกันเพื่อให้ได้ 75 แถว
edc65

ฉันจะให้รางวัล +1 สำหรับดัดกฎด้วยการอ้างอิง XKCD ของ e ^ pi แต่มี + e เมื่อเทียบกับ -pi ... ไชโย!
WallyWest

-4 ไบต์:with(Math)alert("long string here".repeat(exp(PI)+E|[]))
ขีดล่าง

โอ้ดีลืมคณิตศาสตร์:(q='aaaaa'.length)*q
edc65

ลืมความคิดเห็นเกี่ยวกับ @ edc65 ด้วยเช่นกัน! ใช้สิ่งนี้: "\x18".charCodeAt()! (hardcode ลูกศรขึ้นแล้วคุณจะประหยัดได้มากกว่าหนึ่งตัน!)
Ismael Miguel

6

Javascript - 178 ไบต์ 176 ไบต์

กอล์ฟครั้งแรกของฉันคิดว่าฉันจะให้ช็อตกับผู้ประกอบการตัวนิด ๆ หน่อย ๆ แต่ก็ไม่ได้หวังอะไรมาก

c="teen-hundreds were a time for "
b=!!c
alert(Array((b+b+b<<b+b)+b<<b).join("The eigh"+c+"rum.\nThe nine"+c+"fun.\nThe two-thousands are a time to run\na civilized classroom.\n"))

เนื่องจากฉันถูกควบคุมตัวอยู่และเห็นได้ชัดว่ามีปัญหาในการทำงาน ... Javascript - 71 Bytes

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

b=+true;alert( Array((b+b+b<<b+b)+b<<b).join($('code')[+!b].innerHTML))

ด่วน! ผู้ใช้ Chrome / IE 11 / Firebug เปิดคอนโซลของคุณทันทีและลองใช้

(โปรดอย่าทำร้ายฉันมากเกินไปฉันคิดว่ามันตลก)


1
72 คือความสนุก 176 มีหลายครั้งที่ผิด: อาร์เรย์ (25) .join () ให้การซ้ำ 24 ครั้งและการขึ้นบรรทัดใหม่ที่ประโยคสุดท้ายหายไป ทั้งหมดในทุก 24 * 3 = 72 แถวแทน 100 (เด็กขี้เกียจ!)
edc65

สิงหาคมแก้ไขแล้ว ตอนนี้ 178 และ 71
ซิดนีย์

1
คุณสามารถบันทึก 2 ไบต์เพิ่ม t และช่องว่างต่อท้ายใน "een-hundred ... for"
การส่องสว่าง

รหัสที่สองกำลังทำอะไรอยู่?
justhalf

1
@ เพียงแค่ใช้ JQuery ซึ่งเป็นไลบรารี JavaScript ทั่วไปที่เห็นได้ชัดว่าเครือข่าย SO นั้นใช้งาน $ เป็นฟังก์ชั่นที่ใช้ทำสิ่งต่างๆมากมายจากการเลือกองค์ประกอบ DOM โดยใช้ $ ('<selector>') ซึ่งในกรณีนี้องค์ประกอบทั้งหมดที่มีแท็ก 'code' ฉันจะได้รับวัตถุที่มีองค์ประกอบทั้งหมด โดยการใช้ [+! b] ฉันจะได้รับค่าจำนวนเต็มของเท็จซึ่งเป็นศูนย์ดังนั้นฉันเลือกดัชนี 0 ซึ่งเกิดขึ้นเป็นบล็อครหัสแรกของ OP ซึ่งในความเป็นจริงแล้วครูที่ชื่นชอบพูดว่า
ซิดนีย์

5

C # - 229 216 ไบต์

ฟรีusingFTW!

using c=System.Console;
class S{static void Main(){var a="teen-hundreds were a time";for(int b=a.Length,i=b-b;i++<b;)c.Write("The eigh"+a+" for rum.\nThe nine"+a+" for fun.\nThe two-thousands are a time to run\na civilized classroom.\n");}}

ทางเลือกนับไบต์เดียวกัน ( usingแม้ว่าจะมีการละเมิดมากกว่า)

using i=System.Int32;
using c=System.Console;
class S{static void Main(){var a="teen-hundreds were a time";for(int b=new i();b++<a.Length;)c.Write("The eigh"+a+" for rum.\nThe nine"+a+" for fun.\nThe two-thousands are a time to run\na civilized classroom.\n");}}

4
~~ (╯°□°) ╯︵ ┻━┻
William Barbosa

คุณสามารถเพิ่ม "สำหรับ" ถึงa
FryAmTheEggman

@FryAmTheEggman สตริงที่มีความยาว 25 ตัวอักษรเขาใช้มันเพื่อรับจำนวน 25 discretely อย่างไรก็ตามเขาสามารถสลับวิธีการนี้เพื่อลบตัวอักษรออกจากกัน ( ':'-'!'== 25) ซึ่งสั้นกว่าa.Lengthและจะอนุญาตให้รวมไว้ตามที่คุณแนะนำ (อีกวิธีหนึ่งทำตามคำตอบอื่น ๆ และเพียงแค่วนรอบระหว่าง!และ:ตลกว่าเราทุกคนเลือกตัวอักษรเดียวกัน)
VisualMelon

@VisualMelon อ๊ะคุณพูดถูก
FryAmTheEggman

1
ฉันคิดว่าฉันสามารถทำได้เนื่องจากการใช้งานไม่ได้ถูกนับ OP ได้ชี้แจงเรื่องนี้หรือไม่
William Barbosa

5

Befunge-93, 268 260 256 (ขนาดกริด: 72x6 = 432)

#v"K">:!#@_v>$"enin">,,,,::-" rof emit a erew sderdnuh neet">:#,_$::!!-#
, ,,,"The "<|\!\%-"\^"::%-" #":-!!:
   -"#-"-::$_ "hgie"^v1"two-thousands are a time to run"
$_$  "nuf"v"rum"
v1-"##",,,<      >:#,_"moorssalc dezilivic a"1
_# < ^,,\-"AK."$_,#!:

นี่เป็นครั้งแรกที่ฉันเล่นกอล์ฟดังนั้นฉันจึงคิดว่าฉันลองใช้ภาษาที่ไม่เคยทำมาก่อนสำหรับปัญหานี้เนื่องจากฉันจะไม่เพิ่มอะไรอีก เนื่องจากสามารถใช้งานได้กับ Befunge-93 (พอดีภายในตาราง 80x25 และใช้เพียงคำสั่ง Befunge-93) จึงควรใช้งานใน Befunge-98 ด้วย ในกรณีที่ฉันยังหลีกเลี่ยงการมีตัวชี้ผ่านตัวละครที่ไม่ใช่คำสั่งอื่น ๆ นอกเหนือจากพื้นที่ ฉันจำไม่ได้ว่าสเปคได้กำหนดตัวละครเหล่านั้นเป็นตัวจริงหรือไม่และฉันจะไม่มีปีศาจจมูกในรหัสของฉัน

คุณไม่สามารถปลดล็อครหัส Befunge ได้จริงๆ สิ่งสำคัญที่ควรทราบที่นี่คือ Befunge ผลักอักขระไปยังสแต็กเป็นค่า ASCII ทำให้ค่อนข้างง่ายในการอ้างถึงตัวเลขโดยไม่อ้างอิงถึงตัวอักษร "K"ที่ด้านซ้ายบนคือ 75 หมายถึงจำนวนครั้งการเกิดซ้ำจำนวนของ "" ข้อต่อซ้ำ; ฉันใช้โมดูลัสและความชำนาญอื่น ๆ ใน (จำนวนสำเนา) จำนวนนี้เพื่อกำหนดเส้นทางที่จะใช้ในการพิมพ์ในแต่ละรอบ ::-เป็นสำนวนที่ดีสำหรับศูนย์ซึ่งมีประโยชน์สำหรับการสิ้นสุดสตริงศูนย์; ฉันใช้มันสองครั้งที่นี่

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

สิ่งที่ดีเกี่ยวกับล่าม Befunge จำนวนมากคือคุณสามารถดูตัวชี้โผรอบ ๆ ตารางรวมทั้งดูว่ามีค่าใดบ้างในกองซ้อน ด้วยวิธีนี้คุณสามารถผ่านและดูว่าโปรแกรมทำงานอย่างไรไม่มากก็น้อย! ฉันขอแนะนำให้ใช้http://befungius.aurlien.net/หากคุณไม่มีล่าม Befunge ที่คุณต้องการ

สิ่งนี้อาจลดลงไปอีกเล็กน้อย (หรือมากขึ้น) กรุณาให้ข้อเสนอแนะ! หากฉันต้องการคำอธิบายที่ดีกว่ามีคนแจ้งให้ฉันทราบ ฉันยังใหม่กับสิ่งนี้

แก้ไข - ลบออกไปสองสามไบต์โดยกำจัดการเปลี่ยนเส้นทางที่ไม่จำเป็นไปยังแถวสุดท้ายเมื่อโปรแกรมสิ้นสุด (เพียงแค่ใส่@ตำแหน่งที่^เคยเป็น)

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


สวัสดี Kasran ยินดีต้อนรับสู่การแลกเปลี่ยน codegolf! คำตอบนี้ดูดีมาก คำอธิบายของคุณดีและคุณเชื่อมโยงกับล่าม Befunge ซึ่งเป็นประโยชน์จริง ๆ สำหรับภาษาแปลก ๆ ไม่ใช่ทุกคนมีคอมไพเลอร์ (คนทั่วไปมักทำสิ่งต่าง ๆ เช่น "เรียกใช้ที่นี่")
hmatt1

Befunge เป็นภาษาที่ยากมากและคุณต้องรักษาขนาดของรหัสไว้ในใจเมื่อทำการเขียน รหัสของคุณดูดีและใช้งานได้ดี แต่มันจะลดขนาดถ้าคุณบันทึกไว้re a time ที่ไหนสักแห่ง?
Ismael Miguel

ฉันไม่ได้ใช้คำแนะนำหรือพฤติกรรมเฉพาะของ Funge-98 แต่เนื่องจากฉันเขียนคำตอบนี้ฉันได้เรียนรู้ว่าพฤติกรรมบางอย่างของล่าม Befungius ไม่ใช่มาตรฐาน - ใช้#ที่ปลายด้านหนึ่งของบรรทัดเพื่อข้าม ตัวละครที่ปลายอีกด้าน (ในCCBIเช่น#เพิ่งข้ามช่องว่างที่ไม่มีที่สิ้นสุดในระหว่างมันและตัวละครที่ปลายอีกด้าน) ซึ่งแบ่งโปรแกรมนี้ ฉันไม่ได้สนใจที่จะกลับมาแก้ไขข้อเสนอนี้ด้วยความคิดนี้
Kasran

มี1ตัวเลขสองสามตัวในนั้นซึ่งไม่ได้รับอนุญาต
โจคิง

4

Pyth 135 136 140

*ltG%"The eigh%srum%snine%sfun%stwo-thousands are a time to run\na civilized classroom.\n"*hhZ("teen-hundreds were a time for "".\nThe 

สังเกตพื้นที่ต่อท้าย

ใช้กลอุบายแบบเดียวกับ @Geobits และเพื่อนผู้วิจารณ์ในคำตอบของPythonเพื่อสร้างสตริง ตอนนี้ใช้คำตอบนี้ด้วย

สิ่งนี้ใช้ตัวแปรบิวด์อินGซึ่งประกอบด้วยabcdefghijklmnopqrstuvwxyzและรับความยาวน้อยกว่าหนึ่งตัวเพื่อสร้างเอาต์พุต 25 เอาต์พุต


1
ดูเหมือนว่าจะเป็น136 ไบต์มากกว่า 135
เครื่องมือเพิ่มประสิทธิภาพ

1
@Optimizer ขออภัยฉันควรอ่านบันทึกของตัวเอง: ฉันลืมช่องว่างท้ายเมื่อฉันวางมันเอง: S
FryAmTheEggman

4

ทับทิม - 152 141

puts"The eight#{e="een-hundreds were a time for "}rum.
The ninet#{e}fun.
The two-thousands are a time to run
a civilized classroom.
"*(?X-??)

http://repl.it/2Om/6


1
ใช้ตัวอักษร 1.8 อย่างชาญฉลาด! คุณอาจจะสามารถที่จะใช้String#*ในการทำซ้ำเส้น 25 Integer#timesครั้งแทน
britishtea

@britishtea - ทำงานได้ดี :)
Mikey

1
คุณสามารถโกนทิ้งได้อีกสองสามไบต์โดยไม่กำหนดบรรทัดแรก ช่องว่างระหว่างการใส่และตัวอักษรสตริงเป็นตัวเลือก ( puts"hi"ถูกกฎหมาย)
britishtea

การกำหนดeในการแก้ไขเป็นสัมผัสที่ดี
Wayne Conrad

3

Python ขนาด 165 ไบต์

h="hundreds were a time for "
t="The "
for i in h:print t+"eighteen-"+h+"rum.\n"+t+"nineteen-"+h+"fun.\n"+t+"two-thousands are a time to run\na civilized classroom."

มันทำงานออกมาได้ดีจริง ๆ ว่าความยาวของ h คือ 25 ซึ่งไม่ได้ตั้งใจ =)


3

Python 2 - 143

คำตอบที่โง่:

from this import i
a="teen-hundreds were a time for ",".\nThe "
print"The eigh%srum%snine%sfun%stwo-thousands are a time to run\na civilized classroom.\n"%(a+a)*i

โปรดทราบว่านับเต็ม 162 from this import iผมทิ้งออกทั้งหมดของ

ใช้การแทนที่ที่คล้ายกับกลยุทธ์ pyth ของฉัน แต่ฉันไม่สามารถต้านทานการโพสต์สิ่งนี้หลังจากค้นพบความเฮฮาของการนำเข้าจากสิ่งนี้ :)


+1 สำหรับการใช้งานfrom this import i! คุณรู้เรื่องนี้ได้อย่างไร
Beta Decay

1
@BetaDecay import thisที่จริงผมก็เบื่อและตัดสินใจที่จะอ่านเซนของงูหลามดังนั้นฉันไปล่ามของฉันและเขียน จากนั้นฉันก็คิดว่า: "มีอะไรอีกที่จะอยู่ในthisโมดูล?" dir(this)ดังนั้นผมจึงเรียกว่า แท้จริงและดูเถิดพร้อมกับพจนานุกรมสตริงที่อ่านไม่ออกและ"!"ตัวแปรมีค่าคงที่ตัวเลข ... เท่ากับ 25
FryAmTheEggman

3

PHP (175 157156 ไบต์; 152 กับ unix EOF):

ไม่ใช่ทางออกที่เล่นกอล์ฟได้มากที่สุด แต่แน่นอนว่าทำงานและมีขนาดเล็กกว่าความพยายามบางอย่าง

นี่คือรหัส:

$a=a;$f='re a time';$r="teen-hundreds we$f for";while($a++<z)echo"The eigh$r rum.
The nine$r fun.
The two-thousands a$f to run
a civilized classroom.
";

เวอร์ชั่นเก่า:

$a=a;while($a++!=z)echo"The eighteen-hundreds were a time for rum.
The nineteen-hundreds were a time for fun.
The two-thousands are a time to run
a civilized classroom.
";

สิ่งนี้ใช้งานได้เพราะ php วนรอบตัวอักษรและเราแค่ตรวจสอบว่ามันไม่zหยุดหรือไม่

(สิ่งหนึ่งที่อยากรู้ก็คือเมื่อ PHP ถึงzมันก็จะไปaa)


3
การประชุมทั่วไปที่นี่คือการนับบรรทัดใหม่เป็นเพียงหนึ่งไบต์เว้นแต่ภาษาของคุณจะดื้อรั้นเท่านั้นที่จะรับ CRLF เท่านั้นซึ่งไม่ใช่กรณีของ PHP
nyuszika7h

3

Python 2 - 155

หมายเหตุ:เนื่องจากการควบคุมตัวอักษรไม่แสดงบน SE \x19ฉันแทนที่มันด้วย

a,b='\nThe ','teen-hundreds were a time for '
print(a+'eigh'+b+'rum.'+a+'nine'+b+'fun.'+a+'two-thousands are a time to run\na civilized classroom.')*ord('\x19')

เวอร์ชั่นฐาน 64:

YSxiPScKVGhlICcsJ3RlZW4taHVuZHJlZHMgd2VyZSBhIHRpbWUgZm9yICcKcHJpbnQoYSsnZWln
aCcrYisncnVtLicrYSsnbmluZScrYisnZnVuLicrYSsndHdvLXRob3VzYW5kcyBhcmUgYSB0aW1l
IHRvIHJ1bgphIGNpdmlsaXplZCBjbGFzc3Jvb20uJykqb3JkKCcZJyk=

เกี่ยวกับการนำเข้าฉันคิดว่าคุณสามารถบันทึกได้เล็กน้อยfrom string import *หรือเรียกว่าใน Python
FireFly

1
คุณสามารถย้าย "วัยรุ่น" เป็นข
FryAmTheEggman

2
คุณสามารถลบ[]วงเล็บในบรรทัดแรกซึ่งสร้าง tuple โดยปริยายแล้วคลายออก
ลูกบิดประตู

นอกจากนี้คุณยังสามารถย้ายord('d')//len('aaaa') to before the string so you don't have to bracket it.
FryAmTheEggman

1
@Dennis การแก้ไขล่าสุดของ OP ช่วยให้สามารถขึ้นบรรทัดใหม่ได้
สลายตัวเบต้า

3

LiveScript - 181

p=(a,b)->"The #{a}teen-hundreds were a time for #b.\n"
each console.log,map (->(p \eigh \rum)+(p \nine \fun)+'The two-thousands are a time to run\na civilized classroom.'),[\A to\Y]

การนำเข้าที่ต้องการ:

{each, map} = require 'prelude-ls'

หากคุณต้องการรันภายใต้ Node.js ให้ติดตั้งLiveScript( ไม่ใช่ livescript ) และprelude-lsแพ็คเกจจาก npm แทนที่alertด้วยconsole.logและรันlsc prog.lsโดยที่prog.lsมีโปรแกรมอยู่


13
ดูกฎ: "คุณไม่สามารถใช้ตัวอักษร0123456789"
Paul R

2
จับดีคงที่
nyuszika7h

2

T-SQL: 206

ใช้การรวม cross ในห้าแถวเพื่อสร้าง 25 แถวการเลือกวลี การขึ้นบรรทัดใหม่นั้นสำคัญสำหรับเอาต์พุต

with c as(SELECT\ N FROM(VALUES(\),($),($),($),($))A(B))SELECT REPLACE('The eigh$rum.
The nine$fun.
The two-thousands are a time to run
a civilized classroom.','$','teen-hundreds were a time for ')FROM c a,c b


2

C, 196 ตัวอักษร

นี่ไม่ใช่งานง่ายสำหรับ ol ดี 'การแยกแยะแบบ "The steen-hundred ... " ช่วยฉันทั้งสองตัวละคร

ช่องว่างเพื่อความชัดเจนรวมถึงไม่นับ

#include <stdio.h>
main(){
  for (char*p="The %steen-hundreds were a time for %s.\n",
           *s="The two-thousands are a time to run\na civilized classroom.",
           *q=p;
       *q++ - 'a';
       puts(s))
   printf(p,"eigh","rum"), printf(p,"nine","fun");
}

2

ทับทิม, 145

?K.upto(?c){puts"The eigh#{x="teen-hundreds we#{t="re a time "}for "}rum.
The nine#{x}fun.
The two-thousands a#{t}to run
a civilized classroom."}

คำอธิบาย

  • ใช้String#uptoสำหรับพิมพ์บรรทัด 25 ครั้ง ช่วง"K".."c"คือ 25 อักขระ
  • ใช้การแก้ไขสตริงพื้นฐานเพื่อทำให้เส้นสั้นลง

2
#{a="The "}จริง ๆ แล้วคุณคิดว่าตัวละครมากขึ้น! #{a}มีความยาวเท่ากับThe
มิคกี้

2

แร็กเก็ต 173

(let([x"teen-hundreds were a time for "])(for([z(+ #xa #xf)])(displayln(~a"The eigh"x"rum.\nThe nine"x"fun.\nThe two-thousands are a time to run\na civilized classroom."))))

Ungolfed:

(let ([x "teen-hundreds were a time for "])
  (for([z(+ #xa #xf)])
    (displayln (~a "The eigh"x"rum.\nThe nine"x"fun.\nThe two-thousands are a
     time to run\na civilized classroom."))))

2

C, 215 203 199 ไบต์

main(a){a<<='\xC'+'\xD';while(a>>=!!a)printf("The eighteen-hundreds were a time for rum.\nThe nineteen-hundreds were a time for fun.\nThe two-thousands are a time to run\na civilized classroom.\n");}

Ungolfed

main(a)
{
  a<<='\xC'+'\xD';
  while(a>>=!!a)
    printf("The eighteen-hundreds were a time for rum.\nThe nineteen-hundreds were a time for fun.\nThe two-thousands are a time to run\na civilized classroom.\n");
}

ฉันใช้การขยับบิตเล็กน้อยเพื่อย้ำโดยไม่มีตัวเลขใด ๆ

a<<='\xC'+'\xD' ตั้งค่าเป็น 0b1 [25 ศูนย์]

a>>=!!a เลื่อนไปทางขวาหนึ่งบิตในแต่ละครั้งที่เราวนซ้ำ

แก้ไข: aเท่ากับ argc ดังนั้นค่าจึงเป็น 1 แล้วเมื่อโปรแกรมรันโดยไม่มีข้อโต้แย้ง เปลี่ยนแปลงa>>='\xB'-'\xA'ไปa>>=!!'\xA'ซึ่งเป็น 4 ไบต์สั้น ข้อความก็ถูกแสดงเพียง 24 ครั้ง ซ่อมมัน. whileลบออกวงเล็บพิเศษใน

แก้ไข 2:เปลี่ยนไป!!'\xA' !!aดูเหมือนว่าจะทำงานและประหยัด 4 ไบต์


1
คุณสามารถใช้putsเพื่อบันทึกไบต์เพิ่มเติม
Spikatrix

2

คุยโว, 191 ไบต์

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

[pin:][$[_:a]:The [arg:a][sync:;ordered]{thousands a|teen-hundreds we}re a time ][r:[len:[$_:]]]{[step:][$_:eigh]for rum.\N[$_:nine]for fun.\N[step:][$_:two-]to run\Na civilized classroom.\N}

Ungolfed:

[pin:]
[$[_:a]:The [arg:a][sync:;ordered]{thousands a|teen-hundreds we}re a time ]
[r:[len:[$_:]]]
{
    [step:]
    [$_:eigh]for rum.\N
    [$_:nine]for fun.\N
    [step:]
    [$_:two-]to run\N
    a civilized classroom.\N
}

ลองออนไลน์

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