Tự động hóa bài tập đếm lớp một của bạn


36

Thử thách CodeGolf

PWSSHHHH! Bạn thức dậy trong phòng thí nghiệm đông lạnh vào năm 3000. Sau khi được hộ tống đến văn phòng phân công để nhận chip sự nghiệp, có lẽ là của một cậu bé giao hàng, một người thăm dò phát hiện ra rằng bạn đến từ năm 2000. Vì điều này, và một vài định kiến, bạn được cho là ngu ngốc so với ngày nay con người hiện đại và bị buộc phải học lại lớp.

Bạn vào lớp học lớp một của bạn và giáo viên đang giao bài tập. Cô ấy sẽ nói hoặc viết một số lên tới 50. Nếu cô ấy viết số đó lên bảng (ví dụ: 25) thì bạn phải nói các số lên đến số đó "một, hai, ba, ..., hai mươi lăm ". Nếu cô ấy nói to số (ví dụ: "sáu") thì trên máy tính bảng của bạn, bạn phải viết các số lên đến số đó "1, 2, 3, 4, 5, 6"

Điều này trở nên rất tẻ nhạt và bạn quyết định bạn sẽ tự động hóa quá trình với kiến ​​thức lập trình thế kỷ 21 vẫn còn hoạt động của bạn.


Mục tiêu:

Chương trình của bạn nên có một đầu vào. Đầu vào này sẽ là số thập phân ( 1 thru 50) hoặc số viết ra ( one thru fifty).

• Nếu đầu vào là số thập phân, đầu ra của bạn sẽ được tính từ một đến số đã nói, sử dụng kiểu viết ra. (ví dụ ba mươi hai )

• Nếu đầu vào là số được ghi, đầu ra của bạn sẽ được tính từ 1 đến số đã nói, sử dụng kiểu thập phân. (ví dụ 32 )


Quy tắc:

Đầu vào và đầu ra có thể trong bất kỳ trường hợp nào bạn chọn (vì vậy bạn có thể tạo một chương trình chỉ chấp nhận chữ hoa nếu muốn).

Các số thập phân đầu vào không phải là loại số (ví dụ int), chúng có thể là một chuỗi đầu vào chứa các số (25 so với "25"). Hoặc là tốt và bạn có thể chọn cái nào bạn muốn chương trình của bạn chấp nhận. (Chương trình của bạn không cần chấp nhận cả hai)

Kiểu viết ra KHÔNG yêu cầu gạch nối giữa các từ ghép, nhưng bạn có thể nếu muốn.

Các giá trị đầu ra phải được phân tách ở một số dạng, bất kỳ dấu tách nào cũng được 1,2,3 1 2 3 etc

Bạn không thể thêm các thư viện bổ sung như num2words (python), v.v (Tuy nhiên thư viện hệ thống vẫn ổn)

Mặc dù câu chuyện ngược cho biết bạn đến từ năm 2000, bạn có thể sử dụng các ngôn ngữ được tạo sau ngày đó (lol)


Đây là , vì vậy chương trình có số lần thắng ngắn nhất!


1
Chúng tôi có được phép sử dụng các thư viện như num2words trong trường hợp python không.
Gurupad Mamadapur

1
@AlbertRenshaw nhưng những gì về nội dung làm điều đó? (Mathicala)
Pavel

1
@coredump Hoặc là bạn có thể chọn cái này hoặc cái kia hoặc cả hai. Nó không phải xử lý cả hai loại đầu vào
Albert Renshaw

2
"Cắn cái mông kim loại sáng bóng của tôi!" Tôi sẽ không đếm chính mình
RaisingAgent

1
Tôi cứ nghĩ tiêu đề là "lần đầu tiên (đếm lớp)" chứ không phải "đếm (lớp một) của bạn"
CAD97

Câu trả lời:


32

Perl 6 , 119 113 byte

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

Cơ sở dữ liệu Unicode FTW!

Sử dụng các số viết tắt chữ hoa mà không cần hypen, ví dụ TWENTYTWO.
Trả về một danh sách các chuỗi hoặc một dãy số. (Cả hai đều sử dụng không gian làm dấu phân cách khi được in put.)


3
Rất thông minh ahahaha! Thích nó
Albert Renshaw

13

Python3, 276 271 269 243 237 235 232 217 byte

