5318008-電卓の楽しみ


32

世界中の学校で、子供たちはLCD計算機に数字を入力し、「Boobies」という言葉を作成した後、逆さまにして笑い声に変えます。もちろん、これは最も一般的な単語ですが、生成できる他の多くの単語があります。

ただし、すべての単語の長さは10文字未満でなければなりません(ただし、辞書にはこれより長い単語が含まれているため、プログラムでフィルターを実行する必要があります)。この辞書には大文字の単語がいくつかあるので、すべての単語を小文字に変換します。

英語の辞書を使用して、LCD計算機に入力できる単語のリストを作成します。すべてのコードゴルフの質問と同様に、このタスクを完了するための最短のプログラムが勝ちます。

私のテストでは、次のように入力して収集したUNIXワードリストを使用しました。

ln -s /usr/dict/words w.txt

または、ここで入手してください

たとえば、上記の画像は35007、計算機に数値を入力し、逆さまにすることで作成されました。

文字とそれぞれの番号:

  • b8
  • g6
  • l7
  • 1
  • o0
  • s5
  • z2
  • h4
  • e3

数字がゼロで始まる場合、そのゼロの後に小数点が必要であることに注意してください。数字は小数点で始まってはいけません。

これはMartinBüttnerのコードだと思う。

/* Configuration */

var QUESTION_ID = 51871; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";

/* App */

var answers = [], page = 1;

function answersUrl(index) {
  return "http://api.stackexchange.com/2.2/questions/" +  QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}

function getAnswers() {
  jQuery.ajax({
    url: answersUrl(page++),
    method: "get",
    dataType: "jsonp",
    crossDomain: true,
    success: function (data) {
      answers.push.apply(answers, data.items);
      if (data.has_more) getAnswers();
      else process();
    }
  });
}

getAnswers();

var SIZE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^,]+)/;

function shouldHaveHeading(a) {
  var pass = false;
  var lines = a.body_markdown.split("\n");
  try {
    pass |= /^#/.test(a.body_markdown);
    pass |= ["-", "="]
              .indexOf(lines[1][0]) > -1;
    pass &= LANGUAGE_REG.test(a.body_markdown);
  } catch (ex) {}
  return pass;
}

function shouldHaveScore(a) {
  var pass = false;
  try {
    pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
  } catch (ex) {}
  return pass;
}

function getAuthorName(a) {
  return a.owner.display_name;
}

function process() {
  answers = answers.filter(shouldHaveScore)
                   .filter(shouldHaveHeading);
  answers.sort(function (a, b) {
    var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
        bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
    return aB - bB
  });

  var languages = {};
  var place = 1;
  var lastSize = null;
  var lastPlace = 1;
  answers.forEach(function (a) {
    var headline = a.body_markdown.split("\n")[0];
    //console.log(a);
    var answer = jQuery("#answer-template").html();
    var num = headline.match(NUMBER_REG)[0];
    var size = (headline.match(SIZE_REG)||[0])[0];
    var language = headline.match(LANGUAGE_REG)[1];
    var user = getAuthorName(a);
    if (size != lastSize)
      lastPlace = place;
    lastSize = size;
    ++place;
    answer = answer.replace("{{PLACE}}", lastPlace + ".")
                   .replace("{{NAME}}", user)
                   .replace("{{LANGUAGE}}", language)
                   .replace("{{SIZE}}", size)
                   .replace("{{LINK}}", a.share_link);
    answer = jQuery(answer)
    jQuery("#answers").append(answer);

    languages[language] = languages[language] || {lang: language, user: user, size: size, link: a.share_link};
  });

  var langs = [];
  for (var lang in languages)
    if (languages.hasOwnProperty(lang))
      langs.push(languages[lang]);

  langs.sort(function (a, b) {
    if (a.lang > b.lang) return 1;
    if (a.lang < b.lang) return -1;
    return 0;
  });

  for (var i = 0; i < langs.length; ++i)
  {
    var language = jQuery("#language-template").html();
    var lang = langs[i];
    language = language.replace("{{LANGUAGE}}", lang.lang)
                       .replace("{{NAME}}", lang.user)
                       .replace("{{SIZE}}", lang.size)
                       .replace("{{LINK}}", lang.link);
    language = jQuery(language);
    jQuery("#languages").append(language);
  }

}
body { text-align: left !important}

