5318008 - Bersenang-senang dengan Kalkulator


32

Di sekolah-sekolah di seluruh dunia, anak-anak mengetik angka ke dalam kalkulator LCD mereka, membalikkannya dan tertawa terbahak-bahak setelah menciptakan kata 'Boobies'. Tentu saja, ini adalah kata yang paling populer, tetapi ada banyak kata lain yang dapat dihasilkan.

Namun, semua kata harus kurang dari 10 huruf (kamus memuat kata-kata yang panjangnya lebih dari ini, jadi Anda harus melakukan filter dalam program Anda). Dalam kamus ini, ada beberapa kata huruf besar, jadi konversikan semua kata menjadi huruf kecil.

Menggunakan, kamus bahasa Inggris, buat daftar angka yang bisa diketikkan ke kalkulator LCD dan buat kata. Seperti halnya semua pertanyaan kode golf, program terpendek untuk menyelesaikan tugas ini akan menang.

Untuk pengujian saya, saya menggunakan daftar kata UNIX, dikumpulkan dengan mengetik:

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

Atau sebagai alternatif, dapatkan di sini .

Misalnya, gambar di atas dibuat dengan mengetikkan angka 35007ke dalam kalkulator dan membalikkannya.

Huruf dan nomor masing-masing:

  • b :8
  • g :6
  • l :7
  • saya :1
  • o :0
  • s :5
  • z :2
  • h :4
  • e :3

Perhatikan bahwa jika angka dimulai dengan nol, titik desimal diperlukan setelah nol itu. Nomor tidak boleh dimulai dengan titik desimal.

Saya pikir ini adalah kode MartinBüttner, hanya ingin memuji Anda untuk itu :)