Lấy một gợi ý từ đệ trình perl @smls ...

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])

Tôi nghi ngờ nó có thể được đánh gôn xa hơn một chút.

Nó sử dụng thư viện hệ thống unicodedatađể tra cứu tên cho các số. Nó yêu cầu tên số chữ hoa (cách nhau bởi dấu cách:FORTY TWO :) hoặc số nguyên thập phân làm đầu vào.

(Đây là lần gửi mã golf đầu tiên của tôi.)

(Tôi cũng chỉ nhận thấy rằng tôi đang tính sai độ dài (mã hóa), do đó, nó ít hơn một vài byte so với suy nghĩ trước đây. Tuy nhiên, tôi chỉ cập nhật số byte gần đây nhất. Rất tiếc.)


Chào mừng đến với PPCG!
admBorkBork

Trong vận động: unicodedatalà một thư viện hệ thống đi kèm với cài đặt mặc định, không phải là thư viện "phụ" cần được cài đặt riêng.
unayok

Chào mừng đến với trang web! Bạn có thể loại bỏ nhiều khoảng trắng khỏi mã của bạn .
xnor

1
Chào mừng đến với PPCG. Bạn có thể mất 3 byte bằng cách đặt bản in bên trong một forvòng lặp và có dòng mới giữa mỗi đầu ra. print()không quan tâm nếu nó là một số nguyên hoặc một chuỗi sau đó. Hãy thử trực tuyến!
ElPedro

1
Tôi nghĩ rằng bạn có thể import*thay vì import namelưu một vài byte
Wheat Wizard

10

Lisp thông thường, 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))))

Chi tiết

(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 ~]là một công tắc, dựa trên giá trị của đối số khả dụng tiếp theo, chuyển sang định dạng điều khiển phụ thích hợp. Ở đây, tôi chỉ có một trường hợp "0" và cho "khác". Điều này được sử dụng để chèn một dấu phân cách trước mỗi số trừ số đầu tiên, nhờ U bắt đầu từ số không.

  • ~:[ FALSE ~; TRUE ~]là một định dạng có điều kiện; ở đây chúng ta xuất ra những thứ khác nhau cho dù s đầu vào có phải là một chuỗi hay không.

  • ~Rviết một số dưới dạng số tiếng Anh chính, trong khi ~Dchỉ cần in số đó.

Ví 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

Từ những gì tôi hiểu về câu hỏi, bạn phải có khả năng phân tích cả hai kiểu, không chỉ một kiểu, vì vậy giải pháp 55 byte của bạn có thể không hợp lệ. "Chương trình của bạn không cần chấp nhận cả hai" được đề cập đến 25 so với "25", số thập phân dưới dạng số hoặc dưới dạng chuỗi.
Tom

@TomDevs Cảm ơn. Điều này chắc chắn là khó hiểu. Để chắc chắn, nếu tôi xác định fsao cho "(f 2)" in "một, hai" và (f "two")in "1, 2", nó có phù hợp với bạn không?
coredump

Đúng, tôi nghĩ điều đó đúng.
Tom

@TomDevs Cảm ơn, tôi đã sửa nó
coredump

1
@AlbertRenshaw Không, chỉ có tiếng Anh; tính năng này có thể đã được coi là phình to, nhưng vì nó đã được triển khai trong một số Lisps, nên nó đã được chuẩn hóa.
coredump

8

JavaScript ES6, 559 526 381 368 364 358 332 327 315 byte

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();

Cảm ơn Kritixi Lithos về ý tưởng chia mảng và Arnauld cho thủ thuật 1 / n.

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
Bạn có thể xóa varvà bạn có thể thay đổi mảng ['one,'two',..]thành"one0two0three0...".split(0)
Kritixi Lithos

Khoảng trắng dự phòng tại null, Array(n).
Yytsi

2
Bạn có thể thay thế !isNaN(n)bằng 1/n. Điều này cung cấp cho bạn NaNmột chuỗi (falsy), float khác không cho số nguyên khác không (trung thực) hoặc Infinitycho 0 (cũng là trung thực).
Arnauld

Thêm 4 khoảng trắng trước mỗi dòng mã
sagiksp

@sagiksp Vâng, chắc chắn đã làm hỏng thứ gì đó khi chỉnh sửa bài đăng, nên được sửa ngay bây giờ :)
Tom

6

