一年生のカウント運動を自動化する


36

CodeGolfチャレンジ

PWSSHHHH!3000年に極低温研究室で目を覚ます。おそらく配達員のキャリアチップを受け取るために割り当てオフィスに連れて行かれると、プローブはあなたが2000年からであることを検出します。ステレオタイプ、あなたは今日の現代の人間と比較し愚かであると仮定され、学年を繰り返すことを余儀なくされています。

あなたは一年生の教室に入り、教師が課題を与えています。彼女は50までの数字を言うか、書きます。彼女がボードに数字を書く場合(たとえば:25)、その数字までを「1、2、3、...、25」と言わなければなりません。 「。彼女が数字を大声で言ったら(たとえば、「6」)、タブレットで、その数字までの数字を「1、2、3、4、5、6」と書く必要があります。

これは非常に面倒になり、21世紀のまだ機能しているがまだ機能しているプログラミングの知識でプロセスを自動化することにします。


目的:

プログラムは入力を受け取る必要があります。この入力は、10進数(1 thru 50)または書き出された数値(one thru fifty)のいずれかです。

•入力が10進数の場合、出力は書き出されたスタイルを使用して、1からその数までカウントする必要があります。(例:32

•入力が書き出された数値である場合、出力は10進数形式を使用して1からその数値までカウントする必要があります。(例32


ルール:

入力と出力は、どのような場合でも選択できます(したがって、必要に応じて大文字のみを受け入れるプログラムを作成できます)。

入力10進数は数値型(intなど)である必要はありません。数値を含む入力文字列(25対 "25")にすることができます。どちらでも構いませんし、プログラムに受け入れたいものを選択できます。(プログラムは両方を受け入れる必要はありません)

書かれたスタイルでは、複合語の間にハイフンは必要ありませんが、必要に応じてできます。

出力値は何らかの形式で区切る必要がありますが、セパレータは問題ありません 1,2,3 1 2 3 etc

num2words(python)などのような追加のライブラリを追加することはできません(ただし、システムライブラリは問題ありません)

バックストーリーには2000年から来たと書かれていますが、その日付以降に作成された言語を使用できます(笑)


これはなので、バイトカウントが最も短いプログラムが勝ちます!


1
Pythonの場合、num2wordsのようなライブラリを使用できますか。
グルパッドママダプール

1
@AlbertRenshawしかし、それを行うビルトインはどうですか?(Mathematica)
パベル

1
@coredumpは、どちらか一方または両方を選択できることを意味します。両方の種類の入力を処理できる必要はありません
アルバートレンショー

2
「私の光沢のある金属のお尻をかむ!」私は自分自身を数えません
-RaisingAgent

1
タイトルが「あなたの(1年生)カウント」ではなく「あなたの1年生(グレードカウント)」であると考え続ける
CAD97

回答:


32

Perl 6の119の 113バイト

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

UnicodeデータベースFTW!

ハイペンなしで大文字で書かれた数字を使用しますTWENTYTWO
文字列のリスト、または数値の範囲を返します。(で印刷するときは、両方とも区切り文字としてスペースを使用しputます。)


3
非常に賢いアハハハ!それを愛する
アルバートレンショー

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)または10進整数が必要です。

(これは私の最初のコードゴルフの提出です。)

(長さ(エンコード)を誤って数えていることに気付いたので、以前考えていたよりも数バイト少なくなっています。ただし、最新のバイト数のみを更新しました。おっと。)


PPCGへようこそ!
AdmBorkBork

Advocacy:unicodedataは、デフォルトのインストールに付属するシステムライブラリであり、個別にインストールする必要がある「追加」ライブラリではありません。
-unayok

サイトへようこそ!コードから多くのスペース削除できます
-xnor

1
PPCGへようこそ。forループ内に印刷を配置し、各出力の間に改行を入れると、3バイトを失う可能性があります。print()整数か文字列かは気にしません。 オンラインでお試しください!
エルペドロ

1
import*代わりにimport name、数バイトを節約することができると思う
ウィートウィザード

10

Common 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のおかげで、最初の数字を除く各数字の前にセパレーターを挿入するために使用されます。

  • ~:[ 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

私が質問について理解していることから、1つだけでなく両方のスタイルを解析できる必要があるため、55バイトのソリューションは有効ではない可能性があります。「プログラムは両方を受け入れる必要はありません」とは、25対「25」、つまり数値または文字列としての小数を指します。
トム

@TomDevsありがとう。これは間違いなく紛らわしいです。確かに、f"(f 2)"が "one、two"を(f "two")印刷し、 "1、2 "を印刷するように定義すると、見栄えが良くなりますか?
コアダンプ

うん、そうだと思う。
トム

@TomDevsありがとう、私はそれを修正しました
coredump

1
@AlbertRenshawいいえ、英語のみ。この機能はすでに肥大化したと考えられているかもしれませんが、いくつかのLispですでに実装されているため、標準化されました。
コアダンプ

8

JavaScript ES6、559 526 381 368 364 358 332 327 315バイト

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)
イッツィー

2
あなたは置き換えることができます!isNaN(n)によって1/n。これによりNaN、文字列(偽)、非ゼロ整数の非ゼロフロート(真)、またはInfinity0(真)が得られます。
アーナウド

すべてのコード行の前に4つのスペースを追加します
-sagiksp

うん@sagiksp、何かアップ記事を編集するとき、:)今固定する必要があり混乱している必要があります
トム