/* 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
Bisakah menggunakan titik desimal setelah angka pertama meskipun tidak diperlukan?
Dennis

1
Apakah kita harus mengetik 0.7734untuk halo atau akan .7734diterima?
Dennis

3
Apa perilaku yang benar jika kamus berisi kata-kata dengan huruf besar, tanda baca, dll?
Peter Taylor

1
@ Dennis 0.7734diperlukan
Peluruhan Beta

4
Bagaimana dengan kata-kata yang membutuhkan nol tambahan setelah desimal? Misalnya, oligomemerlukan nol tambahan setelah desimal:0.6170
Mr. Llama

Jawaban:


7

CJam, 44 42 byte

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

Cobalah online di juru bahasa CJam .

Untuk menjalankan program dari baris perintah, unduh Java interpreter dan jalankan:

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

Bagaimana itu bekerja

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

Sekali lagi, terima kasih kepada @TobySpeight untuk bantuan golfnya.

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

Masukan daftar kata diambil dari STDIN:

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

"Belie" dan "Belies" adalah kata-kata? Semakin banyak Anda tahu ...
clismique

6

Python 2, 271 216 211 205 Bytes

Ini adalah satu-satunya ide yang saya miliki sejauh ini .. Saya akan memperbarui ini setelah saya memikirkan hal lain! Saya berasumsi bahwa kami perlu membaca dari sebuah file, tetapi jika tidak beri tahu saya agar saya dapat memperbarui :)

Terima kasih banyak untuk Dennis karena telah menyelamatkan saya 55 byte :)

Juga terima kasih kepada Sp3000 untuk menghemat 6 byte :)

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

Saya tidak tahu banyak tentang Python, tetapi bukankah sesuatu seperti "oizehsglb".index(b)pendek?
Dennis

3
d[b] == "oizehsglb".index(b). Mungkin tidak memiliki cast ke string / karakter.
Dennis

1
Oh, wow, tidak pernah terpikir oleh saya bahwa angka yang dapat kami ganti memiliki nilai numerik secara berurutan. Ya, itu pasti akan berhasil! Terima kasih!
Kade

1
Belum diuji tetapi: 1) .findlebih pendek dari .index, 2) Tergantung pada versi yang Anda miliki, setidaknya di 2.7.10 opentanpa argumen mode default ke r, 3) Tidak hanya for x in open(...)bekerja? (mungkin perlu menghapus baris baru) Jika tidak, maka .split('\n')lebih pendek dari.splitlines()
Sp3000

1
Juga g+=[['0.'+c[1:],c][c[0]!='0']]*c.isdigit(), dan Anda dapat menyimpan lebih banyak dengan membalik flalu melakukan for c in falih - alih memilikinya c=x[::-1]. Anda juga hanya menggunakan fsekali, jadi Anda tidak perlu menyimpannya sebagai variabel
Sp3000

6

JavaScript (ES7), 73 byte

Ini dapat dilakukan dalam ES7, hanya 73 byte:

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

Tidak Disatukan:

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.') : '';
};

Pemakaian:

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

Fungsi:

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

Saya menjalankan ini pada daftar kata UNIX dan telah memasukkan hasilnya ke dalam pasta bin:

Hasil

Kode yang digunakan untuk mendapatkan hasil di Firefox :

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

Apa yang terjadi t('Impossible')?
Arturo Torres Sánchez

@ ArturoTorresSánchez Anda benar, saya telah memperbaikinya
Downgoat

apakah bergabung dengan `` ES2015 atau apakah itu pra-ES2015?
WallyWest

@WallyWest Itu fitur ES6. Ini didukung di sebagian besar browser utama
Downgoat

Apa ES7 spesifik dalam hal ini?
Arjun

5

Python 2, 121 byte

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]

Diasumsikan bahwa file kamus w.txtberakhir dengan baris tambahan, dan tidak memiliki baris kosong.


3

GNU sed, 82

(termasuk 1 untuk -r)

Terima kasih kepada @TobySpeight untuk bantuan golfnya.

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

Masukan daftar kata diambil dari 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 byte

edit 2: sudahlah, ini secara teknis masih tidak valid, karena hanya menerima satu kata pada suatu waktu (bukan kamus). Saya akan mencoba memperbaikinya untuk memungkinkan lebih dari satu kata sebagai masukan ...

edit: oops; Saya awalnya membuatnya menunjukkan 0,0 di akhir jika angka terakhir adalah 0, bukan sebaliknya. Diperbaiki, meskipun ini merupakan solusi yang agak buruk (menampilkan "0." di samping angka jika dimulai dengan 0, jika tidak menampilkan dua spasi di tempat yang sama). Sisi baiknya, ia menangani kata-kata seperti "Otto" dengan benar (menampilkan 0s) karena tidak benar-benar menampilkan angka desimal!


Saya tidak bisa memikirkan bahasa yang lebih baik untuk melakukan ini. Jelas bisa bermain golf lagi, tapi saya terlalu lelah sekarang. Tilde adalah simbol negasi [itu( - ) tombol].

Input diambil dari variabel jawaban kalkulator, yang berarti apa pun yang terakhir dievaluasi (seperti _di shell python interaktif) sehingga Anda harus mengetikkan string pada homescreen (tanda kutip aktif ALPHA+), tekan ENTER, lalu jalankan program. Atau, Anda bisa menggunakan titik dua untuk memisahkan perintah, jadi jika Anda memberi nama program, katakan, "CALCTEXT" dan Anda ingin menjalankannya pada string "HELLO", Anda bisa mengetik "HELLO":prgmCALCTEXTalih-alih melakukannya secara terpisah.

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 byte

Saya melewatkan ini '0.' kebutuhan. Semoga sekarang berfungsi dengan baik.

sunting : Dihapus ".readlines ()" dan masih berfungsi; p

sunting2 : Menghapus beberapa spasi dan memindahkan cetakan ke baris ke-3

edit3 : Disimpan 2 byte berkat Sp3000 (menghapus ruang setelah dicetak dan mengubah 'indeks' menjadi 'cari')

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 byte

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 byte

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

Hitungan byte mencakup 2 untuk lnopsi pada baris perintah:

$ ruby -ln 5318008.rb wordlist.txt

Dalam hal ini ==""dapat diganti dengan <?A. Dan tidak perlu gsub()seperti itu sub()sudah cukup.
manatwork

1

C, 182 172 169/181 172 byte

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

Diperluas

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

menggunakan words.txt yang ditautkan, dengan konversi huruf kecil:

$ ./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
Tidak akan *s|32berfungsi sebagai konversi huruf kecil dalam konteks ini?
Hagen von Eitzen

Ide yang hebat! Terima kasih!
beberapa pengguna

1

Haskell, 175 byte tanpa impor (229 byte dengan impor)

Kode yang relevan (katakan dalam 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 byte

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

Diperluas

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

Itu selalu menambahkan desimal, dan ketika tidak valid mengembalikan ".". Tetapi sebaliknya berfungsi seperti seharusnya. : P

Terima kasih @ LegionMammal978!


You can save 7 bytes by changing ;String l= to ,l= and =o+ to +=.
LegionMammal978
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.