สร้างโปรแกรมที่มีประโยชน์ที่สุดภายใน 100 ตัวอักษร [ปิด]


13

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

กฎเพียงเพื่อปกป้องจากช่องโหว่มาตรฐานที่ไม่ตลกอีกต่อไป:

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

  2. โปรแกรมของคุณไม่สามารถเป็นล่ามสำหรับภาษาที่เขียนได้อย่างไรก็ตามล่าม Brainfuck ในภาษาที่ไม่ใช่ Brainfuck น่าจะใช้ได้

  3. โปรแกรมของคุณไม่สามารถรันโปรแกรมภายนอกที่ทำสิ่งที่โปรแกรมของคุณทำ ตัวอย่างเช่นคุณไม่สามารถเรียกใช้vimและอ้างว่าโปรแกรมของคุณกำลังvimใช้งานอยู่

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

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

  6. คุณไม่ได้รับอนุญาตให้สร้างภาษาสำหรับงานนี้โดยเฉพาะ อย่างไรก็ตามคุณได้รับอนุญาตให้สร้างล่ามสำหรับภาษาที่คุณคิดค้นในภาษาการเขียนโปรแกรมอื่น


ฉันสามารถโพสต์มากกว่าหนึ่งคำตอบสำหรับการแข่งขันนี้ได้หรือไม่?
TrungDQ

@TrungDQ: แน่นอน
Konrad Borowski

1
นี่จะเป็นหนึ่งในคำถามที่ดีที่สุดในวันนี้;)
Timtech

13
นี่เป็นวิธีที่เปิดกว้างเกินไปสำหรับเว็บไซต์เช่นนี้แม้กระทั่งสำหรับการประกวดความนิยม แท้จริงคำตอบใด ๆ ที่ถูกต้องไม่มีกรอบอ้างอิงใด ๆ สำหรับการเปรียบเทียบพวกเขา
Aaronaught

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

คำตอบ:


26

C - 47 ไบต์

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

main(){srand(time(0));while(1)putchar(rand());}

หากคุณไม่สนใจว่าจะแสดงผลอย่างอื่นทุกครั้งคุณจะต้องใช้41 ไบต์ !

main(){srand(0);while(1)putchar(rand());}

ไม่ได้ค่อนข้างสอดคล้อง C99 gcc.exe (GCC) 4.7.0 20111220แต่ก็รวบรวมได้อย่างราบรื่นด้วย

กฎของรัฐ

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

ไม่มีปัญหา.

บางสิ่งโปรแกรมนี้จะแสดงผล:

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

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

เป็นบันทึกเดนนิสแบบแผนของขั้นตอนวิธีที่อาจจะดีขึ้นบ้าง (ภายในขีด จำกัด อักขระ) โดยใช้แทนrand()^rand()>>16rand()


10
ไม่จำเป็น. rand()เป็น pseudorandom เท่านั้น - มันอาจไม่สร้างข้อความที่มีประโยชน์ใด ๆ ก่อนที่มันจะวนไปมา
user12205

1
@Dennis โชคดีที่ยังอยู่ในกฎของคำถามนี้! :)
Martin Ender

1
@ m.buettner: ด้วยrand ของ GLIBC ()มีความสัมพันธ์เชิงพีชคณิตอย่างง่าย ๆ ระหว่างไบต์ของผลลัพธ์ของโปรแกรมของคุณ: ดูผลลัพธ์เป็นอาร์เรย์xคุณมีx[i] == (x[i - 3] + x[i - 31] + c[i]) % 256ที่c[i]0 กับความน่าจะเป็น 0.75 และ 1 กับความน่าจะเป็น 0.25 นี่หมายความว่ามันไม่สามารถสร้างสิ่งที่คุณพูดถึงได้
Dennis

1
@ m.buettner: มันจะไม่ทำให้ PRNG ที่ดีมาก แต่คุณสามารถลบเส้นตรงโดยใช้แทนธรรมดาrand()^rand()>>16 rand()หากคุณกำลังมองหาวิธีที่จะประหยัดไบต์ลบและint %256
Dennis