Python 2 , 503 499 494 490 479 byte

-5 với lời cảm ơn đến @Jonathan ALLan

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)

Hãy thử trực tuyến!

Nhập một số hoặc một không gian cách biệt chính tả của một số.

Phiên bản ít chơi hơn và dễ đọc hơn:

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
Lưu 6 byte vớil="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nin#".replace("#","teen ").split()
Jonathan Allan

... Rất tiếc 5, đã bỏ lỡ etừ nineteen.
Jonathan Allan

Có một lý do bạn cần sử dụng Python 2, nếu không có nó, bản in sẽ dài hơn, nhưng raw_input chỉ có thể là đầu vào? (Câu hỏi tương tự cho câu trả lời khác của bạn)
nedla2004

@ nedla2004 - Không có lý do nào khác ngoài việc tôi chưa cài đặt Python 3 trên máy tính xách tay mới nhất của mình :-)
ElPedro

6

Sơ đồ, 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)))))))

Không nén

(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)))))))

Làm thế nào để bạn chuyển đổi từ ví dụ "bốn" thành 4? Tôi không chắc chắn string->numberđiều này, tôi đã kiểm tra nhanh chóng và nó dường như được sử dụng để chuyển đổi, ví dụ từ chuỗi "4"sang số 4.
coredump

@coredump Đúng vậy. (string->number "four")trả lại #f.
Michael Vehrs

Bạn đang chạy chương trình nào?
coredump

1
@coredump guile 2.0.9
Michael Vehrs

6

PHP - 397 372 349 344 329 byte

Lấy cảm hứng từ giải pháp JS của TomDevs

Đã lưu 25 byte bằng cách thay thế $a=[...]bằng$a=explode(...)

Đã lưu thêm 23 byte bằng cách chuyển trở lại một mảng không có dấu phân cách chuỗi và bằng cách lưu trữ teentrong một biến, nhờ @ user59178

Đã lưu thêm 5 byte bằng cách xóa (int)typecasting

Lưu thêm 15 byte bằng cách thả $b,$i trong phần forkhai báo và dấu ngoặc nhọn, nhờ vào @ user59178 một lần nữa

$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++.' ';

Ung dung:

$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++ . ' ';

Hãy thử nó cho một chuỗi đầu vào hoặc cho một số đầu vào


1
Khi chơi golf bạn có thể sử dụng nhiều chuỗi trực tiếp mà không cần bất kỳ dấu ngoặc kép nào, bao gồm tất cả số bạn sử dụng. Điều này gây ra một thông báo nhưng có thể bỏ qua. Ngoài ra, nó ngắn hơn (bằng 2 byte toàn bộ) để lưu trữ teentrong một biến thay vì lặp lại mỗi lần. Do đó, nó sẽ trở thành:$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

Không nghĩ về điều đó, cảm ơn;)
roberto06

Bạn có thể lưu thêm 7 byte bằng cách thả $bvà đặt mảng thứ hai trực tiếp vào foreach, thêm 6 byte bằng cách thả tất cả các dấu ngoặc nhọn (mặc dù bạn cần đặt $a=$cvào thiết lập của vòng lặp for) và thêm 6 byte bằng cách tăng sau $ikhi bạn sử dụng nó chứ không phải trong bit 'sau' của các vòng lặp.
dùng59178

Lưu sáu byte (hai mỗi vòng lặp) bằng cách di chuyển mức tăng sau từ dòng sang dòng sau:for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Alex Howansky

Ooops, xin lỗi, chỉ cần lưu ý rằng @ user59178 đã đề xuất điều tương tự ...
Alex Howansky

6

Python 2, 262 byte

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

thay thế

Chuỗi đầu vào và đầu ra là chữ thường và nối *, vì vậy, để kiểm tra một chuỗi nhập đầu vào, ví dụ, "thirtyfive" tại dấu nhắc.

Xây dựng danh sách tất cả các từ (cộng "fiftyone"với "fiftynine"), xsau đó kiểm tra xem đó có phải inputlà một từ có proxy hay không v>50(chuỗi lớn hơn số trong Python 2 và tất cả các số trong phạm vi đầu vào hợp lệ từ đặc tả là <=50) và prints phù hợp giá trị bằng cách cắt danh sách,x[:v] hoặc xây dựng một phạm vi số nguyên,range(1,x.index(v)+2) .

