Bạn phải tạo một polyglot đầu ra bình phương của đầu vào bằng một ngôn ngữ và căn bậc hai của đầu vào trong một ngôn ngữ khác. Câu trả lời ngắn nhất bằng byte thắng!
Bạn phải có độ chính xác ít nhất 3 chữ số thập phân và đầu vào sẽ luôn là số dương.
Bạn phải tạo một polyglot đầu ra bình phương của đầu vào bằng một ngôn ngữ và căn bậc hai của đầu vào trong một ngôn ngữ khác. Câu trả lời ngắn nhất bằng byte thắng!
Bạn phải có độ chính xác ít nhất 3 chữ số thập phân và đầu vào sẽ luôn là số dương.
Câu trả lời:
U
Căn bậc hai trong Jolf, hình vuông trong MATL.
Hãy thử trực tuyến! (MATL)
Hãy thử mã Jolf. Chỉ hoạt động trên Firefox.
Cả hai đều là 1 byte, vì MATL và Jolf đều sử dụng bảng mã ASCII / ASCII mở rộng, vì vậy tất cả các lệnh là 1 byte.
#include<math.h>
float f(float n){auto p=.5;return pow(n,2-p*3);}
Câu trả lời gốc:
#include<math.h>
float f(float n){return pow(n,sizeof('-')-1?2:.5);}
Đối với cả hai phiên bản, C sản xuất n^2và C ++ sản xuất sqrt(n).
autocó nghĩa là "phân bổ trên ngăn xếp". Từ khóa khá vô dụng vì dù sao đó cũng là mặc định, vì vậy C ++ đã tái sử dụng nó để có nghĩa khác. Mặc dù vậy, trong C, nó không thể hiện bất kỳ ý kiến nào về loại p(đó là lớp lưu trữ, không phải loại), do đó, nó được tính là intmặc định (hiện tại inthành vi mặc định này không được khuyến khích và có khả năng chỉ tồn tại vì một số người tiền nhiệm của C hoàn toàn không có kiểu dữ liệu, nhưng trình biên dịch vẫn hiểu nó). Và tất nhiên, (int)0.5là 0.
n^2.
lambda n:n**(1/2or 2)
Python 2.x tạo ra n^2, Python 3.x tạo ra sqrt(n).
Lưu 2 byte nhờ @Dennis!
or?
/không chia số nguyên ( 1/2==0). Trong Py3, nó thực hiện phân chia điểm nổi ( 1/2==0.5). 0Là falsey.
*.
2sable tính hình vuông. Hãy thử trực tuyến!
Jelly tính căn bậc hai. Hãy thử trực tuyến!
* Read the input twice and compute the product of both copies.
This pushes the square of the input.
. Unrecognized token (ignored).
. Numeric literal; yield 0.5.
* Raise the input to the power 0.5.
This yields the square root.
#/*
lambda n:n**.5;'''*/
float a(i){return i*i;}//'''
Python: Hãy thử trực tuyến!
Hoạt động bằng cách sử dụng ý kiến để polyglot. Phần còn lại là khá lý giải.
Lần đầu tiên sử dụng C!
stdio.htrong trường hợp đó?
Xuất ra hình vuông trong Ohm, căn bậc hai trong Jelly.
Ohm và Jelly sử dụng các mã đơn byte khác nhau, vì vậy chương trình sẽ xuất hiện khác nhau trong mỗi mã hóa.
xxd hexdump của chương trình:
00000000: fd7f 0a ...
Sử dụng bảng mã của Jelly, nó xuất hiện như thế này:
’
½
Jelly lấy dòng dưới cùng là liên kết chính của nó và bỏ qua các liên kết khác trừ khi được gọi cụ thể. Vì vậy, ở đây nó chỉ thực hiện căn bậc hai ( ½) và ngầm xuất nó.
Sử dụng codepage của Ohm (CP437), nó xuất hiện như thế này:
²⌂◙
²là hàm vuông ⌂và ◙cả hai đều không được xác định, vì vậy chương trình chỉ bình phương đầu vào đọc ngầm và đầu ra ngầm.
½một byte, ²bản đồ sẽ làm gì? Có phải chỉ là rác mà vẫn bị bỏ qua? Và ngược lại cho Ohm? Sau đó, nó có vẻ là 2 byte.
²trong Ohm là ở điểm mã 5. Mã điểm 5 trong Jelly là %và không làm gì cả, vì vậy không có vấn đề gì với dòng đầu tiên. Giả sử rằng ½trong Jelly là 27, và mã điểm 27 trong Ohm là Jvà không làm gì cả, vì vậy không có vấn đề gì với dòng thứ hai. Vì vậy, nếu bạn có một tệp 00000101<newline>00011011, đó là 3 byte. Tôi đoán vấn đề duy nhất là nếu dòng mới ở một vị trí khác trong các trang mã.
float f(float n){return n//*
/sqrt(n)//*/1*n
;}
Yêu cầu -lmcờ (+3)
C89 sản xuất n^2, C99 sản xuất sqrt(n). Để kiểm tra trong C89, hãy thử trực tuyến!
Bắt C89 thực hiện sqrtphiên bản nên lấy ít mã hơn, nhưng nó khăng khăng đòi khai báo sqrthàm với ints, vì vậy đây là cách tốt nhất tôi có thể quản lý.
@(x)x^(2-3*any(version>60)/2)
Điều này xuất ra hình vuông trong Octave và căn bậc hai trong MATLAB.
Giải trình:
Cú pháp tất nhiên giống hệt nhau trong MATLAB và Octave (ít nhất là đối với đoạn mã nhỏ này).
Điều này tạo ra một chức năng ẩn danh:
@(x) % Take x as input
x^( ) % Raise x to the power of ...
version % Returns the version number
% 4.2.0 in Octave,
% '9.2.0.538062 (R2017a)' in MATLAB
version>60 % 'R' is larger than 60. All others are smaller
3*any(version>60)/2 % Checks if there is an 'R' and multiplies it by 1.5 if it is.
2-3*any(version>60) % 2-1.5*(is there an 'R')
sqr(x)
Căn bậc hai trong Cơ bản và hình vuông trong Delphi.
Bạn có thể sử dụng trình gỡ lỗi để kiểm tra biểu thức, từ đó đáp ứng mọi yêu cầu đầu ra!
xgì? Bạn không thể cho rằng nó được lưu vào một giá trị. Nhưng bạn thực sự có thể loại bỏ (x)và gắn nhãn là trả về một hàm.
Các byte sau tạo nên chương trình:
FD B9 74
05AB1E tính căn bậc hai, bình phương Fireball.
Giải thích (05AB1E - ý¹t):
ý Pushes an empty string to the stack (not entirely sure why)
¹ Push first input
t Square root
Giải thích (Quả cầu lửa - ²╣t):
² Square input
╣ Unassigned
t Unassigned
Đôi khi, nó giúp có một ngôn ngữ không đầy đủ;)
Điều này thực sự khó khăn hơn tôi mong đợi! Tôi khá ngạc nhiên về mã của tôi dài bao nhiêu.
eval(['alert((_=prompt())*_)','echo$argv[1]**.5'][+![]]);
Làm thế nào nó hoạt động?
Điều này hoạt động bằng cách chọn mã để chạy, từ mảng.
Phát hiện PHP và JavaScript được thực hiện với +![].
Trong PHP, [](mảng trống) là một giá trị giả, trong khi trong JavaScript, nó là một giá trị trung thực (các đối tượng (ngoại trừ null) luôn luôn trung thực, thậm chí new Boolean(false)là trung thực!).
Nhưng, tôi cần lấy nó thành một giá trị số, vì vậy, tôi chỉ cần sử dụng một not( !) và chuyển đổi nó thành số nguyên (với +).
Bây giờ, PHP mang lại giá trị 1, trong khi JavaScript mang lại 0.
Đặt mã bên trong một mảng, tại các chỉ mục đó, sẽ cho phép chúng tôi chọn đúng mã cho ngôn ngữ mong muốn.
Điều này có thể được sử dụng như [JS,PHP][+![]], để có được mã của ngôn ngữ phù hợp.
Trên polyglots trước, tôi đã sử dụng '\0'=="\0", đó là truetrong JavaScript (kể từ khi \0được phân tách như NULL-byte) và falsetrong PHP (các '\0'sẽ không được phân tích như NULL-byte, so sánh chuỗi chữ \0với NULL-byte).
Tôi rất vui vì tôi đã quản lý để giảm kiểm tra này xuống +!'0'.
Tôi thậm chí còn hạnh phúc hơn về @rckd , đã giảm nó xuống phiên bản hiện tại!
Từ đó trở đi, nó chỉ đơn giản evallà mã yêu cầu.
PHP
PHP sẽ thực thi echo$argv[1]**.5(tương đương với echo sqrt($argv[1]);căn bậc hai số), nhận giá trị từ đối số thứ 2 và hiển thị nó trong đầu ra tiêu chuẩn.
JavaScript
JavaScript thực thi alert((_=prompt())*_), hiển thị số bình phương trong một alert.
Cảm ơn bạn @rckd vì đã lưu 1 byte và @ user59178 vì đã lưu 3 byte!
echo$argv[1]**.5thay vìecho sqrt($argv[1])
nqƓ½
nq # Ignored by Jelly, push n**2 in 05AB1E then quit.
Ɠ½ # Ignored by 05AB1E due to quit, push sqroot of input in Jelly.
Một số người khác đã đưa ra một quan điểm tốt, tôi đoán vì các ký tự UTF-8 không chia sẻ cùng một hoạt động trên các trang mã mà về mặt kỹ thuật, mỗi byte có 2 byte để mã hóa. Tuy nhiên, khi xem xét điều này về mặt kết xuất hex:
6e 71 93 0a
Trong mã hóa CP1252 của 05AB1E, kết quả này là:
nq“\n
Có nghĩa là nó vẫn sẽ xuất ra hình vuông và thoát, bỏ qua phần còn lại. Khi các byte này được mã hóa bằng mã hóa của Jelly:
nqƓ½
Đó là mã dự định ban đầu, khi được thực thi, dẫn đến kết quả mong muốn là lấy đầu vào và lấy sqrt.
Ɠvà ½yêu cầu hai byte được mã hóa. Tuy nhiên, chuỗi byte 6e 71 93 0a( nqƓ½đối với Jelly, nq“\nđối với CP-1252) nên hoạt động ở cả hai ngôn ngữ.
½ở trên cả hai trang mã không cho phép nó được tính là một vì chúng hoạt động khác nhau? Tôi vẫn còn mờ trên toàn bộ điều trang mã.
6e 71 93 0avì vậy không có "lý thuyết" nào về việc yêu cầu 4 byte. Chỉ cần yêu cầu 4 byte. Thực tế là trong mã hóa tiêu chuẩn của 05AB1E, nó đọc một thứ làm những gì bạn muốn, trong khi ở mã hóa tiêu chuẩn của Jelly, nó đọc một thứ khác làm những gì bạn muốn. Bên cạnh đó, chỉ vì 2 mã hóa có thể mã hóa cùng một ký tự không có nghĩa là nhân vật đó sẽ giống nhau ở cả hai. Chỉ cần nghĩ về mã hóa như một cypher số với bảng tra cứu đã được chia sẻ và hy vọng rằng nó sẽ cung cấp cho bạn một mô hình tinh thần khởi đầu tốt.
ld_*GX^!
Tính toán hình vuông trong CJam ( Thử trực tuyến! ) Và căn bậc hai trong MATL ( Thử trực tuyến! ).
ld e# Read input line and interpret as a double
_ e# Duplicate
* e# Multiply. Pops the input number twice, pushes its square
G e# Push 16
X e# Push 1
^ e# Bitwise XOR. Pops 16 and 1, and pushes 17
! e# Negate. Pops 17, pushes 0
e# Implicitly display. This prints the squared input with decimals,
e# immediately followed by the 0 coming from the negate operation
e# Even if the square of the input number is an integer, say 5,
e# it is displayed as 5.0, so including an extra 0 always gives a
e# correct result
l % Push 1. This is a number or equivalently a 1×1 array
d % Consecutive differences. Pops 1, pushes [] (empty array)
_ % Negate (element-wise). This leaves [] as is
* % Implicitly input a number and push it. Multiply (element-wise):
% pops [] and the input number, pushes []
G % Push input number again
X^ % Square root. Pops number, pushes its square root
! % Transpose. For a number (1×1 array) this does nothing
% Implicitly display. The stack contains [] and the result; but
% [] is not displayed at all
( """ )
fsqrt
\ """);lambda n:n*n
Dùng thử trực tuyến: Python 2 (vuông) | Forth (sqrt)
Điều này đánh giá một hàm ẩn danh trong Python và một hàm tích hợp fsqrttrong Forth. Python có thể có một chức năng được đặt tênf cho thêm 2 byte bằng cách đặt f=trước lambda.
Chương trình Forth có một dấu phẩy động theo nghĩa đen , trong Forth phải được viết bằng ký hiệu khoa học. Pi rút ngắn đến 3 chữ số thập phân ( 3.141) sẽ được viết như thế này:
3141e-3
f=a=>eval(`try{eval("a**2")}catch(e){Math.sqrt(a)}`)
Trả về bình phương của đầu vào trong ES7 và căn bậc hai trong ES6. Khá khó để kiểm tra, trừ khi bạn có một trình duyệt cũ hơn hỗ trợ ES6 nhưng không phải ES7.
f=a=>eval(`try{eval("a**2")}catch(e){Math.sqrt(a)}`)
console.log(f(4));
ECHO"$argv[1]"**2;#];rdmq
Tính bình phương trong PHP và căn bậc hai trong CJam. Phải được chạy bằng -rPHP.
Tăng đối số dòng lệnh đầu tiên ( $argv[1]) lên lũy thừa 2 và xuất ra nó. Ở đây $argv[1]thực sự được đặt dưới dạng một biến nội tuyến trong một chuỗi, được truyền tới một số trước khi thực hiện lũy thừa. Đây là vìv không phải là một hướng dẫn hợp lệ trong CJam và sẽ khiến nó bị lỗi trong khi phân tích cú pháp, nhưng đặt nó trong một chuỗi sẽ không gây ra bất kỳ vấn đề nào.
# bắt đầu một bình luận, vì vậy mọi thứ sau đó được bỏ qua.
Phần đầu tiên của mã, ECHO"$argv[1]"**2;#đẩy một loạt các giá trị và thực hiện một loạt các hoạt động, tất cả đều hoàn toàn vô dụng. Điều quan trọng duy nhất là chúng không gây ra bất kỳ lỗi nào, bởi vì ngay sau đó là ];, nó bao bọc toàn bộ ngăn xếp trong một mảng và sau đó loại bỏ nó.
Sau đó, nó đọc một số kép từ input ( rd) và lấy căn bậc hai ( mq) của nó và ngầm xuất nó.
;float f(float x){return sqrt(x);}char*
F="_this^2";
Trong tập lệnh OFP, một dấu chấm phẩy ở đầu dòng làm cho dòng đó trở thành một nhận xét, trong khi C không quan tâm đến dấu chấm phẩy bổ sung.
C:
Ngôn ngữ kịch bản OFP:
Lưu như init.sqstrong thư mục nhiệm vụ, sau đó gọi nó vớihint format["%1", 2 call F] .
Ngôn ngữ 2D!
/&:*.@
>in:o#p;
/&:*.@
/ divide top two (no-op)
& read decimal input
: duplicate
* square
. output
@ terminate
/ mirror up, then right
>in:o#p;
i read line of input
n cast to number
:o# square root
p print
; terminate
Man, tôi thực sự có niềm vui với cấu trúc liên kết Jelly.
:*n;
½
Tính bình phương trong> <> và căn bậc hai trong Jelly .
-vlà phù hợp với [câu trả lời được bình chọn hàng đầu [( codegolf.meta.stackexchange.com/a/11431/44874 ) trong một câu hỏi meta xử lý trường hợp này. Trình ><>thông dịch cần điều đó -vvà đây là cách gọi đơn giản nhất có thể.
0//1or exec("function=lambda a:(lambda b:a);x=0")
y=2//2/2
f=(function(x)(x**y))//1 or(lambda x:x**y)
Căn bậc hai trong JS, hình vuông trong Python.
Hoạt động trên Firefox (đã thử nghiệm trên FF 52) và yêu cầu phải (function(x) x)(42) === 42có cú pháp hợp lệ. Cũng yêu cầu ES7 cho người **vận hành.
x=>x**ythay thế? Hoặc Python sẽ nghẹt thở về điều đó?
functionkhông phải là một từ khóa, nó là một định danh hợp lệ. Vì vậy, tôi chỉ gán một hàm noop cho nó (bên trong execcâu lệnh).
Cập nhật: Tôi phải thừa nhận thất bại. Câu trả lời bash / sh của Digital Trauma thanh lịch hơn nhiều so với câu trả lời này.
bc -l<<<"sqrt($1^(($(kill -l|wc -l)*3-3)/7+1))"
bash sản xuất n^2 , sh sản xuất sqrt(n).
bcchỉ cần thiết để sqrtcó thể được tính toán. Sự khác biệt trong hành vi là giữa bash và sh.
OK, về mặt kỹ thuật, "sh" tôi đang sử dụng vẫn là bash, nhưng bash ở chế độ "POSIX" (điều này xảy ra nếu bạn gọi /bin/shthay vì /bin/bashtrên các hệ thống /bin/shcó bí danh cho bash). Nếu đây là trường hợp trên hệ thống của bạn, bạn có thể kiểm tra với:
/bin/bash prog.sh 4
/bin/sh prog.sh 4
Điều này dựa trên một trong những khác biệt được giải thích ở đây: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html
kill -l(liệt kê các tín hiệu có thể; không thay đổi bất cứ điều gì) trong bashvà sh. Đó là một trong nhiều điểm khác biệt bạn có thể tìm thấy ở đây: gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html
input a
?a^2'^.25
Trong QBasic , nó lấy một số và in số đó bình phương. Phần còn lại của mã bị bỏ qua vì QBasic xem nó là một nhận xét ( ').
QBIC sử dụng cùng một câu lệnh đầu vào. Sau đó, nó tiếp tục in cùng một số bình phương, sau đó nâng lên sức mạnh của một phần tư, hiệu quả root nó hai lần. Điều này là do 'được xem như là một mã theo nghĩa đen: Mã QBasic thuần túy không được phân tích cú pháp bởi QBIC.
EDIT: Đó là một byte ngắn hơn để hoạt động ngược lại.
RTa
²
Jelly bắt đầu thực thi ở dưới cùng của mã ('liên kết chính' của nó) và xem liệu nó có cần gì cao hơn không: nó nhìn thấy lệnh để vuông và chăm sóc đầu vào và đầu ra một cách ngầm định.
Pip thực hiện dòng trên cùng, bình phương (đọc ngầm từ dòng cmd) var a và ngầm in nó. Dòng dưới cùng được bỏ qua.
PRTaVS.
Lấy bình phương của một số trong Ngôn ngữ Wolfram và lấy căn bậc hai trong PHP;
n^2
echo sqrt(_GET["n"]);
Dòng đầu tiên là Ngôn ngữ Wolfram. Đầu tiên, bạn là người thay đổi n trong thanh tìm kiếm trong Wolfram Alpha, do đó mã cũng là đầu vào. Sau đó, nó sẽ tạo ra câu trả lời khi nhấn enter
n^2
Dòng thứ hai là PHP, Nó lấy căn bậc hai của n được nhập vào thanh địa chỉ (ví dụ: ppcg.php.net?n=213, trong đó 213 là giá trị của n)
echo sqrt($_GET["n"]);
p=^4 :
bc<<<"sqrt($1)$p"
Trên máy Mac, shđang bashchạy ở chế độ Posix và trong trường hợp này là theo https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html :
Các câu lệnh gán trước các nội dung đặc biệt POSIX vẫn tồn tại trong môi trường shell sau khi tích hợp hoàn thành
Do đó sh, biến pcó giá trị ^4sau khi :chạy, nhưng đối với bash, biến pchỉ có giá trị này trong khi: được chạy và trống sau đó.
Vẫn còn thực sự bashdưới vỏ bọc, một số bashism như <<<herestrings vẫn hoạt động cho cả trường hợp bash và sh.
Trên Ubuntu 16.01, shlà một liên kết tượng trưng dash, không thực hiện các <<<bước tiến. Vì vậy, chúng tôi có điều này thay thế:
p=^4 :
echo "sqrt($1)$p"|bc
Chương trình này bình phương đầu vào trong Hồng y và lấy căn bậc hai trong Octave
%:=t.
disp(sqrt(input("")))
Vì vậy,% là nhận xét dòng đơn trong Octave để nó chỉ cần nhập và in căn bậc hai
disp(sqrt(input("")))
Vì vậy, chương trình Hồng y không gặp lỗi chia 0 và chết, chương trình
%:=t.
đã được thay đổi với một khoảng trắng, bị bỏ qua bởi cả hai chương trình
Chương trình bắt đầu ở%
Nó nhận đầu vào và lưu trữ giá trị dưới dạng hoạt động:
Nó đặt giá trị không hoạt động bằng với hoạt động =
Nó nhân hoạt động của t không hoạt động
Cuối cùng nó xuất giá trị hoạt động.
<body onload=alert(<?=$x*$x.')>'.sqrt($x)?>
Đầu vào như sau:
<?php $x = 10; ?>
Kinda tự giải thích, nhưng nó có phù hợp với các quy tắc? Mã golf đầu tiên của tôi tho :-)
alert(<?=$x*$x.')>'.sqrt($x)?)
Không cạnh tranh vì:
+và ⓟ, CGL về mặt kỹ thuật là một ngôn ngữ hợp lệ. x=>x**2
//-₂
Đơn giản: một hàm mũi tên ẩn danh trả về bình phương đầu tiên của nó bình phương. Mã ngôn ngữ không tên được nhận xét.
Các không gian không bị phá hủy trước khi dòng đầu tiên hoạt động như một nhận xét. Các /s là không-op. Dòng -thứ hai có nghĩa là giảm số ngăn xếp hiện tại, theo mặc định là 0. Sau đó đặt nó thành -1, nơi lưu trữ đầu vào. Mục ₂thay thế mục đầu tiên trong ngăn xếp hiện tại bằng căn bậc hai của nó, bây giờ là nơi đặt đầu vào. Theo mặc định, ngăn xếp hiện tại được xuất ra, xuất ra căn bậc hai của đầu vào.