6

パイソン2503の 499 494 490 479バイト

-5 @JonathanAllanに感謝

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()
ジョナサンアラン

... 5おっと、逃したeからnineteen
ジョナサンアラン

Python 2を使用する必要がある理由はありません。Python2を使用しないと、印刷は長くなりますが、raw_inputは単に入力できますか?(あなたの他の答えと同じ質問)
nedla2004

@ nedla2004-最新のラップトップにPython 3をインストールすることをまだ
許可さ

6

スキーム、161152、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)))))))

たとえば、「4」から「4」にどのように変換しますか?私はこれを行うかわからstring->numberない、私はすぐに確認し、それは例えば文字列"4"から数値に変換するために使用されるよう4です
コアダンプ

@coredumpそれは正しいです。(string->number "four")を返します#f
マイケルVehrs

どのSchemeを実行していますか?
コアダンプ

1
@coredump guile 2.0.9
マイケルヴェール

6

PHP - 397の 372 349 344 329バイト

TomDevsのJSソリューションに触発

に置き換え$a=[...]て25バイトを節約しました$a=explode(...)

teen@ user59178のおかげで、文字列区切り文字のない配列に切り替えて、変数に格納することにより、さらに23バイトを節約しました。

(int)型キャストを削除してさらに5バイトを保存しました

@ user59178のおかげで、宣言内の、宣言内、および中括弧を削除して$b、さらに15バイトを節約しました。$ifor

$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

$b2番目の配列を直接foreachにドロップして追加することで7バイトを節約でき、すべての中括弧($a=$cforループの設定に追加する必要がありますが)を追加して6 バイトを節約できます。$iforループの 'after'ビットではなく使用する場合。
user59178

次の行へのためのポストインクリメントを移動することにより、6バイト(ループごとに2つ)割引:for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
アレックスHowansky

メールで送信、申し訳ありませんが、ちょうど@ user59178が同じことを示唆したことに気づいた...
アレックスHowansky

6

Python 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

repl.it

入力文字列と出力文字列は小文字で連結されている*ので、文字列入力をテストするには、たとえば"thirtyfive"プロンプトで入力します。

すべての単語(プラス"fiftyone"から"fiftynine")のリストを作成し、プロキシ付きの単語xかどうかをテストします(文字列はPython 2の数字よりも大きく、仕様からの有効な入力範囲のすべての数字は)およびsリストをスライスするか、整数の範囲を構築することで値を決定します。inputv>50<=50printx[:v]range(1,x.index(v)+2)

*に置き換えa+"ty"bて、両方にハイフネーションを追加すると11バイトかかりますa+"ty"+'-'*(b>'')+b


