이미 짧은 수학적 표현을 단축


15

한 번은, 구식 코드를 업데이트하면서 실제 작업을하고 있었고, 좋은 구식 수학에서 πx + e x쓰인 것과 같은 표현에 부딪 쳤습니다 . 나는 내가 사용하는 언어 (APL)로 쓰여진 것보다 짧게 쓸 수 있다고 생각했기 때문에 다음과 같은 매우 간단한 과제를 제시합니다.

어떤 방법 으로든 0 개 이상의 숫자를 허용하는 함수 나 프로그램을 작성하고 x = 위의 표현식에 대해 위의 표현식의 결과를 각 결과에 대해 최소 3 개의 유효 숫자로 리턴합니다.

언어에 π 및 / 또는 e 가 없으면 3.142 및 2.718 값을 사용하십시오.

채점은 바이트 수이므로으로 답 앞에 머리말을 붙이십시오 # LanguageName, 00 bytes.

표준 루프 홀은 허용되지 않습니다.


편집 : 지금 생각 해낸 해결책은 ○+*, 발견되었습니다 . 원래 코드는 (○x)+*x입니다.


5
입력은 어떤 도메인에서 가져 옵니까? 정수, 실수, 복소수?
Martin Ender

1
@ MartinBüttner 출력이 정수로 제한되지 않는 한 원하는대로.
Adám

답변:


21

Dyalog APL, 3 자

암묵적인 문구로.

○+*

Monadic 는 인수에 π를 곱하고 monadic *는 지수 함수 exp입니다. ○+*그 기차 등입니다 (○+*)ω같다 (○ω)+(*ω). 이것이 APL이므로이 구는 임의 형태의 인수, 즉 e. 지. 임의 길이의 벡터를 전달할 수 있습니다.

동일한 용액에서 같이 J 가능 o.+^으로 o.존재 하고 ^존재 *.


:-) OP의 "편집 :"을 참조하십시오.
Adám

그래서 나는 실수로 당신을 투표했고 단지 깨달았습니다. 약간의 편집 작업을 수행하여 변경할 수 있습니까?
ankh-morpork

@ dohaqatar7 좋아요?
FUZxxl

30

이모 노미 콘, 48 바이트 / 13 자

나는 그것이 짧기 때문에가 아니라 재미 있기 때문에 그것을합니다. 여기에서 시도하십시오. 텍스트 상자에 복사하여 붙여 넣어야합니다.

😼⏪🆙😦✖😎😿➕😨😼🆙😄⏩

설명:

😼  ⏪   🆙  😦  ✖   😎  😿  ➕   😼  🆙  😄  ⏩   explanation
😼                                              take numeric input
    ⏪                                           open loop
        🆙                                      duplicate top of stack
            😦                                  push pi
                ✖                               multiply top two elements on stack
                    😎                          reverse stack
                        😿                      pop N, push e^N
                            ➕                   add top two elements on stack
                                😼              take numeric input
                                    🆙          duplicate top of stack
                                        😄      pop N, push N+1
                                            ⏩   close loop

기본 환경 인 휴대폰의 프로그램은 다음과 같습니다. the image


1
확실히 가장 재미있는 표현.
Adám

7
롤, 고양이 cat?
geokavel

3
나는이 언어를 원한다.
Faraz Masroor

2
나는 당신이 그가 하위 표현식 을 사용한다고 말할 수 있다고 생각합니다 . (• _ •) (• _ •)> ⌐ ■-■ (⌐ ■ _ ■)
애디슨

9

아르 자형, 25 24 바이트

cat(exp(x<-scan())+pi*x)    

이거예요? 그것은 할당에, 사용자로부터의 입력을 취득하는 x곱셈은 그것의 지수를 계산 pi하고, 마지막으로 cat()결과를 출력한다.

편집 : Alex A 덕분에 1 바이트가 절약되었습니다 .


1
나에게 잘 보인다.
Adám

2
24 바이트 :cat(exp(x<-scan())+pi*x)
Alex A.

이 경우 변수 대신에 인수를 설정 하지만 인수를 설정하지 않기 때문에 <-제안에서 사용한 것처럼 사용해야 합니다 . 새로운 세션에서는 현재 코드가 실패합니다. =xexpx
Alex A.

7

자바 스크립트 (ES6), 39 34 바이트

@ edc65 덕분에 5 바이트 절약

a=>a.map(x=>x*Math.PI+Math.exp(x))