#answer-list {
  padding: 10px;
  width: 50%;
  float: left;
}

#language-list {
  padding: 10px;
  width: 50%px;
  float: left;
}

table thead {
  font-weight: bold;
}

table td {
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
  <h2>Leaderboard</h2>
  <table class="answer-list">
    <thead>
      <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
    </thead>
    <tbody id="answers">

    </tbody>
  </table>
</div>
<div id="language-list">
  <h2>Winners by Language</h2>
  <table class="language-list">
    <thead>
      <tr><td>Language</td><td>User</td><td>Score</td></tr>
    </thead>
    <tbody id="languages">

    </tbody>
  </table>
</div>
<table style="display: none">
  <tbody id="answer-template">
    <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>
<table style="display: none">
  <tbody id="language-template">
    <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>


4
最初の数値の後に小数点が必要でない場合でも小数点を使用できますか?
デニス

1
こんにちはと入力0.7734する必要がありますか、それとも受け入れられますか?.7734
デニス

3
辞書に大文字、句読点などの単語が含まれている場合の正しい動作は何ですか?
ピーターテイラー

1
@デニス0.7734が必要です
ベータ崩壊

4
小数点の後に末尾のゼロが必要な単語はどうですか?たとえば、oligo末尾のゼロを必要とした後、小数点以下:0.6170
氏ラマ

回答:


7

CJam、44 42バイト

r{el"oizehsglb"f#W%"0."a.e|N+_,B<*_W&!*r}h

CJamインタプリタでオンラインで試してください。

コマンドラインからプログラムを実行するには、Javaインタープリターをダウンロードして実行します。

java -jar cjam-0.6.5.jar 5318008.cjam < /usr/share/dict/words

使い方

r            e# Read a whitespace-separated token from STDIN.
{            e# While loop:
 el          e#   Convert to lowercase.
 "oizehsglb" e#   Push that string.
 f#          e#   Get the index of each character from the input in that string.
             e#   This pushes -1 for "not found".
 W%          e#   Reverse the resulting array.
 "0."a       e#   Push ["0."].
 .e|         e#   Vectorized logical NOT. This replaces an initial 0 with "0.".
 N+          e#   Append a linefeed.
 _,B<*       e#   Repeat the array (array.length < 11) times.
 _W&!*       e#   Repeat the array !(array.intersection(-1)) times.
 r           e#   Read a whitespace-separated token from STDIN.
}h           e# If the token is not empty, repeat the loop.

9

Bash + coreutils、54

繰り返しになりますが、ゴルフの手助けをしてくれた@TobySpeightに感謝します。

rev|tr oizehsglb 0-8|sed '/.\{11\}\|[^0-9]/d;s/^0/&./'

入力ワードリストはSTDINから取得されます:

$ ./5318008.sh < /usr/share/dict/words | head
8
38
338
5338
638
5638
36138
31738
531738
7738
$ 

「Belie」と「Belies」は言葉ですか?より多くのあなたが知っている...
clismique

6

Python 2、271 216 211 205バイト

これは私がこれまで持っていた唯一のアイデアです..私は何か他のものを考えたらこれを更新します!私はファイルから読み取る必要があると思っていましたが、私に知らせていない場合は更新できます:)

55バイトを節約してくれたDennisに感謝します:)

また、6バイトを節約してくれたSp3000にも感謝します:)

d,f,g='oizehsglb',[x.lower()for x in open('w.txt').read().split('\n')if len(x)<10],[]
for x in f:
 c=x[::-1]
 for b in d:c=c.replace(b,`d.find(b)`)
 g=[g,g+[['0.'+c[1:],c][c[0]!='0']]][c.isdigit()]
print g

私は多くのPythonを知らないが、"oizehsglb".index(b)もっと短くなるようなものはないだろうか?
デニス

3
d[b] == "oizehsglb".index(b)。文字列/文字へのキャストが欠けている可能性があります。
デニス

1
ああ、すごい、私たちが置き換えることができた数字が順番に数値を持っていることは私には決して起こりませんでした。はい、それは間違いなく動作します!ありがとう!
カデ

