1 학년 카운팅 운동 자동화


36

코드 골프 챌린지

PWSSHHHH! 당신은 3000 년에 극저온 실험실에서 깨어났습니다. 당신의 경력 칩, 아마도 배달 소년의 경력 칩을 받기 위해 배정 사무소로 호위를 받으면, 프로브는 당신이 2000 년 출신임을 감지합니다. 고정 관념, 당신은 오늘날의 현대 인간에 비해 어리석은 것으로 간주 되며 초등학교를 반복해야합니다.

1 학년 교실에 들어가면 교사가 과제를주고 있습니다. 그녀는 최대 50까지 숫자를 말하거나 쓸 것입니다. 만약 그녀가 보드에 숫자를 쓰면 (예 : 25) 그 숫자까지의 숫자를 "1, 2, 3, ..., 25"로 말해야합니다 ". 그녀가 큰 소리로 번호를 말하면 (예 : "6") 태블릿에서 해당 숫자 "1, 2, 3, 4, 5, 6"까지 숫자를 써야합니다

이것은 매우 지루해지며 여전히 기능적이지만 고전적인 21 세기 프로그래밍 지식으로 프로세스를 자동화하기로 결정합니다.


객관적인:

프로그램이 입력해야합니다. 이 입력은 10 진수 ( 1 thru 50) 또는 기록 번호 ( one thru fifty)입니다.

• 입력이 10 진수 인 경우 출력 스타일을 사용하여 출력이 1에서 해당 숫자로 계산되어야합니다. (예 : 서른 둘 )

• 입력이 기록 된 숫자 인 경우 10 진수 스타일을 사용하여 출력이 1부터 해당 숫자까지 계산해야합니다. (예 : 32 )


규칙 :

입력 및 출력은 원하는 경우에 가능합니다 (원하는 경우 대문자 만 허용하는 프로그램을 만들 수 있습니다).

입력 10 진수는 숫자 유형 (예 : int) 일 필요는 없으며 숫자를 포함하는 입력 문자열 일 수 있습니다 (25 대 "25"). 어느 쪽이든 괜찮으며 프로그램에서 수락 할 것을 선택할 수 있습니다. (귀하의 프로그램은 둘 다 수락하지 않아도됩니다)

작성된 스타일은 복합 단어 사이에 하이픈이 필요하지 않지만 원하는 경우 가능합니다.

출력 값은 어떤 형태로 구분되어야하며 모든 구분 기호는 괜찮습니다. 1,2,3 1 2 3 etc

num2words (python) 등과 같은 추가 라이브러리를 추가 할 수 없습니다 (그러나 시스템 라이브러리는 괜찮습니다)

뒷이야기는 2000 년 출신이라고 말하지만 그 날짜 이후에 만들어진 언어를 사용할 수 있습니다 (lol)


이것은 이므로 가장 짧은 바이트 수를 가진 프로그램이 승리합니다!


1
파이썬의 경우 num2words 와 같은 라이브러리를 사용할 수 있습니까?
Gurupad Mamadapur

1
@AlbertRenshaw 그러나 그것을하는 내장은 어떻습니까? (Mathematica)
Pavel

1
@coredump 둘 중 하나를 선택할 수 있습니다. 두 종류의 입력을 모두 처리 할 필요는 없습니다
Albert Renshaw

2
"나의 반짝이는 금속 엉덩이를 물어봐!" 나는 스스로를 세지 않을 것입니다
RaisingAgent

1
제목이 "귀하의 (1 학년) 계산"이 아닌 "귀하의 첫 번째 (학년 계산)"라고 생각합니다
CAD97

답변:


32

펄 6 , 119113 바이트

{my \n=<①     ㊿>.map:{|map *.uniname.words[2..*].join,$^a..$^b}
/\d/??n[^$_]!!1..1+first $_,n,:k}

유니 코드 데이터베이스 FTW!

하이픈없이 대문자로 쓴 숫자를 사용합니다 (예 :) TWENTYTWO.
문자열 목록 또는 숫자 범위를 반환합니다. (로 인쇄 할 때 공간을 구분자로 사용하십시오 put.)


3
매우 영리한 아 하하하! 그것을 사랑
Albert Renshaw

13

Python3, 276 271 269 243 237 235 232 217 바이트

