효율적인 과학 표기법


12

다른 날 화학 교사는 과학적 표기법 (소수를 사용하고 10을 곱하여 더 쉽게 표현할 수 있음) 에 대해 설명해 주었습니다. 기초를 배운 후, 우리는 전형적인 수학 문제를 많이했는데, 그 중 일부는 다음과 같습니다.

과학적 표기법으로 다음을 나타
냅니다
.a ) 50000000 b) 120000000000000
c) 90000000000000000000000000000000000000
d) pi ^ e ^ i ^ j ^ k ^ std :: vector
...
z) 200
...

"무엇입니까? 과학적 표기법은 많은 수의 글을 더 효율적으로 작성하는 데 사용되었지만 일부 경우는 더 효율적이지 않다고 들었습니다."

숫자를 고려하십시오

300

과학적 표기법으로 표현 :

3x10^2

과학적으로 표기된 버전은 실제로 더 많은 공간을 차지합니까? 우리는 지금 그것을 가질 수 없습니까? (스크린 공간은 소중합니다.)
과학적 표기법으로 숫자를 쓰는 것이 더 효율적인지 아닌지 스스로 결정할 수 있습니다.

직무

프로그램이나 함수는 n임의의 크기 의 단일 양수 (언어가 지원하는 것까지)를 입력으로 과학적으로 표기된 숫자 버전으로 출력해야합니다.
그러나 n후행 0을 제거하고 소수점 이하 자릿수를 제거한 후 원래 숫자 가 과학적으로 표기된 버전보다 표시 할 문자 수가 적거나 같은 경우 원래 숫자를 n대신 출력해야합니다 .

출력도 가능한 짧아야하므로 코드는 가능한 짧아야합니다.

명세서

효율적인 과학 표기법은 다음과 같이 정의됩니다.

bx10^e

b입력 숫자는 10의 거듭 제곱으로 적절히 나눈 값입니다 1 <= b < 10. 이 숫자는 모든 후행 0 (필요한 경우 소수점)을 제거해야하지만 원래 숫자의 정밀도 (언어의 소수점 이하 자릿수)를 가져야합니다. 즉 90000이된다 9, 13.500된다 1.35, 0.000675된다 6.75,이 번호 끝이 언어가 처리 할 수있는 것보다 더 많은 소수점을 포함 최대가 소수점의 최대로 반올림해야하는 경우 등.

e는 10이 증가 된 지수입니다 n = b x 10^e( n1보다 작 으면 이 숫자는 음수 여야 함을 기억하십시오 ). 이 숫자는 후행 0 또는 소수점 이하 자릿수를 가져서는 안됩니다 (주로 정수가 아닌 경우 무언가 잘못 되었기 때문에 ...).

문자 x10^ b 및 사이의 문자열에있는 그대로 유지 해야합니다e .

테스트 사례

Input -> output
1 -> 1
20 -> 20
3000000 -> 3x10^6
400000 -> 400000
0.008093 -> 0.008093
0.007835000000000 -> 0.007835
0.000003000000 -> 3x10^-6
0.00000065 -> 6.5x10^-7
0 -> 0

채점

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

다른 규칙 및 설명

  • 후행 0 및 / 또는 후행 소수점 자리는 원래 입력 번호의 문자 수에 포함되지 않습니다 n. 테스트 사례 6과 같은 경우를 염두에 두십시오.
  • 입력 번호가 1보다 작은 경우 테스트 번호 5-8에서와 같이 항상 1 자리 숫자로 0으로 시작한다고 가정 할 수 있습니다.
  • 입력 번호는 음수가 될 수 없습니다
  • 이 도전을 사소하고 표준 허점으로 만드는 내장 기능은 허용되지 않습니다
  • 출력에서 후행 줄 바꿈은 정상입니다.

편집
테스트 사례 7과 8이 10의 잘못된 거듭 제곱을 지적한 user81655에게 감사합니다. 나는 그것들을 고쳤으므로 코드가 올바르게 평가하는지 확인하십시오.


7
입력에 대한 출력이 무엇인지 물어봐야 pi^e^i^j^k^std::vector합니까?
Geobits

@Geobits Hmm, std :: vector에 숫자 값을 할당 할 수 있다면 아마도 ... 입력에 숫자 만있을 것입니다 (부동 소수점 입력을위한 소수점 이하).
MC ΔT

이 방법은 훨씬 쉬울 것이며 다음 과 같은 경우 "귀중한 화면 공간"을 덜 차지할 것입니다 e. 9000 -> 9e3(거의 9,000 이상 !)
Cyoce

1
@Cyoce 나는 그것에 대해 생각했지만 실제로 (물리적으로 작성된 것과 같이) 일반적으로 작성되는 방식에 따라이 도전을 기반으로했습니다 x10^. 그리고 그것은 질문에 대한 약간의 재 작업이 될 것입니다. 나는 그것이 게시 된 지금 적절하다고 생각하지 않습니다.
MC ΔT

1
@ghosts_in_the_code 그녀는 그렇지 않았기 때문에 "수학 수업에서 처음 배웠을 때까지 몇 년 전으로 돌아 왔습니다."
MC ΔT

답변:


4

ES6, 83 81 바이트

x=>(e=s=>s.replace(/e\+?/,'x10^'),z=e(x.toExponential()),y=e(''+x))[z.length]?z:y

toString지수 형식을 요구하는 일부 경우에는 실패 할 수 있습니다 .