* Thêm dấu gạch nối trên cả hai chi phí 11 byte, bằng cách thay thế a+"ty"bbằng a+"ty"+'-'*(b>'')+b.


5

Ngôn ngữ Wolfram, 92 byte

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

(Tôi chưa quen với điều này, hãy cho tôi biết nếu tôi đã làm gì sai)


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

5

JavaScript (ES6), 261 byte

Lưu ý: chuỗi được gán cho z được mã hóa bằng atob. Trong chuỗi được mã hóa có 11 byte mà tôi không thể đăng lên trang web này, ngay cả khi chúng là các ký tự hợp lệ trong chuỗi javascript. Vì vậy, tôi đã sử dụng một lối thoát hex ở dạng \ xHH. Mỗi một trong những lần thoát này được tính là 1 byte.
Chuỗi không nén ban đầu là phiên bản ít chơi gôn hơn .

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))

Ít chơi gôn

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)
)

Kiểm tra

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ÞöÜ(öØ...công cụ này thật tuyệt hahaa
Albert Renshaw

Có liên quan đến lưu ý hàng đầu của bạn: meta.stackoverflow.com/questions 4322546 / Giả
Albert Renshaw

5

Con trăn 3 , 305 303 byte

Chuyển đổi sang Python 3 sau lời khuyên từ @ nedla2004. Bây giờ cũng không có khoảng cách giữa các số được viết trên đầu vào hoặc đầu ra, ví dụ: nhập hai mươi hai lần

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)

Dùng thử trực tuyến 3!

Con trăn 2 , 327 320 313 308 byte

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

Dùng thử trực tuyến 2!

163 170 177 byte ngắn hơn câu trả lời ban đầu của tôi vì vậy tôi đang đăng nó dưới dạng thay thế. Điều này sử dụng fortrên hai danh sách để xây dựng một danh sách đầy đủ tất cả các biểu diễn chuỗi của các số sau đó xác định đúng trong danh sách và in mọi thứ theo giá trị hoặc theo chỉ mục. Xuất ra một dòng mới cho mỗi giá trị.


5

Python 2, 432 422 416 403 byte

Tôi chắc chắn rằng điều này có thể được cải thiện. Ít nhất nếu tôi có thể thoát khỏi việc mã hóa cứng, giá trị sẽ được xử lý và không cần một hàm tôi có thể lưu 20. Nó cần một khoảng trống để tách các từ trong nhập văn bản. Đã lưu 6 byte nhờ nhận xét của JonathanAllan về câu trả lời của ElPedro, 4 để sắp xếp lại các phép toán.

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: Phiên bản thực tế của điều này sử dụng các tab để thụt lề thay vì khoảng trắng. QPaysTaxes đã thêm một khoảng trắng vì điều đó không hiển thị đúng, để đảm bảo rằng mã đã biên dịch. Nó không nên thay đổi số byte.)


Nhận xét của @ Jonathan ALLan về câu trả lời của ElPedro cũng hoạt động ở đây cho -6
Chris H

1
len(`f`)>2Tôi có thể ...`f`[2:]cho 3 người khác. (bỏ qua việc ...dường như không thể khiến các backticks hoạt động bình thường)
Jonathan Allan

Thực tế trong python 2, bạn có thể sử dụng f>50cho 6. (và một số khác bằng cách không sử dụng d)
Jonathan Allan

@Jonathan ALLan không hoạt động để chuyển số dưới dạng số nguyên, mà tôi hiện đang làm : TypeError: 'int' object has no attribute '__getitem__'. Nếu tôi chuyển đầu vào số dưới dạng chuỗi, f[2:]đến gần hơn nhưng vẫn thất bại khi được gọi là boolean ( print f[2:] and Truein một dòng trống nếu len (f) <2, không Truehoặc False)
Chris H

@Jonathan ALLan f>50hoạt động, cảm ơn bạn. Việc thả dkhông đơn giản như vậy vì tôi luôn đặt giá trị cuối của vòng lặp vào fdòng 8 không thể thay đổi thành if f>50vì nó sẽ không bao giờ đúng.
Chris H

4

C ++ 11, 484 480 477 byte

#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<<" ";}

Nhập văn bản trong trường hợp thấp hơn mà không có dấu gạch ngang.


3

PowerShell , 362 byte

$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])}