@smls perl 제출에서 큐를 가져 오는 중 ...

from unicodedata import*
o=[name(chr(k)).split(' ',2)[-1]for j in['①⑴','㉑㉠','㊱㋀']for k in range(ord(j[0]),ord(j[1]))]
i=input()
w=i in o
for i in range(w and o.index(i)+1or int(i)):print(w and i+1or o[i])

나는 그것이 조금 더 골프를 칠 것으로 의심된다.

시스템 라이브러리 unicodedata를 사용하여 숫자 이름을 찾습니다. 입력으로 대문자 숫자 이름 (공백으로 구분됨 FORTY TWO) 또는 십진 정수가 필요합니다.

(이것은 나의 첫 번째 코드 골프 제출입니다.)

(또한 방금 길이 (인코딩)를 잘못 계산하고 있음을 알았으므로 이전에 생각한 것보다 몇 바이트 적습니다.하지만 가장 최근의 바이트 수 만 업데이트했습니다. 죄송합니다.)


PPCG에 오신 것을 환영합니다!
AdmBorkBork

옹호 : unicodedata별도로 설치해야하는 "추가"라이브러리가 아닌 기본 설치와 함께 제공되는 시스템 라이브러리입니다.
unayok 2012 년

사이트에 오신 것을 환영합니다! 코드에서 많은 공간을 제거 할 수 있습니다 .
xnor

1
PPCG에 오신 것을 환영합니다. 인쇄물을 for루프 안에 넣고 각 출력 사이에 줄 바꿈 을 사용하면 3 바이트를 잃을 수 있습니다 . print()정수 또는 문자열인지는 신경 쓰지 않습니다. 온라인으로 사용해보십시오!
ElPedro

1
나는 당신이 할 수있는 생각 import*대신 import name바이트의 몇 저장할
밀 마법사

10

일반적인 Lisp, 297 253 243 242 144 128

