5318008 - Vui với máy tính


32

Trong các trường học trên khắp thế giới, trẻ em gõ một số vào máy tính LCD của chúng, lật ngược nó lại và cười thành tiếng sau khi tạo ra từ 'Boobie'. Tất nhiên, đây là từ phổ biến nhất, nhưng có nhiều từ khác có thể được tạo ra.

Tuy nhiên, tất cả các từ phải dài ít hơn 10 chữ cái (tuy nhiên từ điển chứa các từ dài hơn từ này, do đó bạn phải thực hiện bộ lọc trong chương trình của mình). Trong từ điển này, có một số từ viết hoa, vì vậy hãy chuyển đổi tất cả các từ viết thường.

Sử dụng từ điển tiếng Anh, tạo một danh sách các số có thể được nhập vào máy tính LCD và tạo từ. Như với tất cả các câu hỏi golf mã, chương trình ngắn nhất để hoàn thành nhiệm vụ này sẽ thắng.

Đối với các bài kiểm tra của mình, tôi đã sử dụng danh sách từ UNIX, được thu thập bằng cách gõ:

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

Hoặc cách khác, có được nó ở đây .

Ví dụ, hình ảnh trên được tạo bằng cách nhập số 35007vào máy tính và lật ngược nó lại.

Các chữ cái và số tương ứng của chúng:

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

Lưu ý rằng nếu số bắt đầu bằng 0, thì một dấu thập phân được yêu cầu sau số 0 đó. Số không được bắt đầu bằng dấu thập phân.

Tôi nghĩ rằng đây là mã của MartinBüttner, chỉ muốn ghi có cho bạn :)