입력을 숫자의 배열로 취하여 같은 형식으로 출력합니다.

축소 덕분에 이제 ES5를 준수하는 3 개의 동등한 45 바이트 프로그램이 있습니다.

for(;x=prompt();)alert(x*Math.PI+Math.exp(x))
for(M=Math;x=prompt();)alert(x*M.PI+M.exp(x))
with(Math)for(;x=prompt();)alert(x*PI+exp(x))

입력은 한 번에 하나씩 입력해야합니다. 아무 것도 입력하지 않고 OK를 누르면 종료됩니다.

세 번째는 JS의 흥미로운 기능인 with문장입니다. 사용하기에 안전하지 않은 경우도 있지만 (엄격한 모드에서는 비활성화 됨) 액세스해야 할 때마다 개체 이름과 기간을 입력하여 저장할 수 있습니다. 예를 들어 다음과 같이 할 수 있습니다.

x=[];with(x)for(i=0;i<5;i++)push(length);

push그리고 length다음의 속성으로 사용 x하여 발생되며, x[0,1,2,3,4].

이것은 변수가 아닌 모든 객체에서 작동 하므로 예를 들어 다음과 같이 할 수 있습니다.

with("0123456789ABCDEF")for(i=0;i<length;i++)alert("0x"+charAt(i)-0);

charAt그리고 length문자열의 속성으로 불린다. 16 진수 값에서 숫자 "0x"+x-0로 변환 x하므로 alert숫자 0에서 15까지입니다.


1
M.pow(M.E,x)M.exp(x)정의
edc65

@ edc65 나는 내 Math;)을 배워야한다 ;) 감사합니다!
ETHproductions

나는 with더 이상 사용되지 않는다는 것을 몰랐다 .
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ 나의 나쁜; 더 이상 사용되지 않지만 피하는 것이 좋습니다 .
ETHproductions

그것이 내가 읽은 것을 기억하는 것입니다. ^ _ ^ 어쨌든 <canvas>렌더링이나 골프에서 사용합니다.
Conor O'Brien

6

Mathematica, 11 10 바이트

N@Pi#+E^#&

LegionMammal978 덕분에 1 바이트가 절약되었습니다.


현재 작동하지 않습니다. 그러나 10 바이트 인 경우 :1.Pi#+E^#&
LegionMammal978

#와 사이에 공백이 없습니다 Pi. 이 Pi#대신 에를 사용하여 해결됩니다 #Pi. 또한 전체 표현식이 아닌 N에만 적용하면 Pi#됩니다.
DavidC

6

피스, 11 13

VQ+*N.n0^.n1N

이제 x목록으로 가져옵니다 . 예 :[1.25, 2.38, 25]

이전 (11 바이트) : +*Q.n0^.n1Q

VQ            +       * N .n0            ^ .n1 N
For each      Add     List Item * Pi     e ^ List Item
input item

온라인 통역사로 시도하면 단일 숫자로만 작동합니다. 또는 입력 형식은 무엇입니까? 사양에서는 입력이 "0 개 이상의 숫자"이고 표현식은 "주어진 숫자 각각"에 대해 평가되어야한다고 말합니다.
Reto Koradi

@RetoKoradi "스위트 스위트로 전환"체크 박스를 선택하면 여러 줄 (별도의 줄로)로 실행할 수 있습니다. 당신이 그것을 언급 한 지금 그것이 허용되는지 확실하지 않습니다.
Moose

5

진지하게, 10 바이트

,`;e(╦*+`M

육각 덤프 :

2c603b6528cb2a2b604d

온라인 시도

입력을 목록으로 취합니다 (예 : 링크 참조).

설명:

,                               Get input list
 `      `M                      Map this function over it
  ;                             Copy the input value.
   e                            exponentiate
    (                           dig up the other copy
     ╦*                         multiply by pi
       +                        add


5

TI-BASIC, 5 바이트

πAns+e^(Ans

: 이들 각각이 하나의 계산기에 바이트로 저장되도록 TI-BASIC은 ASCII 바이트를 사용하지 않는 π, Ans, +, e^(,와 Ans. 이전 표현식이 입력과 같은 것으로 가정합니다 (예 {1,2,3}:).


5

파이썬 2, 38 바이트 ( 52 49 바이트, 수학)

lambda l:[3.142*x+2.718**x for x in l]

수학 모듈을 사용해야하는 경우 :

from math import*
lambda l:[pi*x+e**x for x in l]

입력은 숫자 목록이어야합니다

f([1,2,3,4,5])

> [5.8599999999999994, 13.671524, 29.505290232, 67.143510850576007, 164.04623849186558]

2
If your language does not have π and/or e, use the values 3.142 and 2.718.... 파이썬은이 piemath모듈.
Zach Gates

@ZachGates 수학 모듈 버전을 추가했습니다.
TFeld

mathfrom math import*
wnnmaw

트윗 담아 가기
TFeld

당신은 또한 for x in l:lambda l:pi*x+e**x두 대답 모두에 대한 이해 대신에 다른 것을 깎을 수 있습니다
wnnmaw

4

MATL , 9 바이트

이 답변은 현재 버전의 언어 ( 3.1.0 )를 사용합니다 .

itYP*wZe+

입력은 다음과 같이 모든 숫자 (대괄호로 묶고 공백, 세미콜론 쉼표로 구분 된 목록)를 포함하는 벡터입니다. [5.3 -7 3+2j] 입니다. 복잡한 값이 허용됩니다. 출력에는 15 자리의 유효 숫자가 있습니다.

>> matl itYP*wZe+
> [1 2 3]
5.859874482048839 13.67224140611024 29.51031488395705

설명

간단한 조작 :

i       % input  
t       % duplicate 
YP      % pi   
*       % multiplication
w       % swap elements in stack                           
Ze      % exponential                                      
+       % addition 

4

MATLAB : 70 바이트

@(x)num2str(arrayfun(@(x)(round(pi*x+exp(x),2-floor(log10(pi*x+exp(x))))),x))

테스트:

ans(1:10)
5.86            13.7            29.5            67.2             164             422            1120            3010            8130           22100

설명 : 숫자 형식에 몇 가지 문제가있었습니다.

첫째, 질문에는 3 개의 시그 피그가 필요합니다. Matlab에는 sig-figs (소수 자릿수 만)로 반올림하는 기능이 내장되어 있지 않으므로 다음 해결 방법이 필요했습니다.

floor(log10(pi*x+exp(x)))) 가장 큰 유효 숫자를 계산합니다.

@(x)(round(pi*x+exp(x),2-floor(log10(pi*x+exp(x))))),x))입력을 받아서 x유효 숫자 3 자리로 반올림합니다.

또 다른 요구 사항은 여러 입력을 처리하는 것이 었습니다. 위의 코드는 단일 숫자로만 작동 할 수 있습니다. 이를 완화하기 arrayfun위해 각 벡터 요소의 함수를 평가하는 데 사용 합니다.

마지막 문제인 Matlab은 자체 반올림으로 arrayfun의 결과를 표시하여 출력 1.0e+04 * 0.0006이 3 sig-fig 요구 사항을 위반하는 것과 같습니다 . 따라서 num2str배열을 char형식으로 변환하는 데 사용되었습니다 .

Matlab은 수치 분석에 좋지만 솔직히 숫자 형식에 관해서는 짜증납니다.

UPD : 글쎄요, 혼란 스러워요.

유효 숫자 3 자리 이상

유효 숫자 3 자리

어쨌든 15 바이트 Matlab 솔루션이 이미 @costrom에 의해 제공 되었기 때문에 대답을이 형식으로 남겨 두겠습니다.


2
뭐?! 왜 모든 것을해야합니까?
Adám

4
이 코드 볼링입니까?
Stewie Griffin

답변에 대한 설명을 추가하겠습니다
brainkz

1
그것은 단지 말한다 최소한 당신이 지정된 경우 3 시그 무화과의 정확히 3.하지 format longg의 코드를 실행하기 전에 필요했다, 여기에 3/4 길이를 드롭 것
costrom

@costrom 예, 당신 말이 맞습니다. 그리고 당신이 이길 것을 인정합니다 :)
brainkz

4

줄리아, 12 바이트

x->π*x+e.^x