18

BBC BASIC, 84 ตัวอักษร

MODE 6:INPUT T,A,B,A$,B$:FOR X=0 TO 1279:A=A+EVAL(A$):B=B+EVAL(B$):DRAW X,A+500:NEXT

พล็อตโซลูชั่นเป็นสมการอนุพันธ์อันดับหนึ่งและสอง

ใช้เป็นอินพุตของผู้ใช้:

Title (does nothing)
Start value for A (plotted value)
Start value for B (not plotted)
Expression for dA/dX
Expression for dB/dX

แรงบันดาลใจจากซอฟต์แวร์การแก้สมการเชิงอนุพันธ์ที่เรียกว่า Polymath ที่ฉันใช้เมื่อเรียนเป็นวิศวกรเคมี เราจะใส่สมการที่แตกต่างกันสำหรับสารตั้งต้นและผลิตภัณฑ์และดูว่าระบบปฏิกิริยาทั้งหมดมีการเปลี่ยนแปลงอย่างไรเมื่อเวลาผ่านไป ซอฟต์แวร์ที่ง่ายมาก (ไม่ซับซ้อนเกินกว่านี้) แต่สะดวกกว่าสำหรับวัตถุประสงค์นี้มากกว่า Excel น่าเสียดายที่ฉันไม่สามารถทำ Polymath ที่สมบูรณ์ได้ใน 100 chars

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


10

Mathematica 76

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

Mathematica ทำงานร่วมกันอย่างราบรื่นกับ WolframAlpha
ด้วยเหตุนี้ฉันเชื่อว่าการส่งข้อมูลตรงตามข้อกำหนด # 1 ของความท้าทาย: "โปรแกรมของคุณไม่สามารถเข้าถึงอินเทอร์เน็ตได้เว้นแต่จะต้องดำเนินการ "

แอพเพล็ตที่ค่อนข้างเรียบง่ายนี้ใช้ประโยชน์จากฟังก์ชันที่มีอยู่แล้วในภาษา Mathematica วิดีโอสั้น ๆให้ข้อมูลเพิ่มเติมเกี่ยวกับแอปเพล็ต

d = CountryData; Manipulate[WolframAlpha[p <> " " <> c], {p, d["Properties"]}, {c, d[]}]

แอลฟา


ด้านล่างเป็นรายการที่พัก 20 แห่งแรกจากทั้งหมด 22 แห่งที่เกี่ยวข้องกับประเทศต่างๆ ด้วยการเขียนโปรแกรมเพิ่มเติมหนึ่งสามารถรับข้อมูลเพิ่มเติมเกี่ยวกับประเทศและวิเคราะห์ข้อมูลนี้ใน Mathematica

CountryData["Properties"][[;; 20]]

{"การรวมผู้ใหญ่", "สินค้าเกษตร", "เกษตรมูลค่าเพิ่ม", "สนามบิน", "AlternateNames", "เปลี่ยน" มาตรฐาน "," AMRadioStations "," ประจำปีเกิด "," ประจำปี HIVAIDSD " พื้นที่ "," วันเกิดเศษส่วน "," ขอบเขตแดน "," ขอบเขตพรมแดน "," ขอบเขตเขตแดน "," เขตแดนการโทร "," เมืองหลวง "," เมืองหลวงตำแหน่ง "}


ฉันไม่เห็นว่าโปรแกรมของคุณ "ต้อง" เข้าถึงอินเทอร์เน็ตอย่างไร ข้อมูลที่คุณนำเสนอไม่เปลี่ยนแปลงที่บ่อยครั้งที่คุณจะต้องพึ่งพาแหล่งภายนอก
shiona

