5318008 - розваги з калькуляторами


32

У школах по всьому світу діти вводять номер у свій РК-калькулятор, перевертають його догори дном і спалахують у сміх після створення слова "Бобі". Звичайно, це найпопулярніше слово, але є багато інших слів, які можна скласти.

Однак у всіх словах має бути менше 10 букв (словник містить слова, довші за це, тому потрібно виконати фільтр у вашій програмі). У цьому словнику є деякі великі слова, тому перетворіть усі слова в малі.

Використовуючи словник англійської мови, створіть список номерів, які можна ввести у РК-калькулятор і скласти слово. Як і у всіх питаннях з кодом про гольф, виграє найкоротша програма для виконання цього завдання.

Для моїх тестів я використав список слів UNIX, зібраний, набравши:

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

Або в якості альтернативи, отримайте його тут .

Наприклад, наведене вище зображення було створене шляхом введення числа 35007в калькулятор і перевертання його догори дном.

Букви та їх відповідні цифри:

  • б :8
  • г :6
  • l :7
  • я :1
  • о :0
  • s :5
  • z :2
  • год :4
  • е :3

Зауважте, що якщо число починається з нуля, після цього нуля потрібно десятковий знак. Число не повинно починатися з десяткової крапки.

Я думаю, що це код Мартіна Бюттнера, я просто хотів вам за це подякувати :)

/* 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
$ 

"Віра" і "Біліє" - це слова? Тим більше, що ти знаєш ...
клісмік

6

Пітон 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)коротше?
Денніс

3
d[b] == "oizehsglb".index(b). Можливо, не вистачає символу для рядка / символу.
Денніс

1
О, вау, мені ніколи не спадало на думку, що числа, які ми змогли замінити, мали порядкові числові значення .. Так, це обов'язково спрацює! Спасибі!
Кейд

1
Не перевірений, але: 1) .findкоротший, ніж .index2) Залежно від того, яку версію ви маєте, принаймні в 2.7.10 openбез аргументу режиму за замовчуванням r, 3) Чи не просто 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 Ви маєте рацію, я це виправив
Пуховик

є приєднанням`` ES2015 чи це до 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: неважливо, це технічно недійсне, оскільки воно приймає лише одне слово за один раз (не словник). Я спробую виправити це, щоб дозволити вводити більше одного слова ...

редагувати: ой; Я спочатку змусив його показати .0 наприкінці, якщо останнє число було 0, а не навпаки. Виправлено, хоча це якесь неправильне вирішення (відображається "0." поряд із номером, якщо воно починається з 0, в іншому випадку відображається два пробіли в тому самому місці). На світлому боці він правильно обробляє слова типу "Отто" (відображає обидва 0), оскільки насправді не відображає десяткового числа!


Я не можу придумати кращої мови, щоб це зробити. Однозначно можна більше пограти в гольф, але зараз я занадто втомився. Тильда є символом заперечення [the( - ) кнопка].

Введення взято із змінної відповіді калькулятора, тобто все, що було оцінено востаннє (наприклад, _в інтерактивній оболонці пітона), тому вам потрібно набрати рядок на головному екрані (лапка ввімкнена 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 ()", і воно все ще працює; стор

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

Рубін 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);
    }
}

використовуючи пов’язані слова.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 байт з імпортом)

Відповідний код (скажімо у файлі 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.