5

Wolfram言語、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"]@#]}]&
ジョンファンミン

5

JavaScript(ES6)、261バイト

注:zに割り当てられた文字列はでエンコードされatobます。エンコードされた文字列には、JavaScript文字列の有効な文字であっても、このサイトに投稿できない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ÞöÜ(öØ...これは素晴らしいハハです
アルバートレンショー

:あなたのトップノートに関連するmeta.stackoverflow.com/questions/342546/...
アルバート・レンショウ

5

Pythonの3305の 303バイト

@ nedla2004からのアドバイスの後、Python 3に変換されました。また、入力または出力に書き込まれた数字の間にスペースがありません。

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!

パイソン2327の 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、2つのリストを使用して、数字のすべての文字列表現の完全なリストを作成し、リスト内の正しいものを識別し、それまでのすべてを値またはインデックスで出力します。値ごとに新しい行を出力します。


5

パイソン2、432の422 416 403バイト

これは改善できると確信しています。少なくとも、作業対象の値をハードコーディングして、関数を必要としない場合は20個節約できます。テキスト入力の単語を区切るスペースが必要です。ElPedroの答えに対するJonathanAllanのコメントのおかげで6バイトを節約しました。

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

(注:これの実際のバージョンでは、スペースの代わりにタブを使用してインデントします。QPaysTaxesは、特定のコードがコンパイルされるように適切にレンダリングされなかったため、単一のスペースを追加しました。バイトカウントを変更しないでください。)


ElPedroの答えにJonathanAllanさんのコメントはため-6ここでも動作します@
クリス・H

1
len(`f`)>2することができ...`f`[2:]、私は信じている別の3のために。(...バックティックが正常に機能していないように見えることは無視してください)
ジョナサンアラン

実際、python 2 f>50では6に進むことができます(そしてもう1つはを使用しないことでd
ジョナサンアラン

@JonathanAllanは、数値を整数として渡すために機能しませんTypeError: 'int' object has no attribute '__getitem__'。私は文字列として数値入力を渡すと、f[2:]近づくが、ブールとしてtratedとき、まだ失敗した(print f[2:] and Truelenの場合は空白行を出力(F)<2、ではないTrueFalse
クリス・H

@ジョナサンアランはf>50動作します、ありがとう。dループの終了値を常に入れるので、ドロップはそれほど単純ではありません。そのため、f8行目は変更さif f>50れることはないので、それは決して真実ではありません。
クリス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は、完全な英語の単語の配列に設定されます。-split0forの数値1to 12、およびすべてのteens を構築するループを見ることができます。そして、すべてを正しくまとめるためのロジックがたくさんあります。オンラインでお試しください!

2行目は、いくつかのロジックで始まります。入力を$args(文字列として)取得し、-split空白に保存し$n、後で使用するために保存し、最初の[0]単語とその最初の[0]文字を取得し-in、範囲48..57(ASCII 0から9)かどうかを確認します。したがって、10進入力または英語入力があるかどうかを確認しています。オンラインでお試しください!

最初のケースでは、10進数の入力に基づいて範囲を構築し、$n[0]..$n[2]それを使用してにインデックスを付け$z[...]ます。他のケースでは.indexOf()、最初の単語と最後の単語を見つけ、そこから数値範囲だけを構築します。どちらの場合でも、パイプライン上にオブジェクトの配列(文字列または整数)があり、Write-Outputプログラムの完了時に暗黙的に要素間に改行が追加されます。


3

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

ゴルフコードの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

書き出された数字を列名としてdata.frameに数字を配置し、2つの間の変換(およびその後の印刷)を非常に簡単にします。

ゴルフでの主な試みは、20-49の書き出された数字を作成することでした。

as.matrixdata.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、342 331バイト

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が必要とするのは3番目の引数だけです。最初の2つは常に「1 and thru」(または「one and thru」)
アルバートレンショー

@AlbertRenshawいいね!ありがとう:)
アヘモネ

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.