5318008 - สนุกกับเครื่องคิดเลข


32

ในโรงเรียนทั่วโลกเด็ก ๆ พิมพ์ตัวเลขลงในเครื่องคิดเลข LCD พลิกคว่ำและปะทุเป็นเสียงหัวเราะหลังจากสร้างคำว่า 'เต้า' แน่นอนว่านี่เป็นคำที่นิยมมากที่สุด แต่ก็มีอีกหลายคำที่สามารถสร้างได้

อย่างไรก็ตามคำทั้งหมดต้องมีความยาวน้อยกว่า 10 ตัวอักษร (พจนานุกรมมีคำที่ยาวกว่านี้อย่างไรก็ตามคุณต้องดำเนินการตัวกรองในโปรแกรมของคุณ) ในพจนานุกรมนี้มีคำที่เป็นตัวพิมพ์ใหญ่บางคำดังนั้นแปลงทุกคำเป็นตัวพิมพ์เล็ก

ใช้พจนานุกรมภาษาอังกฤษสร้างรายการตัวเลขที่สามารถพิมพ์ลงในเครื่องคิดเลข LCD และสร้างคำได้ เช่นเดียวกับคำถามทั้งหมดเกี่ยวกับกอล์ฟโปรแกรมที่สั้นที่สุดที่จะทำให้งานนี้สำเร็จลุล่วง

สำหรับการทดสอบของฉันฉันใช้รายการคำ UNIX ที่รวบรวมโดยการพิมพ์:

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

หรือมิฉะนั้นจะได้รับมันนี่

ตัวอย่างเช่นภาพด้านบนถูกสร้างขึ้นโดยการพิมพ์หมายเลข35007ลงในเครื่องคิดเลขและพลิกกลับด้าน

ตัวอักษรและตัวเลขที่เกี่ยวข้อง:

  • :8
  • g :6
  • l :7
  • ฉัน :1
  • o :0
  • s :5
  • z :2
  • ชม. :4
  • e :3

โปรดทราบว่าหากตัวเลขเริ่มต้นด้วยศูนย์จำเป็นต้องมีจุดทศนิยมหลังจากศูนย์นั้น จำนวนต้องไม่เริ่มต้นด้วยจุดทศนิยม

ฉันคิดว่านี่เป็นรหัสของ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
สามารถใช้ทศนิยมหลังจากตัวเลขแรกแม้ว่ามันไม่จำเป็น?
Dennis

1
เราต้องพิมพ์คำ0.7734ว่าhelloหรือจะ.7734ยอมรับได้ไหม?
Dennis

3
พฤติกรรมที่ถูกต้องคืออะไรหากพจนานุกรมมีคำที่มีตัวพิมพ์ใหญ่เครื่องหมายวรรคตอน ฯลฯ
ปีเตอร์เทย์เลอร์

1
@Dennis 0.7734ต้องการ
Beta Decay

4
สิ่งที่เกี่ยวกับคำที่ต้องการศูนย์ต่อท้ายหลังจากทศนิยม? ตัวอย่างเช่นoligoต้องการศูนย์ต่อท้ายหลังจุดทศนิยม:0.6170
นาย Llama

คำตอบ:


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 ไบต์ :)

ต้องขอบคุณ Sp3000 สำหรับการบันทึก 6 ไบต์ :)

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)สั้นกว่านี้ไหม
Dennis

3
d[b] == "oizehsglb".index(b). อาจจะไม่มีการร่ายให้กับสตริง / ตัวละคร
Dennis

1
โอ้ว้าวมันไม่เคยเกิดขึ้นกับฉันเลยว่าตัวเลขที่เราสามารถแทนที่ได้มีค่าตัวเลขตามลำดับ .. ใช่แล้วมันจะได้ผลแน่นอน! ขอบคุณ!
Kade

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

Ungolfed:

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

ฉันรันสิ่งนี้ใน wordlist ของ UNIX และใส่ผลลัพธ์ลงใน paste bin:

ผล

รหัสที่ใช้รับผลลัพธ์บน Firefox :

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

จะเกิดอะไรขึ้นกับt('Impossible')?
Arturo Torres Sánchez

@ ArturoTorresSánchezคุณถูกต้องฉันได้แก้ไขแล้ว
Downgoat

เข้าร่วม `` ES2015 หรือก่อน ES2015
WallyWest

@WallyWest นั่นคือคุณสมบัติ ES6 ได้รับการสนับสนุนในเบราว์เซอร์ที่สำคัญที่สุด
Downgoat

ES7 มีความเจาะจงในเรื่องนี้อย่างไร?
Arjun

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, 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:ไม่เป็นไรเทคนิคนี้ยังไม่ถูกต้องเนื่องจากยอมรับเพียงหนึ่งคำในแต่ละครั้งเท่านั้น (ไม่ใช่พจนานุกรม) ฉันจะพยายามแก้ไขเพื่อให้มีมากกว่าหนึ่งคำเป็นอินพุต ...

แก้ไข:โอ๊ะโอ; ฉันทำให้มันแสดงเป็น. 0 ท้ายที่สุดถ้าตัวเลขสุดท้ายเป็น 0 ไม่ใช่วิธีอื่น ๆ แก้ไขแม้ว่าจะเป็นวิธีแก้ปัญหาที่ไม่ดี (แสดง "0" ข้างหมายเลขถ้าเริ่มต้นด้วย 0 มิฉะนั้นจะแสดงช่องว่างสองช่องในตำแหน่งเดียวกัน) ในด้านสว่างมันจัดการคำอย่างถูกต้องเช่น "Otto" (แสดงทั้ง 0s) เนื่องจากมันไม่ได้แสดงเลขทศนิยม!


ฉันไม่สามารถนึกภาษาที่ดีกว่านี้ได้ฉันสามารถตีกอล์ฟได้มากกว่านี้ แต่ตอนนี้ฉันเหนื่อยเกินไปแล้ว เครื่องหมายตัวหนอนเป็นสัญลักษณ์การปฏิเสธ [ ( - )ปุ่ม]

การป้อนข้อมูลที่นำมาจากตัวแปรคำตอบเครื่องคิดเลขที่มีความหมายอะไรก็ตามที่ได้รับการประเมินที่ผ่านมา (เช่น_ในเชลล์หลามโต้ตอบ) เพื่อให้คุณต้องพิมพ์สตริงบนหน้าจอหลัก (ที่เครื่องหมายคำพูดอยู่บน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 bytes

ฉันพลาด '0' นี้ ความต้องการ หวังว่าตอนนี้มันใช้งานได้ดี

แก้ไข : ลบ ".readlines ()" แล้วและยังคงใช้ได้; p

edit2 : ลบช่องว่างและย้ายการพิมพ์ไปที่บรรทัดที่ 3

edit3 : บันทึก 2 ไบต์ด้วย Sp3000 (ลบพื้นที่หลังจากพิมพ์และเปลี่ยน 'ดัชนี' เป็น 'ค้นหา')

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

จำนวนไบต์รวม 2 สำหรับlnตัวเลือกในบรรทัดคำสั่ง:

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

ใช้ word.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ทำงานเป็นตัวแปลงเล็กในบริบทนี้หรือไม่
Hagen von Eitzen

ความคิดที่ดี! ขอบคุณ!
ผู้ใช้บางคน

1

Haskell, 175 ไบต์โดยไม่มีการนำเข้า (229 bytes กับการนำเข้า)

รหัสที่เกี่ยวข้อง (พูดในไฟล์ 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!


คุณสามารถบันทึก 7 ไบต์โดยการเปลี่ยน;String l=ไป,l=และจะ=o+ +=
LegionMammal978
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.