편집 : @ user81655 덕분에 2 바이트가 절약되었습니다.


좋은 생각. 그건 그렇고, /정규식 끝에서 잊어 버린 것처럼 보입니다 .
user81655

또한 이것을 2 바이트를 절약하기 위해 약간 재정렬 할 수 있습니다.x=>(e=s=>s.replace(/e\+?/,'x10^'),z=e(x.toExponential()),y=e(''+x))[z.length]?z:y
user81655

@ user81655 아, 무슨 일이 있었는지 브라우저가 새 줄이 실수로 그 안에 들어갔다고 생각하는 방식으로 긴 줄을 감싸서 혼란 스러웠습니다.
Neil

2

파이썬 3 346 342 319 302 바이트

L=len;N=str(float(input()))
if N.endswith('.0'):N=N[:-2]
if'e'in N:C,P=N.split('e');N=N.replace('e','x10^')
else:
 C=N.strip('.0').replace('.','');F=N.find('.')
 if L(C)>1:C=C[0]+'.'+C[1:]
 P=((L(N) if F==-1 else F)-1-N.lstrip('0').find(C[0]))
print(min([N,'{0}x10^{1}'.format(C,int(P))],key=L))

아마 끔찍하게 골프를 쳤지 만, 이것, 이것에 대한 나의 첫번째 시도입니다. 읽기 어려우므로 잘해야합니다.

내가 아는 한, 모든 임계 값을 초과하는 숫자를 과학적 표기법으로 자동 변환하는 Python의 경향이 있더라도 모든 경우에 작동해야합니다 (시원하고 멋진 'e'는 제외). 표준 양식 번호를 반환 할 수있는 방법을 정확히 기억하지 못하지만 그렇게합니다.


2

펄 6, 96 90 바이트

나는 이것이 더 짧을 수 있다고 생각하지만, 이것은 지금 최선이다

{my \s=($_,*×(1>$_??10!!.1)…10>*>=1);min(s[*-1]~"x10^"~(1>$_??1-s!!s-1),$_,by=>&chars)}

사용법 : 이것을 변수에 할당

여기에 약간의 나쁜 논평이 있습니다.

my &f = -> $n {
    my $a = 1 > $n ?? 10 !! .1;             # If $n < 1, we will multiply by 10
                                            # in the sequence below, else by 0.1

    my @seq = ($n, * × $a ... 10 > * >= 1); # Sequence starting at $n, 
                                            # multiply the previous value by $a
                                            # until we reach a number 1 <= x < 10

    # Join the last element in @seq, "x10^", and the length of @seq,
    # with an extra subtraction for numbers less than 1.
    # this gets us our scientific notation.
    my $science = @seq[*-1] ~ "x10^" ~ @seq - (1 > $n ?? @seq*2 !! 1); 

    min($science, $n, by => &chars) # Uses the &chars function to
                                    # choose a min value and return it.
}

스왑 $_ <11>$_1 <=* <1010>*>=1
브래드 길버트는 b2gills

나는 지난 밤에 그렇게하려고했지만 잊어 버렸습니다. 집에 도착하면 업데이트하겠습니다
Hotkeys

2

TI BASIC (nspire) : 112 바이트

Define f(x)=
Prgm
string(x)➝a
If x≥1 Then
format(x,"s")➝a
EndIf
instring(a,"ᴇ")➝b
left(a,b-1)&"x10^"&mid(a,b+1)➝a
If dim(a)<dim(string(n)) or x<1 Then
Disp a
Else
Disp x
Endif
EndPrgm

설명

If x≥1 Then
format(x,"s")➝a
EndIf

형식이없는 경우 형식 함수를 사용하여 입력을 과학적 표기법으로 변환합니다. 작은 소수는 자동으로 변환됩니다.

instring(a,"ᴇ")➝b
left(a,b-1)&"x10^"&mid(a,b+1)➝a

지수를 나타내는 공상 E의 위치를 ​​찾아 "x10 ^"로 바꿉니다.

If dim(a)<dim(string(x)) or x<1 Then
Disp a
Else
Disp x
Endif

더 큰 출력을 확인하고 최적의 출력을 반환합니다. 소수점 이하 자릿수가 아닌 한, 기본적으로 작은 자릿수입니다.


0

파이썬 (3.5) 177 바이트

정규식을 사용하는 솔루션

import re
g=lambda s:re.sub(r"e\+?(-?)0?","x10^\\1",s)
def f(i):
 t=g(re.sub(r"\.[0]*e","e","%e"%i))
 u=g(re.sub(r"(\..*)[0]*$","\\1",str(i)))
 return t if len(u)>len(t) else u

설명

정규식 모듈 가져 오기

import re

람다 함수의 정의를 대체 e하여x10^

g=lambda s:re.sub("e\+?(-?)0?","x10^\\1",s)
def f(i):

과학적 표기법으로 문자열 변환

 t=g(re.sub(r"\.[0]*e","e","%e"%i))

원래 문자열에서 0 패딩 제거

 u=g(re.sub(r"(\..*)[0]*$","\\1",str(i)))

길이 비교

 return t if len(u)>len(t) else u

결과

>>> [f(i) for i in [1, 20, 3000000, 400000, 0.008093, 0.007835000000000, 0.000003000000, 0.00000065, 0]]
['1', '20', '3x10^6', '400000', '0.008093', '0.007835', '3x10^-6', '6.5x10^-7', '0']
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.