1
ไม่ว่าแหล่งข้อมูลจะอยู่ภายในหรือภายนอกก็เปิดให้มีการอภิปราย ฉันกำลังพิจารณาคำขอข้อมูลเกี่ยวกับ WolframAlpha (ซึ่งโค้ดทำขึ้น) เป็นกรณีของ (จำเป็น) "การเข้าถึงอินเทอร์เน็ต" แม้ว่ารหัสนั้นจะปรึกษาเซิร์ฟเวอร์ข้อมูล Wolfram โดยตรงและไม่จำเป็นต้องใช้เบราว์เซอร์ เช่น FireFox มันต้องมีคนที่มีเครือข่ายหรือการเชื่อมต่อไร้สาย
DavidC

1
-1 ถ้าฉันทำได้ - นี่เป็นการรวมโครงสร้างข้อมูลจากบริการที่มีอยู่แล้ว
l0b0

@ l0b0 ฉันคิดว่าคุณสามารถเห็นมันเป็นอย่างนั้น หรือคุณอาจบอกว่ามันใช้ประโยชน์จากฟังก์ชั่นของภาษา ท้ายที่สุด WolframAlpha ได้รับการออกแบบจากพื้นดินขึ้นมาเพื่อให้สามารถทำงานร่วมกับ Mathematica
DavidC

1
" ข้อมูลใน WolframAlpha เป็นส่วนหนึ่งของ Mathematica และภาษา Wolfram " เป็นสถานการณ์ที่ค่อนข้างน่าตกใจ ต้องทำให้มันเป็นภาษาการเขียนโปรแกรมที่มีความเสถียรน้อยที่สุด
Peter Taylor

9

ทุบตี, 100 ไบต์

head -c${1--1} /dev/zero |
openssl enc -aes-128-ctr -pass file:/dev/random 2>/dev/null |
tail -c+17

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

มีประโยชน์ในกรณีที่การอ่านจาก/dev/urandomช้าเกินไป

เกณฑ์มาตรฐาน

$ time head -c 1G /dev/urandom > /dev/null
Real    59.75
User    0.03
Sys     59.68
$ time random 1G > /dev/null
Real    0.68
User    0.64
Sys     0.86

สคริปต์นี้สร้างมากถึง 1.5 GiB ต่อวินาทีใน i7-3770 ของฉัน

ในทางตรงกันข้ามการอ่านจาก/dev/urandomการบริหารจัดการเพื่อสร้างแทบ 1 ลิ่มต่อนาที

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

  • head -c${1--1} /dev/zeroส่งออกจำนวนเงินที่ระบุเป็นศูนย์ไบต์ หากไม่ได้ระบุจำนวนให้${1--1}เท่ากับ -1 และส่วนหัวจะแสดงผลเป็นจำนวนอนันต์

  • openssl enc -aes-128-ctr -pass file:/dev/randomใช้ AES-128 /dev/randomในโหมดการเข้ารหัสเคาน์เตอร์ไบต์ศูนย์การอ่านรหัสผ่านจาก

  • tail -c+17 กำจัดส่วนหัว 16- ไบต์ของเอาต์พุต