1
テストしていませんが、1).findより短い.index、2)使用しているバージョンに応じて、少なくとも2.7.10ではopen、モード引数なしでデフォルトがr3になりますが、機能しませんfor x in open(...)か?そうでない場合は、(末尾の改行を削除する必要があるかもしれません).split('\n')よりも短くなっている.splitlines()
SP3000

1
またg+=[['0.'+c[1:],c][c[0]!='0']]*c.isdigit()、あなたが持っfているのではfor c in fなくすることで逆転することでさらにいくつかを節約できますc=x[::-1]。また、あなただけの使用fは、変数として保存する必要はありませんので、一度
SP3000

6

JavaScript(ES7)、73バイト

これは、ES7でわずか73バイトで実行できます。

s=>[for(w of s)'oizehsglb'.search(w)].reverse().join``.replace(/^0/,'0.')

ゴルフをしていない:

var b = function b(s) {
    return s.length < 10 && /^[bglioszhe]*$/.test(s) ? s.replace(/./g, function (w) {
        return 'oizehsglb'.search(w);
    }).reverse().join('').replace(/^0/, '0.') : '';
};

使用法:

t('hello'); // 0.7734
t('loose'); // 35007
t('impossible'); //

関数:

t=s=>                       // Create a function 't' with an argument named 's' 
   [                        // Return this array  comprehension
     for(i of s)            // Loops through each letter in the string
     'oizehsglb'.search(w)  // Converts it to it's corresponding number
   ]
  .reverse().join``         // Reverse the array and make it a string
  .replace(/^0/,'0.')       // If the first character is a 0, add a decimal after it

UNIXのワードリストでこれを実行し、結果を貼り付けビンに入れました。

結果

Firefoxで結果を取得するために使用されるコード:

document.querySelector('pre').innerHTML.split('\n').map(i => t(i.toLowerCase())).join('\n').replace(/^\s*[\r\n]/gm, '');

どうなりt('Impossible')ますか?
アルトゥーロトレスサンチェス

@ArturoTorresSánchezあなたは正しい、私はそれを修正しました
ダウンゴート

ESに参加しますか?それともES2015以前ですか?
WallyWest

@WallyWestこれはES6の機能です。ほとんどの主要なブラウザでサポートされています
Downgoat

これでES7固有のものは何ですか?
アルジュン

5

Python 2、121バイト

for s in open("w.txt"):
 L=map("oizehsglb".find,s[-2::-1].lower())
 if-min(L)<1>len(L)-9:print`L[0]`+"."[L[0]:]+`L`[4::3]

辞書ファイルw.txtが末尾の改行で終わり、空行がないと仮定します。


3

GNU sed、82

