เขียนรูปหลายเหลี่ยมที่พิมพ์ชื่อภาษา


65

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

เกณฑ์การให้คะแนน

โปรแกรมของคุณต้องทำงานอย่างน้อย 5 ภาษา คะแนนของโปรแกรมได้รับเป็น:

(number of languages)1.5 / (length of program)

คะแนนสูงสุดจะชนะไม่ช้ากว่า 10 วันหลังจากคำตอบที่ถูกต้องครั้งแรก


การใช้โซลูชันเช่นใช้print()สำหรับ Perl, Python, PHP, การประมวลผลและ R ถือว่าไม่สำคัญหรือเป็นที่ยอมรับหรือไม่
Rob

3
A ไม่สามารถดูปัญหาได้ ความยากลำบากในการสลับการป้อนข้อมูลของการพิมพ์ต่อภาษา
mjgpy3

ฉันควรให้น้ำหนักกับจำนวนภาษาที่สูงกว่า ... ดูเหมือนว่าการเลือกให้มี 5 ภาษานั้นเหมาะสมที่สุด ฉันสงสัยว่าจะมีหลายภาษาในผลงานที่ชนะถ้าได้คะแนนn * n / length
vsz

ฉันจะแนะนำเช่นกัน จากคำตอบที่ให้มาฉันไม่เชื่อว่าฉันตีความคำถามของคุณถูกต้อง
Rob

คำตอบ:


39

Bash, C, C ++, Obj-C, Obj-C ++, Perl, PHP, Ruby, 183 ตัวอักษร

คะแนน ~ 0.1236

สำหรับรหัสที่คล้าย C และ C ฉันเป็นหนี้กับ @ baby-rabbit คนอื่น ๆ ได้แรงบันดาลใจจากการรับรู้ว่าหลายภาษามีevalคำสั่งที่จะยอมรับไวยากรณ์ที่ไม่ถูกต้องอย่างไม่เต็มใจ

เอาต์พุตชื่อภาษาไปยังเอาต์พุตมาตรฐาน บางครั้งสร้างข้อความแสดงข้อผิดพลาดจำนวนมากเกี่ยวกับข้อผิดพลาดมาตรฐานดังนั้นให้ระงับ2>/dev/nullเมื่อคุณเปิดใช้งาน

#if 0
'PHP<?/*';eval "print\$=?'Perl':'Ruby';echo Bash";exit
__END__
#endif
#include <stdio.h>
main(){puts(
#ifdef __OBJC__
"obj-"
#endif
"C"
#ifdef __cplusplus
"++"
#endif
);}//*/?>'

โซลูชัน php แสดงผล'PHP'(รวมถึงเครื่องหมายคำพูดเดี่ยว) ซึ่งอาจทำให้กฎงอเล็กน้อย

แก้ไขล่าสุด: โกน 12 chars จากข้อมูลเชิงลึกที่$=อยู่falseใน Ruby 60ใน Perl และprint$=?...เกือบจะเป็นข้อผิดพลาดใน Bash ลดการใช้งานเพิ่มอีก 7 รายการจากข้อมูลเชิงลึกการทดสอบ Perl / Ruby / Bash ตอนนี้สามารถเข้าไปในคำสั่ง eval เดียว

หากกฎสามารถทนต่อการโค้งงอได้มากขึ้นฉันจะแสดงภาษา 8 ตัวนี้ 43 ตัวละคร (คะแนน 0.5262)

print("phperluarscriptrubypythoncatebg13");

ซึ่งการส่งออกรวมถึงชื่อของล่ามสำหรับphp, perl, lua, rscript, ruby, python, และcatrot13


1
TI-Basic รองรับอันสุดท้าย; เพียงเพิ่ม 6 ตัวอักษรและรับprint("phperluarscriptrubypythontibasicatebg13");
Timtech