(lambda(s)(#1=dotimes(u(or(#1#(i 51)(if(equal(#2=format()"~R"i)s)(return i)))s))(#2#t"~[~:;, ~]~:[~R~;~D~]"u(stringp s)(1+ u))))

세부

(lambda (s) 
  (dotimes                         ; iterate...                                                                          
      (u                           ; for u from zero below ...                
       (or                         ; if s is a string, then                   
        (dotimes (i 51)            ;   parse s by iterating from 0 to 50      
          (if (equal               ;   until we find a match between          
               (format nil "~R" i) ;   the English word(s) for i              
               s)                  ;   and the given s                        
              (return i)))         ;   (exit loop)                            
        s))                        ; otherwise, use s, which is a number      
    (format t                      ; for each U, print to standard output     
            "~[~:;, ~]~:[~R~;~D~]" ; (see below for details)                  
            u                      ; ...                                      
            (stringp s)            ; ... arguments to format                  
            (1+ u))))              ; ...                                      
  • ~[ 0 ~; 1 ~; ... ~:; else ~]사용 가능한 다음 인수 값을 기반으로하는 스위치로 적절한 하위 제어 형식으로 이동합니다. 여기서는 "0"과 "else"의 경우 만 있습니다. U부터 0부터 시작하여 첫 번째 숫자를 제외한 각 숫자 앞에 구분 기호를 삽입하는 데 사용됩니다.

  • ~:[ FALSE ~; TRUE ~]조건부 형식입니다. 여기서 우리는 입력 s가 문자열인지 아닌지를 다르게 출력합니다.

  • ~R숫자를 기본 영어 숫자로 쓰면되지만 ~D단순히 숫자를 인쇄합니다.

CL-USER> (test "five")
1, 2, 3, 4, 5

CL-USER> (test 32)
one, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, twenty-one, twenty-two, twenty-three, twenty-four, twenty-five, twenty-six, twenty-seven, twenty-eight, twenty-nine, thirty, thirty-one, thirty-two

내가이 질문에 대해 이해 한 것에서 하나의 스타일이 아닌 두 스타일을 모두 구문 분석 할 수 있어야하므로 55 ​​바이트 솔루션이 유효하지 않을 수 있습니다. "프로그램은 둘 다 받아 들일 필요는 없습니다."는 25 나 "25"를 의미합니다. 10 진수는 숫자 또는 문자열입니다.
Tom

@TomDevs 감사합니다. 이것은 혼란 스럽습니다. 확실히 f"(f 2)"가 "1, 2"를 (f "two")인쇄하고 "1, 2"를 인쇄 하도록 정의하면 나 에게 잘 어울 립니까?
coredump

네, 그렇습니다.
Tom

감사합니다 @TomDevs, 나는 그것을 고정
코어 덤프

1
@AlbertRenshaw 아니오, 영어 만; 이 기능은 이미 부풀려진 것으로 간주 될 수 있지만 일부 Lisp에서 이미 구현되었으므로 표준화되었습니다.
coredump

8

JavaScript ES6, 559526 381 368 3358 333227315 바이트

a="one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve0thir10four10fif10six10seven10eigh10nine1".replace(/1/g,'teen').split(0),b="twenty0thirty0forty0fifty".split(0),c=(n,d=Array,e=b.forEach(i=>a=a.concat(i,a.slice(0,9).map(x=>i+x))))=>1/n?a.slice(0,n).join():d.from(d(a.indexOf(n)+1),(x,i)=>i+1).join();

1 / n 트릭을 위해 어레이를 분할하고 Arnauld 아이디어를 얻은 Kritixi Lithos에게 감사드립니다.

a="one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve0thir10four10fif10six10seven10eigh10nine1".replace(/1/g,'teen').split(0),b="twenty0thirty0forty0fifty".split(0),c=(n,d=Array,e=b.forEach(i=>a=a.concat(i,a.slice(0,9).map(x=>i+x))))=>1/n?a.slice(0,n).join():d.from(d(a.indexOf(n)+1),(x,i)=>i+1).join();

console.log(c("twentyfive"));
console.log(c("fifty"));
console.log(c(50));


1
를 제거하고 var배열 ['one,'two',..]을 다음 과 같이 변경할 수 있습니다."one0two0three0...".split(0)
Kritixi Lithos

의 중복 공백 null, Array(n).
Yytsi

2
당신은 대체 할 수 있습니다 !isNaN(n)1/n. 이것은 NaN문자열 (거짓), 0이 아닌 정수 (거짓) 또는 Infinity0 (또한 진실)을위한 0 이 아닌 float를 제공합니다 .
Arnauld

모든 코드 라인
앞에

@sagiksp 예, 게시물을 편집 할 때 무언가를 엉망으로 만들었어야합니다. 지금 수정해야합니다. :)
Tom

6

파이썬 2 , 503 499 494 490 479 바이트

@JonathanAllan 덕분에 -5

l='one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#'.replace('#','teen ').split()
m='twenty','thirty','forty','fifty'
i,z,R=raw_input(),' ',range
try:n=int(i);p=(n/10)-2;o=(l+sum([[m[x]]+[m[x]+z+l[y]for y in R(9)]for x in R(p)],[])+[m[p]]+[m[p]+z+l[y]for y in R(n%10)],l[:n])[n<20]
except:j=i.split();o=map(str,R(1,(m.index(j[0])+2)*10+l.index(j[1])+2if z in i else l.index(i)+2if i in l else(m.index(i)+2)*10+1))
print','.join(o)

온라인으로 사용해보십시오!

숫자 또는 공백으로 구분 된 숫자의 철자를 입력하십시오.

골프가 적고 읽기 쉬운 버전 :

l='one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen'.split()
m='twenty','thirty','forty','fifty'
i=raw_input()
try:
 n=int(i)
 if n<20:
  o=l[0:n]
 else:
  o=l
  for x in range((n/10)-2):
   o+=[m[x]]+[m[x]+' '+l[y]for y in' '*9]
  p=m[(n/10)-2]
  o+=[p]+[p+' '+l[y]for y in' '*n%10]
except:
 if' 'in i:
  t=i.split()
  s=((m.index(t[0])+2)*10)+l.index(t[1])+2
 else:
  s=l.index(i)+2 if i in l else((m.index(i)+2)*10)+1
 r=range(1,s)
 o=map(str,r)
print','.join(o)

1
6 바이트 저장l="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nin#".replace("#","teen ").split()
Jonathan Allan

... oops 5에서 efrom을 놓쳤습니다 nineteen.
Jonathan Allan

파이썬 2를 사용하지 않으면 인쇄 시간이 길어 지지만 raw_input을 입력 할 수있는 이유가 있습니까? (다른 답변에 대한 동일한 질문)
nedla2004

@ nedla2004-아직 최신 노트북에 Python 3을 설치하지 않은 이유는 없습니다 :-)
ElPedro

6

계획, 161 , 152 , 149

(define (c x)(let((r(string->number x)))(let l((i 1))(let((n (format #f "~r" i)))(display(if r n i))(newline)(or(eq? r i)(equal? x n)(l (+ i 1)))))))

비 압축 :

(define (count limit)
  (let ((numerical-limit (string->number limit)))
    (let l ((i 1))
      (let ((current-number (format #f "~r" i)))
        (display (if numerical-limit current-number i))
        (newline)
        (or (eq? numerical-limit i)
            (equal? limit current-number)
            (l (+ i 1)))))))

예를 들어 "four"에서 4로 어떻게 변환합니까? 나는 string->number이것을 확신 하지 못하고 , 빨리 확인했고 예를 들어 string "4"에서 number 로 변환하는 데 사용되는 것 같습니다 4.
coredump

@coredump 맞습니다. (string->number "four")을 반환합니다 #f.
Michael Vehrs 2012 년

어떤 계획을 운영하고 있습니까?
coredump

1
@coredump guile 2.0.9
Michael Vehrs

6

PHP - 397 372 349 344 329 바이트

TomDevs의 JS 솔루션에서 영감을 얻음

로 교체 $a=[...]하여 25 바이트 절약$a=explode(...)

teen@ user59178 덕분에 문자열 구분 기호없이 배열로 다시 전환 하고 변수 에 저장 하여 23 바이트를 더 절약했습니다.

(int)타입 캐스팅 을 제거하여 5 바이트를 더 절약했습니다.

드롭으로 또 다른 15 바이트를 저장 $b$ifor에 @ user59178 다시 선언하고, 중괄호, 감사합니다

$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];foreach([twenty,thirty,forty,fifty] as$c){$a[]=$c;for($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];}if($argv[1]!=0)for($i=0;$i<$argv[1];)echo$a[$i++].' ';else for($i=1;$i<=array_search($argv[1],$a)+1;)echo$i++.' ';

언 골프 :

$a =[one,two,three,four,five,six,seven,eight,nine,ten,eleven,‌​twelve,thir.$t=teen,‌​four.$t,fif.$t,six.$‌​t,seven.$t,eigh.$t,n‌​ine.$t];
foreach ([twenty,thirty,forty,fifty] as $c){
    $a[] = $c;
    for ($i=0;$i<9;)
        $a[] = $c . '-' . $a[$i++];
}
if( $argv[1] !=0 )
    for ($i=0;$i<$argv[1];)
        echo $a[$i++] . ' ';
else
    for ($i=1;$i<=array_search($argv[1], $a)+1;)
        echo $i++ . ' ';

입력 문자열 또는 입력 번호로 시도하십시오.


1
골프를 할 때 사용하는 모든 숫자를 포함하여 따옴표없이 많은 문자열을 직접 사용할 수 있습니다. 이로 인해 통지가 발생하지만 무시할 수 있습니다. 또한 teen매번 반복하지 않고 변수 에 저장 하는 것이 더 짧습니다 (2 바이트) . 따라서 다음과 같이 될 것입니다 :$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];
user59178

고마워요;)
roberto06

$b두 번째 배열을 foreach에 직접 삭제 하고 배치하여 7 바이트를 더 절약 할 수 있으며 , 모든 중괄호를 삭제 $a=$c하여 (for 루프 설정에 넣어야 함 ) 6 바이트를 추가로, 포스트 증가에 의해 6 바이트를 더 절약 할 수 있습니다. $ifor 루프의 'after'비트가 아닌 그것을 사용할 때.
user59178

후행 증분을 for에서 다음 줄로 이동하여 6 바이트 (루프 당 2 개)를 절약하십시오.for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Alex Howansky

죄송합니다, @ user59178도 같은 것을 제안했습니다.
Alex Howansky

6

파이썬 2, 262 바이트

x="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#".replace("#","teen ").split()
x+=[a+"ty"+b for a in"twen","thir","for","fif"for b in['']+x[:9]]
v=input()
for s in range(1,x.index(v)+2)if v>50else x[:v]:print s

반복

입력 및 출력 문자열은 소문자로 연결되어 있으므로 예를 들어 "thirtyfive"프롬프트에서 문자열 입력을 테스트하십시오 .

모든 단어 (플러스의 목록을 작성 "fiftyone"하는 "fiftynine") x경우, 다음 테스트 종류 input프록시와 단어 v>50(문자열 파이썬 2 번호보다 크면, 상기 명세서에서 유효한 입력 범위의 모든 숫자 인 <=50) 및 print적절한이야 목록을 슬라이스 x[:v]하거나 정수 범위를 빌드하여 값을 계산합니다 range(1,x.index(v)+2).

*로 교체 a+"ty"b하여 두 바이트 모두에 하이픈을 추가하면 11 바이트가 소요 됩니다 a+"ty"+'-'*(b>'')+b.


5

볼프람 언어, 92 바이트

If[NumberQ@#, Do[Print@IntegerName@i, {i, #}], 
  Do[Print@i, {i, Interpreter["SemanticNumber"]@#}]] &

(나는 이것에 익숙하지 않습니다, 내가 잘못한 것을 알려주세요)


2
-10 바이트 :Do[Print@If[#>0,i,,IntegerName@i],{i,If[#>0,#,,Interpreter["SemanticNumber"]@#]}]&
JungHwan Min

5

자바 스크립트 (ES6), 261 바이트

참고 : z에 지정된 문자열은로 인코딩됩니다 atob. 인코딩 된 문자열에는 자바 스크립트 문자열의 유효한 문자 인 경우 에도이 사이트에 게시 할 수없는 11 바이트가 있습니다. 그래서 \ xHH 형식으로 16 진수 이스케이프를 사용했습니다. 이 이스케이프 각각은 1 바이트로 계산됩니다.
압축되지 않은 원래 문자열은 덜 골프화 된 버전입니다.

x=>(z=btoa('ö\x89ÞöÜ(öØkyï_¢êý~+Þöȱöǯz\x7f^\x8a\x08möx§{Û^\x9f×¥z÷§öÜ\x1e\x96÷½¶\x18«÷×â\x7fß}z(!÷Ûpz\x7f}~\x8aý').split(9),o=(0+z.map((v,i)=>i<20?i<13?v:(v||z[i-10])+'teen':z.slice(0,10).map(d=>(z[i]||z[i-8]||z[i-18])+'ty'+d))).split`,`,p=o.indexOf(x),o.slice(1,-~x+p+!~p).map((x,i)=>~p?i+1:x))

덜 골프

x => (
  z = '9one9two9three9four9five9six9seven9eight9nine9ten9eleven9twelve9thir99fif999eigh99twen99for9'
      .split(9),
  o = (0 + // 0 + array to build a comma separated string
       z.map( (v, i) => 
         i < 20 
         ? i < 13 
           ? v // 1 to 13 are 'as is'
           : (v||z[i-10])+'teen' // compose for 14 to 19
         : z.slice(0,10).map(d=>(v||z[i-8]||z[i-18])+'ty'+d)) // 20s, 30s, 40s, 50s
      ).split`,`, // from comma separated to array again
  // o contains strings from one to fiftynine
  p = o.indexOf(x), // look for input
  o.slice(1, -~x+p+!~p).map((x,i) => ~p?i+1:x)
)

테스트

F=
x=>(z=btoa('ö\x89ÞöÜ(öØkyï_¢êý~+Þöȱöǯz\x7f^\x8a\x08möx§{Û^\x9f×¥z÷§öÜ\x1e\x96÷½¶\x18«÷×â\x7fß}z(!÷Ûpz\x7f}~\x8aý').split(9),o=(0+z.map((v,i)=>i<20?i<13?v:(v||z[i-10])+'teen':z.slice(0,10).map(d=>(v||z[i-8]||z[i-18])+'ty'+d))).split`,`,p=o.indexOf(x),o.slice(1,-~x+p+!~p).map((x,i)=>~p?i+1:x))

function update() {
  var i=I.value
  O.textContent = F(i)
}  

update()
<input id=I value=25 oninput='update()'><pre id=O></pre>


ö\x89ÞöÜ(öØ...이 물건은 큰 hahaa입니다
Albert Renshaw


5

파이썬 (3) , 305 (303) 바이트

@ nedla2004의 조언에 따라 Python 3으로 변환되었습니다. 이제 입력 또는 출력에 쓰여진 숫자 사이에 공백이 없습니다. 예를 들어 22를 입력하십시오.

l='one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#'.replace('#','teen ').split()
m='twenty','thirty','forty','fifty'
i,R=input(),range
l+=sum([[m[x]]+[m[x]+l[y]for y in R(9)]for x in R(3)],[])
for x in R(1,l.index(i)+2)if i in l else l[:int(i)]:print(x)

온라인으로 사용해보십시오 3!

파이썬 (2) , 327 (320) 313 308 바이트

l='one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#'.replace('#','teen ').split()
m='twenty','thirty','forty'
i,R=raw_input(),range
l+=sum([[m[x]]+[m[x]+l[y]for y in R(9)]for x in R(3)],[])+['fifty']
for x in R(1,l.index(i)+2)if i in l else l[:int(i)]:print x

온라인으로 사용해보십시오 2!

163 170 177 바이트가 원래 답변보다 짧아서 대안으로 게시하고 있습니다. 이것은 for두 목록을 사용하여 숫자의 모든 문자열 표현의 전체 목록을 작성한 다음 목록에서 올바른 것을 표시하고 모든 것을 값 또는 색인으로 인쇄합니다. 각 값에 대해 새 줄을 출력합니다.


5

파이썬 2, 432422416403 바이트

이것이 향상 될 수 있다고 확신합니다. 적어도 내가 작업 할 값을 하드 코딩하고 함수를 필요로하지 않으면 20을 절약 할 수 있습니다. 텍스트 입력에서 단어를 분리 할 공간이 필요합니다. ElPedro의 답변에 대한 JonathanAllan의 의견 덕분에 6 바이트를 절약했으며 4는 수학을 정리했습니다.

def z(f):
 a,b,i,d="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#".replace("#","teen ").split()+[""],"twenty thirty forty fifty".split(),1,f>50
 if d:f=f.split();f=a.index(f[-1])+21+b.index(f[-2])*10 if len(f)>1 else b.index(f[-1])*10+20 if f[-1]in b else a.index(f[-1])+1
 while i<=f:s=i if d else a[i-1]if i<20 else b[i//10-2]+a[i%10-1];print s;i+=1

(NB : 이것의 실제 버전은 공백 대신 들여 쓰기를 위해 탭을 사용합니다. QPaysTaxes는 주어진 코드가 컴파일되도록하기 위해 제대로 렌더링되지 않았기 때문에 단일 공백을 추가했습니다. 바이트 수를 변경하지 않아야합니다.)


ElPedro의 답변에 대한 @JonathanAllan의 의견은 -6에도 적용됩니다.
Chris H

1
len(`f`)>2...`f`[2:]내가 믿는 또 다른 3 가 될 수 있습니다 . ( ...백틱이 제대로 작동하지 않는 것을 무시하십시오 )
Jonathan Allan

실제로 파이썬 2에서는 f>506을 사용할 수 있습니다 ( d
Jonathan Allan

@JonathanAllan은 정수로 숫자를 전달하는 데 작동하지 않습니다 TypeError: 'int' object has no attribute '__getitem__'. 숫자 입력을 문자열로 전달 f[2:]하면 더 가까워 지지만 부울로 계산할 때 여전히 실패합니다 ( print f[2:] and Truelen (f) <2, not True또는 이면 빈 줄을 인쇄 함 False)
Chris H

@JonathanAllan f>50은 작동합니다, 감사합니다. d루프의 끝 값을 항상 넣어서 f줄 8을 변경할 수 없으므로 드롭하는 것은 간단 하지 않습니다 if f>50.
Chris H

4

C ++ 11 484 480 477 바이트

#import<iostream>
#import<cstdlib>
#import<vector>
using namespace std;f(){int j,i=2;string s="teen";vector<string>v={"","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve"};for(;i++<9;)v.push_back(v[i]+s);v[13]="thir"+s;v[15]="fif"+s;v[18]="eigh"+s;for(i=19;i++<50;){string n[4]={"twenty","thirty","forty","fifty"};v.push_back(n[i/10-2]+v[i%10]);}cin>>s;if(i=atoi(s.c_str()))for(j=0;j++<i;)cout<<v[j]<<" ";else while(v[i++]!=s)cout<<i<<" ";}

하이픈없이 소문자로 텍스트를 입력합니다.


3

PowerShell , 362 바이트

$z=0..50|%{("0twenty0thirty0forty0fifty"-split0)[+(($b="$_"[0])-gt49)*($_-gt19)*(+"$b"-1)]+($x=(("0one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve"-split0)+(-split'thir four fif six seven eigh nine'|%{$_+'teen'})))[($_%10)*($_-gt19)]+$x[$_*($_-le19)]}
if(($n=-split$args)[0][0]-in48..57){$z[$n[0]..$n[2]]}else{$z.IndexOf($n[0])..$z.IndexOf($n[2])}

온라인으로 사용해보십시오! 단어 입력 또는 숫자 입력

이것은 올바른 엉망이며, 나는 그것에 매우 만족하지 않지만 여기에 있습니다. 골프 제안을 환영합니다.

첫 줄 $z은 전체 영어 단어의 배열로 설정 됩니다. 당신은 볼 수 있습니다 -split0숫자 112, 루프는 모든 구성하기 teen들, 그리고 풋 모든 것에 로직의 무리 함께 바로 거기입니다. 온라인으로 사용해보십시오!

두 번째 줄은 몇 가지 논리로 시작합니다. 입력 $args(문자열) -split을 공백으로 $n가져 와서 나중에 사용하기 위해 저장 한 다음 첫 [0]단어와 첫 [0]문자를 가져 와서 -in범위 48..57(즉, ASCII 0에서 9)인지 확인합니다. 우리는 십진수 입력 또는 영어 입력이 있는지 확인하고 있습니다. 온라인으로 사용해보십시오!

첫 번째 경우 10 진수 입력을 기반으로 범위를 작성 $n[0]..$n[2]하고이를 사용하여로 색인을 생성합니다 $z[...]. 다른 경우 .indexOf()에는 첫 번째 단어와 마지막 단어를 찾아서 그로부터 숫자 범위를 만듭니다. 두 경우 모두 파이프 라인에 객체 배열 (문자열 또는 정수)이 Write-Output있으며 프로그램 완료시 암시 적 으로 요소 사이에 줄 바꿈을 제공합니다.


3

스위프트 3, 402 바이트

let f=["one","two","three","four","five","six","seven","eight","nine"]
let g=["twenty","thirty","forty","fifty"]
let v=[f,["ten","eleven","twelve"],["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"},[g[0]],f.map{g[0]+$0},[g[1]],f.map{g[1]+$0},[g[2]],f.map{g[2]+$0},[g[3]]].flatMap{$0}
func c(s:String){if let i=Int(s){print(v.prefix(upTo:i))}else{for j in 1...v.index(of:s)!+1{print(j)}}}

언 골프 드 :

let f = ["one","two","three","four","five","six","seven","eight","nine"]
let g = ["twenty","thirty","forty","fifty"]

let values = [f,["ten","eleven","twelve"],["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"},
              [g[0]], f.map{g[0]+$0},
              [g[1]], f.map{g[1]+$0},
              [g[2]], f.map{g[2]+$0},
              [g[3]]].flatMap{$0}

func count(s:String){
    if let i = Int(s) {
        print(values.prefix(upTo: i))
    } else {
        for j in 1...values.index(of: s)!+1{
            print(j)
        }
    }
}

count(s:"29")
count(s:"twentyeight")

여기에 특별한 것은 없으며, 배열을 사용하여 기록 된 숫자를 백업합니다.

원래이 솔루션을 사용하여 values배열 을 계산하는 다른 방법을 생각했습니다 .

let values = f + ["eleven","twelve"]
    + ["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"}
    + [g[0]] + f.map{g[0]+$0}
    + [g[1]] + f.map{g[1]+$0}
    + [g[2]] + f.map{g[2]+$0}
    + [g[3]]

골프를 할 수있는 곳 :

let v=f+["eleven","twelve"]+["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"}+[g[0]]+f.map{g[0]+$0}+[g[1]]+f.map{g[1]+$0}+[g[2]]+.map{g[2]+$0}+[g[3]]

골프 코드에서 세 번째 줄 바꾸기

381 바이트를 기록 할 수는 있지만 "적절한 시간에 표현하기에는 표현이 너무 복잡합니다"라는 컴파일러 오류가 있습니다. 오류에 대한 자세한 정보는 여기 에서 찾을 수 있습니다.


내가 돌아올 때 여기에 빠른을보고 사랑, 나는 더이 체크 아웃해야합니다
알버트 렌쇼

3

R, 452 (430) 424 바이트

o=c("","one","two","three","four","five","six","seven","eight","nine") 
t=gsub(0,"teen",c("ten","eleven","twelve","thir0","four0","fif0","six0","seven0","eigh0","nine0"))
s=c("twenty","thirty","forty") 
p=""
for(i in s){for(j in o){p=paste0(p,i,j," ")}}
as.data.frame(t(d<-1:50))
names(d)=c(o[-1],t,as.vector(strsplit(p," ")[[1]]),"fifty")
f=function(x){if(is.numeric(x)){names(d)[1:x]}else{matrix(d[1:d[x]],dimnames=NULL)}}

#> f(5)
#[1] "one"   "two"   "three" "four"  "five" 

#> f('five')
#     [,1]
#[1,]    1
#[2,]    2
#[3,]    3
#[4,]    4
#[5,]    5

숫자를 기록 된 숫자와 함께 데이터 프레임에 숫자를 열 이름으로 배치하여 두 인쇄 (및 후속 인쇄) 간의 변환을 매우 쉽게 만듭니다.

골프를 타기위한 주요 시도는 20-49의 기록 된 숫자를 작성하는 것이 었습니다.

as.matrix숫자로만 data.frame을 인쇄 하려고 시도 했지만 여전히 행렬 헤더가 남아 있습니다. 잘만되면 괜찮습니다.

언 골프 드 :

ones <- c("","one","two","three","four","five","six","seven","eight","nine") 
teens <- c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen")
tens <- c("twenty","thirty","forty") 

p=""
for(i in tens){
  for(j in ones){
    p=paste0(p, i, j," ")
  }
}

nums <- 1:50
as.data.frame(t(nums))
names(nums) <- c(ones[-1], teens, as.vector(strsplit(p, " ")[[1]]), "fifty")
f <- function(x){
  if(is.numeric(x)){
    names(nums)[1:x]
  } else {
    matrix(nums[1:nums[x]], dimnames = NULL)
  }
}

359 바이트에 약간의 개선 :o=c("","one","two","three","four","five","six","seven","eight","nine") ; v=c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"); w=c("twenty","thirty","forty"); a=data.frame(0:50, c(o,v, sapply(w[1:3],function(y) sapply(o,function(x) paste0(y,x))),"fifty")); b=which(a==i); a[if(b<52) 2:b else 2:(b-51),ifelse(b<52,2,1)]
계산

@count는 크게 개선 된 것 같습니다! 함수의 위치 또는 인수 위치를 파악할 수 없습니다.
BLT

2

C, 342331 바이트

char*x[]={"teen","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thir","four","fif","twenty","thirty","fourty","fifty"};void main(int z,char**i){for(z=1;z<=atoi(i[3]);z++)printf("%s%s%s\n",z<16?x[z]:z<20?z^18?x[z-10]:"eigh":x[z/10+14],z>20&&z%10?"-":z>12&&z<20?*x:"",z>20&&z%10?x[z%10]:"");}

온라인으로 사용해보십시오!


내가 가장 좋아하는 언어 :
알버트 렌쇼

1
실제로 1 ~ 1 개는 필요하지 않습니다. 이 codegolf에 필요한 것은 세 번째 주장입니다. 처음 두 항상 "1 통해"입니다 (또는 "하나를 통해")은
알버트 렌쇼

@AlbertRenshaw 좋은 전화! 감사합니다 :)
Ahemone

1

SAS, 179

%macro c(n);%let f=words.;%if%length(&n)>2%then%do;%do c=1%to 50;%if%qsysfunc(putn(&c,&f))=&n%then%let n=&c;%end;%let f=2.;%end;%do i=1%to &n;%put%sysfunc(putn(&i,&f));%end;%mend;

출력은 개행으로 구분하여 로그에 기록됩니다. SAS는 숫자를 단어로 변환하기위한 내장 형식을 가지고 있는데, 이는이 과제의 주요 이점이지만, 그 반대의 경우에는 정보가 부족합니다.

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