(を含む1 -r

ゴルフの手助けをしてくれた@TobySpeightに感謝します。

s/$/:/
:
s/(.)(:.*)/\2\1/
t
s/://
y/oizehsglb/012345678/
/.{11}|[^0-9]/d;s/^0/&./

入力ワードリストはSTDINから取得されます:

$ sed -rf 5318008.sed /usr/share/dict/words | tail
3705
53705
1705
0.705
50705
5705
505
2
0.02
5002
$ 

2

TI-BASIC、75 88バイト

編集2:気にしないで、一度に1つの単語(辞書ではない)しか受け入れないため、これはまだ技術的に無効です。入力として複数の単語を許可するように修正しようとします...

編集:おっと。私はもともとそれがで0.0を示して作られたエンドならば、最後の数は、他の方法で回避0ではなかったです。これはちょっと悪い回避策ですが、0で始まる場合は数字の横に「0.」が表示され、そうでない場合は同じ場所に2つのスペースが表示されます。明るい面では、実際には10進数を表示していないため、「Otto」(両方の0を表示)などの単語を正しく処理します。


これをするためのより良い言語を考えることはできません。間違いなくもっとゴルフをすることができますが、私は今あまりにも疲れています。チルダは否定記号[ ( - )ボタン]です。

入力は計算機の応答変数から取得されます。つまり、最後に評価されたもの(_対話型pythonシェルなど)を意味するため、ホーム画面に文字列を入力し(引用符がオンALPHA+)、ENTERプログラムを実行します。または、コロンを使用してコマンドを区切ることができます。たとえば、プログラムに「CALCTEXT」などの名前を付け、文字列「HELLO」で実行する場合は、"HELLO":prgmCALCTEXT個別に実行する代わりに入力できます。

seq(inString("OIZEHSGLB",sub(Ans,X,1))-1,X,length(Ans),1,~1
Text(0,0,sub("0.  ",1+2(0 or Ans(1)),2),sum(seq(Ans(X)10^(dim(Ans)-X),X,1,dim(Ans

2

Python 2、147 158 156バイト

この「0」が欠落していました。要件。これでうまくいくことを願っています。

編集:「。readlines()」を削除し、それでも動作します; p

edit2:いくつかのスペースを削除し、printを3行目に移動しました

edit3Sp3000のおかげで2バイト節約されました(印刷後にスペースが削除され、「インデックス」が「検索」に変更されました)

for x in open("w.txt"):
 a="oizehsglb";g=[`a.find(b)`for b in x[::-1].lower()if b in a]
 if len(g)==len(x)-1<10:
  if g[0]=="0":g[0]="0."
  print"".join(g)

1

Python 2、184 174バイト

for s in open('w.txt'):
 try:a=''.join(map(lambda c:dict(zip('bglioszhe','867105243'))[c],s[:-1][::-1]));a=[a,'0.'+a[1:]][a[0]=='0'];print['',''.join(a)][len(s)<11]
 except:0

1

Ruby 2、88 86バイト

x="oizehsglb"
puts$_.tr(x,"0-8").reverse.sub /^0/,"0." if$_.size<11&&$_.delete(x)<?A

バイトカウントにはln、コマンドラインのオプションとして2が含まれます。

$ ruby -ln 5318008.rb wordlist.txt

この場合、==""に置き換えることができます<?A。そして、の必要がないgsub()ようsub()に十分です。
マナトワーク

1

C、182 172 169/181 172バイト

char*l="oizehsglb",S[99],*s,*t;main(x){for(;t=S+98,gets(S);){for(s=S;*s;s++)if(x=strchr(l,*s|32))*--t=48+x-(int)l;else break;*t==48?*t--=46,*t=48:0;*s||s-S>10?0:puts(t);}}

拡大

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *l="oizehsglb",S[99],*s,*t;

main(int x, char **argv)
{
    for (;t=S+98,gets(S);){
        for (s=S;*s;s++)
            if (x=strchr(l,*s|32))
                *--t=48+x-(int)l;
            else
                break;
        if (*t==48) {       // '0'
            *t--=46;        // '.'
            *t=48;  // '0'
        }

        if (!*s && s-S <= 10)
            puts(t);
    }
}

リンクされたwords.txtを使用して、小文字に変換します。

$ ./a.out  < words.txt  | tail
2212
0.2
0.802
0.602
7702
37702
0.02
321607002
515002
0.02002

$ ./a.out < words.txt   | wc -l
 550

1
*s|32このコンテキストでは小文字の変換として機能しませんか?
ハーゲンフォンアイゼン

いい案!ありがとう!
一部のユーザー

1

Haskell、インポートなしの175バイト(インポートありの229バイト)

関連コード(File Calc.hsなど):

import Data.Char(toLower)
import Data.Maybe(mapMaybe)
s="oizehsglb\n"
g('0':r)="0."++r
g x=x
main=mapM_(putStrLn.g.reverse.mapMaybe(`lookup`zip s['0'..'8'])).filter(\l->length l<10&&all(`elem`s)l).lines.map toLower=<<getContents

$ cat /usr/share/dict/words | runghc Calc.hs

0

Java、208 200 176バイト

String f(char[] w){String o="",l="oizehsglb";for(int i=w.length;i>0;i--)o+=l.indexOf(w[i-1]|32);if(o.contains("-")||o.length()>8)o="  ";return o.charAt(0)+"."+o.substring(1);}

拡大

String f(char[] w)
{
    String o = "", l = "oizehsglb";
    for(int i = w.length; i > 0; i--)
        o+=l.indexOf(w[i-1]|32);
    if(o.contains("-")||o.length() > 8)
        o = "  ";
    return o.charAt(0) + "." + o.substring(1);
}

常に小数が追加され、無効な場合は「。」が返されます。しかし、それ以外の場合は正常に機能します。:P

ありがとう@ LegionMammal978!


とを変更;String l=する,l=と、7バイト節約できます。=o++=
LegionMammal978
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.