/* 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
Có thể sử dụng dấu thập phân sau số đầu tiên ngay cả khi không bắt buộc không?
Dennis

1
Chúng ta phải gõ 0.7734cho xin chào hoặc sẽ .7734được chấp nhận?
Dennis

3
Hành vi đúng là gì nếu từ điển chứa các từ có chữ hoa, dấu câu, v.v.?
Peter Taylor

1
@Dennis 0.7734là bắt buộc
Beta Decay

4
Điều gì về các từ yêu cầu một số 0 sau dấu thập phân? Ví dụ: oligoyêu cầu một số 0 sau dấu thập phân:0.6170
Ông Llama

Câu trả lời:


7

CJam, 44 42 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Để chạy chương trình từ dòng lệnh, hãy tải xuống trình thông dịch Java và thực hiện:

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

Làm thế nào nó hoạt động

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

Một lần nữa, cảm ơn @TobySpeight đã giúp đỡ chơi golf.

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

Danh sách từ đầu vào được lấy từ STDIN:

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

"Belie" và "Belies" là từ nào? Bạn càng biết nhiều hơn ...
clismique

6

Python 2, 271 216 211 205 byte

Đây là ý tưởng duy nhất tôi có cho đến nay .. Tôi sẽ cập nhật điều này một khi tôi nghĩ về điều gì khác! Tôi giả sử chúng tôi cần đọc từ một tập tin, nhưng nếu không cho tôi biết để tôi có thể cập nhật :)

Cảm ơn Dennis vì đã tiết kiệm cho tôi 55 byte :)

Cũng cảm ơn Sp3000 vì đã tiết kiệm 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

Tôi không biết nhiều Python, nhưng sẽ không có gì "oizehsglb".index(b)ngắn hơn?
Dennis

3
d[b] == "oizehsglb".index(b). Có thể thiếu một diễn viên để chuỗi / nhân vật.
Dennis

1
Ồ, wow, tôi chưa bao giờ nghĩ rằng những con số chúng ta có thể thay thế có giá trị bằng số theo thứ tự .. Vâng, điều đó chắc chắn sẽ hoạt động! Cảm ơn!
Kade

1
Chưa được thử nghiệm nhưng: 1) .findngắn hơn .index, 2) Tùy thuộc vào phiên bản bạn có, ít nhất là trong 2.7.10 openmà không có đối số chế độ mặc định r, 3) Không chỉ for x in open(...)hoạt động? (có thể cần xóa một dòng mới theo dõi) Nếu không, thì .split('\n')ngắn hơn.splitlines()
Sp3000

1
Ngoài ra g+=[['0.'+c[1:],c][c[0]!='0']]*c.isdigit(), và bạn có thể tiết kiệm một vài chi tiết bằng cách đảo ngược fsau đó thực hiện for c in fthay vì có c=x[::-1]. Ngoài ra, bạn chỉ sử dụng fmột lần, vì vậy bạn không cần lưu nó dưới dạng một biến
Sp3000

6

JavaScript (ES7), 73 byte

Điều này có thể được thực hiện trong ES7 chỉ với 73 byte:

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

Ung dung:

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

Sử dụng:

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

Chức năng:

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

Tôi đã chạy nó trên danh sách từ UNIX và đã đặt kết quả vào một thùng dán:

Các kết quả

Mã được sử dụng để có được kết quả trên Firefox :

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

Chuyện gì xảy ra với t('Impossible')?
Arturo Torres Sánchez

@ ArturoTorresSánchez Bạn nói đúng, tôi đã sửa nó
Downgoat

tham gia ES`5 hay là trước ES2015?
WallyWest

@WallyWest Đó là một tính năng ES6. Nó được hỗ trợ trong hầu hết các trình duyệt chính
Downgoat 24/07/2015

ES7 cụ thể trong việc này là gì?
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]

Giả sử rằng tệp từ điển w.txtkết thúc bằng một dòng mới và không có dòng nào trống.


3

GNU sed, 82

(bao gồm 1 cho -r)

Cảm ơn @TobySpeight đã giúp đỡ chơi gôn.

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

Danh sách từ đầu vào được lấy từ 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

chỉnh sửa 2: đừng bận tâm, điều này vẫn không hợp lệ về mặt kỹ thuật, vì nó chỉ chấp nhận một từ tại một thời điểm (không phải từ điển). Tôi sẽ cố gắng sửa nó để cho phép nhiều hơn một từ làm đầu vào ...

chỉnh sửa: rất tiếc; Ban đầu tôi đã làm cho nó hiển thị 0 ở cuối nếu số cuối cùng là 0, không phải là cách khác. Đã sửa, mặc dù đây là một cách giải quyết không tốt (hiển thị "0." cùng với số nếu bắt đầu bằng 0, nếu không sẽ hiển thị hai khoảng trắng ở cùng một vị trí). Về mặt sáng sủa, nó xử lý chính xác các từ như "Otto" (hiển thị cả 0) vì nó không thực sự hiển thị số thập phân!


Tôi không thể nghĩ ra một ngôn ngữ tốt hơn để làm điều này. Chắc chắn có thể chơi gôn nhiều hơn, nhưng hiện tại tôi quá mệt mỏi. Dấu ngã là biểu tượng phủ định [ ( - )nút].

Đầu vào được lấy từ biến trả lời của máy tính, nghĩa là bất cứ thứ gì được đánh giá lần cuối (như _trong vỏ trăn tương tác), do đó bạn phải nhập một chuỗi trên màn hình chính (dấu ngoặc kép được bật ALPHA+), nhấn ENTER, sau đó chạy chương trình. Ngoài ra, bạn có thể sử dụng dấu hai chấm để phân tách các lệnh, vì vậy nếu bạn đặt tên chương trình, hãy nói "CALCTEXT" và bạn muốn chạy nó trên chuỗi "HELLO", bạn có thể nhập "HELLO":prgmCALCTEXTthay vì thực hiện chúng một cách riêng biệt.

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

Con trăn 2, 147 158 156 byte

Tôi đã bỏ lỡ '0.' yêu cầu. Hy vọng bây giờ nó hoạt động ổn.

chỉnh sửa : Đã xóa ".readlines ()" và nó vẫn hoạt động; p

chỉnh sửa2 : Đã xóa một số khoảng trắng và di chuyển in sang dòng thứ 3

chỉnh sửa 3 : Đã lưu 2 byte nhờ Sp3000 (đã xóa khoảng trống sau khi in và thay đổi 'index' thành 'find')

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

Số lượng byte bao gồm 2 cho các lntùy chọn trên dòng lệnh:

$ ruby -ln 5318008.rb wordlist.txt

Trong trường hợp này ==""có thể được thay thế bằng <?A. Và không cần gsub()như sub()là đủ.
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);}}

Mở rộng

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

sử dụng words.txt được liên kết, với chuyển đổi chữ thường:

$ ./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ẽ không *s|32hoạt động như chuyển đổi chữ thường trong bối cảnh này?
Hagen von Eitzen

Ý tưởng tuyệt vời! Cảm ơn!
một số người dùng

1

Haskell, 175 byte không nhập (229 byte với nhập)

Mã có liên quan (nói trong Tệp 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);}

Mở rộng

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

Nó luôn thêm số thập phân và khi trả về không hợp lệ ".". Nhưng nếu không hoạt động như nó nên. : P

Cảm ơn @ LegionMammal978!


Bạn có thể tiết kiệm 7 byte bằng cách thay đổi ;String l=để ,l==o+để +=.
LegionMammal978
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.