1
@Timtech no, TI-Basic ใช้DispหรือOutput(หรือtext(โทเค็นไม่มีprint(คำสั่ง และการรวมสตริงเป็นส่วนหนึ่งของนิพจน์ที่มีค่าจริงจะส่งผลให้ERR:INVALID SYNTAXไม่ใช่การแสดงของสตริง (ไม่ได้เป็นค่าที่ส่งคืน) (นอกจากนี้ยังไม่มี;; การใช้งาน TI-Basic :)
AJMansfield

@JMansfield จริงเกินไปฉันจะลืมได้อย่างไร:
Timtech

12
คุณสามารถแทนที่echo Bashด้วยps -ocomm= -p$$? สิ่งนี้จะเอาท์พุทชื่อของเชลล์สำหรับอย่างน้อย bash, zsh, ksh, csh และ tcsh, บางทีคนอื่น ๆ
Digital Trauma

19

C, C ++, BF, BASH และ Ruby; 280 ตัวอักษร

คะแนนประมาณ 0.040

#include "stdio.h"
#define s "C"
#ifdef __cplusplus
#define s "C++"
#endif
#ifndef s
#"+++++++++[>++++++++++>+++++++++<<-]>>-.<++++.>-.++++++++.<----.>---.<+++++++.>---.++++++++.<<++++++++++.[-]"
if [ 1 == 2 ];then
puts "Ruby"
exit
fi
echo "BASH"
exit
end
#endif
main(){puts(s);}

โปรดทราบว่าฉันใช้ระบบ Linux

รหัสที่เรียกใช้หรือรวบรวมกับคำสั่งดังต่อไปนี้ (ชื่อไฟล์เป็นtest.c)

C:

gcc test.c

เมื่อรันด้วย./a.outเอาต์พุตจะเป็นC

C ++:

c++ test.c

เมื่อรันด้วย./a.outเอาต์พุตจะเป็นC++

ทุบตี:

./test.c

ขาออก: BASH

ทับทิม:

ruby test.c

ขาออก: Ruby

BrainF ***:

ตรวจสอบโดยใช้สิ่งต่อไปนี้:

ขาออก: brainfuck

โปรดทราบว่าหากใช้ดีบักเกอร์ JS ต้องลบเครื่องหมายลบสองรายการแรก "C++"พวกเขาถูกรวมเพื่อชดเชยสัญญาณบวกในสตริงตัวอักษร นี่เป็นโครงการที่สนุกมากฉันกำลังเพิ่มภาษามากขึ้น

เพื่อเพิ่มความชัดเจนยิ่งขึ้นต่อไปนี้คือรายละเอียดของผู้แปล / ผู้แปลของฉัน:

  • gcc เวอร์ชั่น 4.6.3

  • ruby 1.9.3p194 (2012-04-20 รุ่น 35410) [x86_64-linux]

  • GNU ทุบตีรุ่น 4.2.24 (1) - ปล่อย (x86_64-pc-linux-gnu)

หมายเหตุด้านข้าง

การใช้กลอุบายของ @ baby-rabbit ฉันสามารถขยายรหัสของฉันเพื่อให้สามารถเรียกใช้งานได้ใน 7 ภาษา (เพิ่ม Object-C และ object-c ++ นี่ไม่ใช่วิธีการแก้ปัญหาของฉันตั้งแต่ฉันคัดลอกบางส่วน แต่ฉันคิดว่าฉันจะแสดงมันออกมา

อัพเดท 9.12 เพิ่ม SmallTalk รันด้วย gnu-smalltalk!

SmallTalk, C, C ++, Objective-C, Objective-C ++, BASH, BF, Ruby; 384 ตัวอักษร (คะแนน: 0.059)

#if (a)
##(true) ifTrue: ['SmallTalk' printNl]
##(ObjectMemory quit)
#"+++++++++++[>++++++++++>+++++++++<<-]>>-.<++++.>-.++++++++.<----.>---.<+++++++.>---.++++++++.<<++++++++++.[-]"
if [ 1 == 2 ];then
puts 'Ruby'
exit
fi
echo 'BASH'
exit
end
=begin
#endif
#include "stdio.h"
main(){puts(
#ifdef __OBJC__
"Objective-"
#endif
"C"
#ifdef __cplusplus
"++"
#endif
);}
#ifdef b
=end
#endif

ในรหัสข้างต้นคุณจะต้องเปลี่ยนชื่อไฟล์เพื่อสร้างชื่อของ Spam สำหรับวัตถุประสงค์ -c, obj-c ++, c และ c ++


มันจะสั้นถ้าคุณเอาท์พุทbrainf***?
ม็อบ

ใช่ฉันจะเชื่อ
mjgpy3

คุณควรใช้if [ 1 = 2 ]แทนif [ 1 == 2 ]เนื่องจากสคริปต์ที่ไม่มี hashbang จะถูกดำเนินการโดย sh ไม่ใช่การทุบตี ดวลจุดโทษอาจหรือไม่จะทุบตีบนเดเบียนมันรีบ
nyuszika7h

12

bash, c, c ++, obj-c, obj-c ++; 134 ตัวอักษร; คะแนน = 0.083

#if x
echo "bash"
exit
#endif
#include <stdio.h>
int main(){puts(
#ifdef __OBJC__
"obj-"
#endif
"c"
#ifdef __cplusplus
"++"
#endif
);}

เปลี่ยนชื่อไฟล์และเรียกใช้ / คอมไพล์เป็น:

  • sh file.sh
  • cc file.c
  • cc file.cpp
  • ไฟล์ซีซี
  • ซีซี file.mm

(โดยที่ cc คือ clang-421.10.42)


+1 เนื่องจากคำตอบ upvote อื่น ๆ อีกมากมายได้รับแรงบันดาลใจจากคุณ
เควิน

11

Lua, Ruby, VimL, ​​Sed, Befunge (129 ตัวอักษร; ~ 0.087 คะแนน)

ไม่แน่ใจว่าสิ่งนี้นับหรือไม่ - ส่วนที่ฝังอยู่ในบรรทัด Shebang ซึ่งอาจเป็นการแฮ็กเพื่อหลีกเลี่ยงข้อ จำกัด sedนอกจากนี้ยังหมายความว่ามันควรจะทำงานในฐานะผู้ปฏิบัติการและไม่ได้โดยตรงกับ

ฉันโชคดีที่ภาษาอื่น ๆ ทั้งหมด (sans Befunge) ละเว้นบรรทัด shebang โดยอัตโนมัติ (แต่เห็นได้ชัดว่า Ruby ปฏิเสธที่จะเรียกใช้ไฟล์หากมีบรรทัด shebang ที่ไม่มีสตริง 'ruby' อยู่)

#!sed sanava;s/.*/sed/;q;ruby
--"".to_i#>"egnufeB">:#,_@
if 0
then
if IO
then
puts"Ruby"
else
print"Lua"
end
else
echo"VimL"
end

ตัวอย่างการใช้งาน:

% lua tmp/glot.poly
Lua
% ruby tmp/glot.poly
Ruby
% ./tmp/glot.poly
sed
% cfunge tmp/glot.poly       # Requires Befunge-98
Befunge

:source tmp/glot.poly        # from vim
VimL                         # displayed as message

5
ว้าวโซลูชันที่ไม่รวม C
vsz

8

BF, Bash, Batch, C, vi (163 ตัวอักษร; คะแนน≈ .0686)

( <ESC>ย่อมาจากรหัส ASCII 27. )

rem (){ ((0));};true /*
rem ;goto(){ rem;}
rem ivi<ESC>ZZ'++++++++[>NUL ++++++++<NUL -]>NUL ++.++++.*/;main(){puts("C");}/*'
goto a
echo Bash
exit
:a
echo Batch
rem */

ฉันทดสอบสิ่งนี้เป็นไฟล์แบตช์ด้วย COMMAND.COM รุ่น MS-DOS 6.22 โดยค่าเริ่มต้นล่ามนั้นจะผสมบรรทัดของซอร์สโค้ดกับเอาท์พุท เพื่อป้องกันไม่ให้เกิดขึ้นให้ดำเนินการecho offก่อนเรียกใช้ไฟล์แบตช์

ในการรันโค้ด vi ซึ่งฉันทดสอบโดยใช้ Vim ให้ใช้คำสั่งต่อไปนี้:

cat /dev/null > tmpfile && vi -s polyglot.sh tmpfile > /dev/null 2>&1 && cat tmpfile

1
คุณสามารถใช้touch tmpfileหรือแทน: > tmpfile cat /dev/null > tmpfile
nyuszika7h


4

ทุก ๆ การวางหลาม 18.37291 คะแนน

import sys
print('Python '+'.'.join(map(str,sys.version_info[:-2])))

ถูกต้องทางเทคนิคหากคุณพิจารณาว่าเวอร์ชันของงูหลามทั้งหมดเป็นภาษาอื่น ขณะนี้มี 116 ไพ ธ อนซึ่งฉันเชื่อว่าให้คะแนนประมาณ 18.37291

(นอกจากนี้ฉันเข้าใจว่านี่ไม่ใช่คำตอบที่ถูกต้องนี่เป็นเพียงเพื่อความสนุกสนาน)


คุณยังได้รับ +1 ของฉันเพื่อความสนุก
vsz

การพิมพ์หมายเลขเวอร์ชันสมบูรณ์สามารถใช้งานได้หรือไม่? (สิ่งนี้จะลดลง 4 ไบต์และขยายเวอร์ชั่น Python ที่เป็นไปได้)
A

ก็โอเคไหม tio.run/##K6gsycjPM/7/…
A

3

Bash, C, Gawk, Perl, vi (145 ตัวอักษร; คะแนน≈ .077)

( <BS>หมายถึงรหัส ASCII 8 <ESC>หมายถึงรหัส ASCII 27)

#define echo//<BS><BS><BS>vi<ESC>ZZ
#define BEGIN A()
#define B\
{
echo Bash ;exit;
#define C\
}
BEGIN {printf(A=="A"?"Perl":"Gawk");exit;}
main(){puts("C");}

เพื่อรันโค้ด vi ซึ่งฉันได้ทดสอบโดยใช้ Vim เท่านั้นให้ใช้คำสั่งนี้:

cat /dev/null > tmpfile && vi -s polyglot.sh tmpfile > /dev/null 2>&1 && cat tmpfile

3

นี่คือการเลือกภาษาราคาถูก แต่ที่นี่จะไป:

CoffeeScript, JScript, Mozilla Javascript (≈ JavaScript 1.3), ECMAScript Edition 5, ECMAScript Edition 3, 223 ตัวอักษร, คะแนน≈ 0.0501)

a="undefined"
x="ECMAScript 3"
if(Array.prototype.map)
 x="ECMAScript 5"
if(typeof CoffeeScript!=a)
 x="CoffeeScript"
if(typeof uneval!=a)
 x="Mozilla JavaScript"
if(typeof WScript!=a)
 WScript.echo("JScript")
else alert(x)

5
JavaScript, JavaScript, JavaScript (≈ JavaScript), JavaScript, JavaScript, 263 ตัวอักษร, (คะแนน≈ 0) คุณสามารถทำให้มันสั้นลงa="undefined";if(typeof arguments!=a)...else if(typeof WScript!=a...โอ้และคุณยังสามารถลองตีมันได้ ....
Math chiller

@tryingToGetProgrammingStraight ใส่ทุกอย่างไว้ในบรรทัดเดียวเช่นนั้นไม่ใช่ไวยากรณ์ที่ถูกต้องใน CoffeeScript (ซึ่งเป็นภาษาที่แยกต่างหากจาก Javascript) คนอื่นนั้นสามารถโต้แย้งได้ แต่เนื่องจากมันไม่ได้ระบุว่าภาษาจะแตกต่างกันอย่างไรฉันคิดว่าการใช้งานที่แตกต่างกันมีพฤติกรรมที่แตกต่างกันทำให้พวกเขาได้รับการปฏิบัติแยกกัน
Peter Olson

ฉันยังไม่สามารถเขียนความเห็นหลายคู่สายที่เล่นกอล์ฟเพียงคุณเท่านั้นที่ดูเหมือนจะได้ใช้จะออกจาก{/ }/ ;... ความคิดที่จะใช้aเพื่อหลีกเลี่ยงการนำ"undefined"คุณยังสามารถทำแล้วb=alert b("this is also still just javascript")อย่างไรก็ตามThe golden rule of CoffeeScript is: "It's just JavaScript"(จากcoffeescript.org ) คุณยังสามารถใช้ jquery เพื่อเพิ่มภาษาที่หกได้อีกด้วย ...
Chiller คณิตศาสตร์

1
@tryingToGetProgrammingStraight การเพิ่ม jQuery จะไร้สาระเนื่องจาก jQuery เป็นห้องสมุดไม่ใช่ภาษา CoffeeScript ไม่ใช่ภาษาเดียวกับ ECMAScript คำจำกัดความของภาษาคือชุดของสตริง จำกัด เหนือตัวอักษร จำกัด ชุดของสตริงที่แสดงถึงโปรแกรม CoffeeScript ที่ถูกต้องนั้นไม่เหมือนกับชุดของสตริงที่เป็นตัวแทนของ ECMAScript ที่ถูกต้อง
Peter Olson

1
คุณสามารถทำ[].mapแทนArray.prototype.map?
ETHproductions

3

Java, Lisp, ช่องว่าง, Intercal, PHP, Befunge-98; คะแนน = .0189

นี่คือคำตอบเดิมไปยังนี้

 ;\\0"egnufeB">:#,_@SSSTTTSTTTL
;TL
;SSSSSTTSTSSSL
;TL
;SSSSSTTSTSSTL
;TL
;SSSSSTSTSTSSL
;TL
;SSSSSTTSSTSTL
;TL
;SSSSSTSTSSTTL
;TL
;SSSSSTTTSSSSL
;TL
;SSSSSTTSSSSTL
;TL
;SSSSSTTSSSTTL
;TL
;SSSSSTTSSTSTL
;SSL
;L
;L
;L
;public class H{ public static void main(String []a){System.out.println("JAVA");}}
;/*
(print "LISP")
;*/
;//<?php
; echo "PHP"
;//?>
;/*
#|
DO ,1 <- #8
DO ,1 SUB #1 <- #110
DO ,1 SUB #2 <- #32
DO ,1 SUB #3 <- #72
DO ,1 SUB #4 <- #136
DO ,1 SUB #5 <- #88
DO ,1 SUB #6 <- #136
PLEASE DO ,1 SUB #7 <- #64
DO ,1 SUB #8 <- #80
PLEASE READ OUT ,1
PLEASE NOTE |#
;*/
;// PLEASE GIVE UP

สิ่งนี้จะไม่ทำงานใน Java ทุกบรรทัดจนกว่าpublic class...จะทำให้เกิดปัญหาคอมไพเลอร์
Ypnypn

ที่น่าสนใจ ... ฉันจำได้อย่างชัดเจนว่าการทดสอบนี้ในคอมไพเลอร์และมันใช้งานได้ ... หรือบางทีความทรงจำของฉันก็ทำให้ฉันล้มเหลว ...
Juan Sebastian Lozano

@Ypnypn จำไว้ว่า "T" เป็นแท็บ "S" เป็นช่องว่างและ "L" เป็นตัวป้อนบรรทัดใน white-space ซึ่งเป็นสาเหตุที่ทำให้ไม่เกิดข้อผิดพลาดของคอมไพเลอร์
Juan Sebastian Lozano

โอ้; ที่เหมาะสม
Ypnypn

3

Windows Batch, TI-Basic, Golf-Basic 84 , QuomplexและGTB 5 * 2/93 = 0.11

::¤Quomplex¤:"'*[]'":~"GTB":g;1:d`"GOLF-BASIC 84":g`1:"TI-BASIC":Lbl 1:End
echo Windows Batch

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

Windows Batch นั้นง่ายที่สุดเพราะ::เริ่มแสดงความคิดเห็น ค่อนข้างง่ายที่จะใช้

TI-Basic ไม่รองรับอักษรตัวพิมพ์เล็กหรือแบ็คคิกทำให้ข้ามข้อความd`"GOLF-BASIC 84":g`1ซึ่ง Golf-Basic จะทำการ evaulates แสดงข้อความและส่งต่อไปยัง Label 1 ซึ่งจะสิ้นสุดลงทันที มันคล้ายกับ GTB ที่มีตัวละครที่ใช้งาน~ง่าย Ansโดยวิธีการที่สตริงกับการแสดงไม่มีจะถูกวางใน หากไม่มีคำสั่ง Display ที่ตามมามันAnsจะถูกเอาต์พุต (ไม่ใช่กรณีที่นี่)

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

ความเชี่ยวชาญของไวยากรณ์การเขียนโปรแกรม

:"'*[]'"

อัจฉริยะบริสุทธิ์ Quomplex จะข้าม:และใช้"'และ'"เป็นสตริงปล่อยให้สแต็กเอาท์พุทและตายในอนันต์ในขณะที่ลูป ( []) ในขณะเดียวกัน Golf-Basic และ TI-Basic ใช้"'*[]'"สตริงทั้งหมดเนื่องจาก'เป็นตัวดำเนินการทางคณิตศาสตร์ไม่ใช่ตัวดำเนินการสตริง


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

@ Mark True แต่เป็น::(ยังเป็นป้ายกำกับอยู่) ฉันควรจะใช้มันมากกว่าREMโดยเฉพาะอย่างยิ่งเนื่องจากเป็นสิ่งจำเป็นใน TI-Basic
Timtech

ถูก - ฉันแค่อวดความกระตือรือร้น นอกจากนี้ +1 สำหรับการใช้ไฟล์แบตช์ในสถานที่แรก :-)
ทำเครื่องหมาย

2

JScript, EcmaScript Edition 3, 5, 6, 2016, โหนด, Mozilla JavaScript (คะแนน≈ 0.1342)

คำตอบนี้มีพื้นฐานมาจากคำตอบของ Peter Olson แต่ลบด้วยCoffeeScript (เนื่องจากภาษาที่มีความสำคัญในการเว้นวรรคสามารถน่ากลัวสำหรับการเล่นกอล์ฟ)

ฉันยังเพิ่มNode , ES6และES2016และgolfedรหัสเล็กน้อยเกือบสามเท่าคะแนนเดิม

$=this,y="EcmaScript ",x=$.module?"Node":$.uneval?"Mozilla JavaScript":"".padStart?y+2016:$.Map?y+6:[].map?y+5:y+3,($.WScript||$.alert)(x)

2

16 ภาษา, 348 ไบต์, คะแนน: 0.183908046

#include <stdio.h>
#if 0
#replace "C(gcc)" "C(ecpp)"
#replace "C++(gcc)" "C++(ecpp)"
#endif
#ifdef __clang__
#define d 2
#elif __TINYC__
#define d 4
#else
#define d 0
#endif // rk:start print: "rk" \
ps -ocomm= -p$$; exit;
int x=sizeof('a')%2+d;char*arr[]={"C(gcc)","C++(gcc)","C(clang)","C++(clang)","C(tcc)"};int main(){puts(arr[x]);}

สามารถใช้งานได้ใน C (gcc), C ++ (gcc), C (ecpp), C ++ (ecpp), C (เสียงดังกราว), C ++ (เสียงดังกราว), C (tcc), sh, dash, bash, zsh, ksh, csh, tcsh, rk และ SIL


0

JScript, EcmaScript Edition 3, 5, 6, 2016, 2017, โหนด, Mozilla JavaScript (คะแนน = .174193548387), CoffeeScript (เนื่องจากภาษาที่มีความสำคัญกับช่องว่างอาจเป็นเรื่องที่น่ากลัวสำหรับการเล่นกอล์ฟ)

$=this,y="EcmaScript ",($.WScript||alert)(x=Object.values?y+2017:$.module?"Node":$.uneval?"Mozilla JavaScript":[].includes?y+2016:$.Map?y+6:[].map?y+5:y+3)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.