โปรดทราบว่าสตรีมนี้สามารถแยกความแตกต่างจากสตรีมแบบสุ่ม "ของจริง" ได้โดยดูที่เอาต์พุต 2 ^ 68 ไบต์แรก (สตรีมแบบสุ่มจริงควรมีบล็อกที่ซ้ำกันที่นั่น
Paŭlo Ebermann

@ PaŭloEbermann: คุณพูดถูก จากนั้นอีกครั้งมันจะใช้เวลากว่า 6,000 ปีในการสร้างจำนวนไบต์ที่มากบนเครื่องของฉัน ...
4322 Dennis

7

จาวาสคริ

แก้สมการใด ๆ (ดีไม่ใช่ทั้งหมด แต่ควรทำงานกับฟังก์ชั่นทั่วไป ... )

r=s=>{for(x=e=a=1e-7;a;x-=e*a/(eval(s.replace(/x/g,x+e))-a))a=eval(s.replace(/x/g,x));return x}

ไม่มี ES6 (105 ตัวอักษร):

function r(s){for(x=e=a=1e-7;a;x-=e*a/(eval(s.replace(/x/g,x+e))-a))a=eval(s.replace(/x/g,x));return x}

แค่ให้ด้านซ้ายของสมการโดยสมมติว่าด้านขวาเป็นศูนย์

ตัวอย่าง:

  • r("x*x-9") ผลตอบแทน 3
  • r("Math.sin(x)-1")ผลตอบแทน1.5707963394347828(pi / 2)
  • r("Math.pow(2,x)-512") ผลตอบแทน 9

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


6

C - 99 ตัวอักษร

i;main(int c,char**a){for(a+=2;1+(c=getchar());)putchar(c+(**(a-1)-69?1:-1)**(*a+i++%strlen(*a)));}

โปรแกรมนี้อนุญาตให้มีการเข้ารหัสและถอดรหัสข้อมูลทุกชนิด

การใช้

ก่อนอื่น ... รวบรวมมัน!

gcc crypto.c crypto

หากคุณต้องการเข้ารหัสเนื้อหาmypreciousdata.txtด้วยกุญแจmysecretkeyและเก็บผลลัพธ์ไว้ในmyprotecteddata.txt:

cat mypreciousdata.txt | ./crypto E mysecretkey > myprotecteddata.txt

ตอนนี้ถ้าคุณต้องการดึงเนื้อหาที่ถอดรหัสของmyprotecteddata.txt:

cat myprotecteddata.txt | ./crypto D mysecretkey > mypreciousdata.txt

กุญแจยิ่งยาวยิ่งปลอดภัยยิ่งขึ้น!

คำอธิบาย

โปรดค้นหารหัสที่ขยายและแสดงความคิดเห็นด้านล่าง:

int main(int argc, char** argv)
{   
    // retrieve the first argument passed to the program (action)
    char action = argv[1][0];

    // retrieve the second argument passed to the program (key)
    char* key = argv[2];

    // initialize character position in the key
    int i = 0;

    // initialize the current input character
    char c = 0;

    // loop until we reach the end of input
    while (c != -1){
        // get a character from stdin
        c = getchar();
        if (action == 'E'){
            // encode the current character
            putchar(c + key[i]);
        } else{
            // decode the current character
            putchar(c - key[i]);
        }
        // increment the position in the key, without overflow
        i = (i + 1) % strlen(key);
    }
}

นี่คือตัวแปรของตัวเลขVigenèreที่ปรับให้เหมาะกับตัวอักษรที่มีขนาดตามcharประเภทของคุณ(ปกติคือ 256)
Paŭlo Ebermann

5

GolfScript

ฉันพยายามบีบมันให้เป็น 100 ตัวอักษร!

{{}/]{97-}%}:b~:|;"etaoinshrdlcumwfgypbvkjxqz"b:f,:&,{:x[|{&x-+&%f?}%{+}*\]}%$0=1=:x|{&x-+&%97+}%''+

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


5

JavaScript

เพื่อสร้างรหัสเฉพาะในจาวาสคริปต์
Math.random().toString(30).slice(2);

ผลิตสิ่งที่ชอบ: 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

สตริงของ 30-32 ตัวอักษรและตัวเลข

Math.random().toString(36).slice(2)

ผลิตสิ่งที่ชอบ: 'uq2sze67hsacq5mi'

ความยาวสาย 14-16



3

Fortran - 85 ไบต์

l=0;read(*,*)n;do while(n>0);i=mod(n,10);l=l+i;n=n/10;enddo;print*,"digit sum=",l;end

อ่านในจำนวนและพิมพ์ออกผลรวมของตัวเลข มีประโยชน์สำหรับปัญหาProject Euler


สิ่งนี้ช่วยได้อย่างไรสำหรับปัญหาโครงการออยเลอร์
Paŭlo Ebermann

@ PaŭloEbermann: บางทีฉันควรจะเพิ่ม "บางส่วน" ก่อน Project Euler ฉันรู้แน่ว่าปัญหา 16, 20 & 119 ใช้ผลรวมตัวเลขไม่แน่ใจเกี่ยวกับผู้อื่น แต่ปัญหาหลายอย่างของพวกเขาไม่ต้องการสิ่งนี้
Kyle Kanos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.