이것은 배열을 받아들이고 float 배열을 반환하는 익명 함수입니다. 호출하려면 이름을 입력하십시오 (예 :f=x->... .

줄리아는 상수 내장하고있다 πe위해 - 당신은 각각 그-π 전자를, 추측. .^연산자 지수를 벡터화한다.


3

apt, 12 바이트

N®*M.P+M.EpZ

공백으로 구분 된 숫자로 입력을받습니다. 온라인으로 사용해보십시오!

작동 원리

N®   *M.P+M.EpZ
NmZ{Z*M.P+M.EpZ

        // Implicit: N = array of inputs, M = Math object
NmZ{    // Map each item Z in N to:
Z*M.P+  //  Z times PI, plus
M.EpZ   //  E to the power of Z.
        // Implicit: output last expression

당신이 5,554 명일 때 당신을 찬성하는 것을 싫어했습니다.
Conor O'Brien

3

J, 4 바이트

o.+^

APL ○+*과 동일 하지만 J의 pi times함수 o.가 1 바이트 더 길다.



2

Par , 8 바이트

✶[″℗↔π*+

입력을 다음과 같이 받아들입니다. (1 2 3)

설명

               ## [implicit: read line]
✶              ## Parse input as array of numbers
[              ## Map
 ″             ## Duplicate
 ℗             ## e to the power
 ↔             ## Swap
 π*            ## Multiply by π
 +             ## Add

2

라켓 , 27 바이트

map(λ(x)(+(* pi x)(exp x)))

표현식의 함수 위치에 넣을 때 :

(map(λ(x)(+(* pi x)(exp x))) '(1 2 3 4))

> '(5.859874482048838 13.672241406110237 29.510314883957047 67.16452064750341)

2

CJam, 13 바이트

q~{_P*\me+}%p

공백으로 구분 된 배열로 입력을받습니다 (예 :) [1 2 3]. 온라인으로 사용해보십시오.

설명

q~    e# Read the input and evaluate it as an array
{     e# Do this for each number x in the array...
  _P* e# Multiply x by pi
  \me e# Take the exponential of x (same as e^x)
  +   e# Add the two results together
}%
p     e# Pretty print the final array with spaces

@NBZ 완료되었습니다. 설명해 주셔서 감사합니다.
NinjaBearMonkey

1

Reng v.3.3, 53 바이트

비경쟁은 도전 과제를 늦추기 때문에 간결한 상을받지는 못합니다. : P 여기 사용해보세요!

2²5³*:"G"(%3+i#II*ZA*9+(%2+#E1II0e1+ø
1-)E*(:0eø
$+n~

라인 0

다음은 0 행의 스택보기입니다.

Sequence read | Stack
2²            | 4
5³            | 4 125
*             | 500
:             | 500 500
"G"           | 500 500 71
(             | 500 71 500
%             | 500 0.142
3+            | 500 3.142
i             | 500 3.142 <i>
#I            | 500 3.142     ; I <- i
I             | 500 3.142 <i>
*             | 500 3.142*<i>
ZA            | 500 3.142*<i> 35 10
*             | 500 3.142*<i> 350
9+            | 500 3.142*<i> 359
(             | 3.142*<i> 359 500
%             | 3.142*<i> 0.718
2+            | 3.142*<i> 2.718
#E            | 3.142*<i>     ; E <- 2.718
1II0          | 3.142*<i> 1 <i> <i> 0
e             | 3.142*<i> 1 <i> <i>==0
1+            | 3.142*<i> 1 <i> (<i>==0)+1

ø다음 N 번째 줄로갑니다. 언제0is가 입력 2 행으로 바로갑니다. 그렇지 않으면 1 행으로갑니다

1 호선

1-)E*(:0eø

이것은 E i배를 곱 e^i합니다. 카운터를 (초기 적으로 I) 줄이고 STOS (우리의 실행 e전력)에 E를 곱한 다음 카운터로 돌아가서 i'현재 카운터입니다.

Sequence read | Stack (partial)
              | i'
:             | i' i'
0             | i' i' 0
e             | i' i'==0

ø그런 다음 두 가지 중 하나를 수행합니다. 카운터가 0이 아니면 "다음"0 번째 줄, 즉 현재 줄의 시작으로 이동합니다. 0이면 0e1 을 산출하고 다음 줄로갑니다.

2 호선

$+n~

$카운터를 떨어 뜨립니다 (바닥에!). +상위 2 개의 결과를 더하고 n해당 숫자를 출력 한 ~다음 프로그램을 종료합니다.

사례 1 : 입력이 0입니다. TOS는 1 ( "e ^ 0")이고 STOS는 0 (pi * 0)입니다. 그것들을 추가하면 올바른 결과를 얻을 수 있습니다.

사례 2 : 입력이 0이 아닙니다. 결과는 예상대로입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.