Hãy thử trực tuyến! đầu vào từ hoặc đầu vào số

Đây là một mớ hỗn độn, và tôi không hài lòng lắm với nó, nhưng đây rồi. Gợi ý chơi golf chào mừng.

Dòng đầu tiên $zlà một mảng của các từ tiếng Anh đầy đủ. Bạn có thể thấy các -split0số 1cho 12và vòng lặp để xây dựng tất cả các teens, và sau đó có một loạt logic để đặt mọi thứ lại với nhau. Hãy thử trực tuyến!

Dòng thứ hai bắt đầu với một số logic. Chúng tôi lấy đầu vào $args(dưới dạng chuỗi), -splittrên chuỗi trắng, lưu trữ $nđể sử dụng sau, lấy [0]từ đầu tiên và [0]ký tự đầu tiên của từ đó và kiểm tra xem đó có phải là -inmột phạm vi không 48..57(ví dụ: ASCII0 đến 9) không. Vì vậy, chúng tôi đang kiểm tra xem chúng tôi có đầu vào thập phân hoặc đầu vào tiếng Anh. Hãy thử trực tuyến!

Trong trường hợp đầu tiên, chúng tôi xây dựng một phạm vi dựa trên các đầu vào thập phân $n[0]..$n[2]và sử dụng phạm vi đó để lập chỉ mục vào $z[...]. Trong trường hợp khác, chúng tôi tìm thấy .indexOf()từ đầu tiên và từ cuối cùng, và chỉ xây dựng một phạm vi số từ đó. Trong cả hai trường hợp, chúng ta hiện có một mảng các đối tượng trên đường ống (chuỗi hoặc số nguyên) và một ẩn Write-Outputkhi hoàn thành chương trình cung cấp cho chúng ta một dòng mới giữa các phần tử.


3

Swift3, 402 byte

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)}}}

Ung dung:

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")

Không có gì đặc biệt ở đây, chỉ cần sử dụng một mảng để sao lưu các số đã viết.

Ban đầu tôi nghĩ giải pháp này sử dụng cách khác để tính toán valuesmảng:

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]]

Mà có thể được đánh gôn để:

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]]

thay thế dòng thứ 3 trong mã đánh gôn

Tôi có thể đã ghi được 380 byte, nhưng, có một lỗi trình biên dịch cho biết: "biểu thức quá phức tạp để được giải quyết trong thời gian hợp lý", có thể tìm thêm thông tin về lỗi này tại đây


TÌNH YÊU nhìn thấy nhanh chóng ở đây, tôi sẽ phải kiểm tra điều này nhiều hơn khi tôi quay trở lại
Albert Renshaw

3

R, 452 430 424 byte

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

Đặt các số trong một data.frame với các số được viết dưới dạng tên cột, làm cho việc dịch giữa hai (và in tiếp theo) khá dễ dàng.

Nỗ lực chính trong việc chơi golf là tạo ra những con số được viết ra cho 20-49, có lẽ nhiều hơn để chơi golf ở đây.

Tôi đã cố gắng as.matrixin data.frame chỉ bằng các số, nhưng vẫn còn lại với một tiêu đề ma trận. Hy vọng rằng đó là ok.

Ung dung:

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)
  }
}

Cải thiện nhẹ lên 359 Byte: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)]
đếm

@count có vẻ như là một cải tiến lớn! Tôi dường như không thể tìm ra chức năng ở đâu, hoặc nơi bạn sẽ tranh luận.
BLT

2

C, 342 331 byte

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]:"");}

Hãy thử trực tuyến!


Ngôn ngữ yêu thích của tôi :)
Albert Renshaw

1
Bạn thực sự không cần 1 thông qua hoặc một thông qua; tất cả các codegolf này yêu cầu là đối số thứ ba của bạn. Hai cái đầu tiên sẽ luôn là "1 và thông qua" (hoặc "một và thông qua")
Albert Renshaw

@AlbertRenshaw Gọi tốt! Cảm ơn :)
Ahemone

1

Sảnh, 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;

Đầu ra được ghi vào nhật ký cách nhau bởi dòng mới. SAS có định dạng tích hợp để chuyển đổi chữ số thành từ, đây là một lợi thế lớn cho thử thách này, nhưng thật khó chịu khi nó thiếu một thông tin để thực hiện ngược lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.