5318008 - Веселье с калькуляторами


32

В школах по всему миру дети вводят число в свой ЖК-калькулятор, переворачивают его вверх ногами и разражаются смехом после создания слова «Boobies». Конечно, это самое популярное слово, но есть много других слов, которые могут быть произведены.

Однако все слова должны быть длиной не более 10 букв (словарь содержит слова больше этой длины, поэтому вы должны выполнить фильтр в своей программе). В этом словаре есть несколько заглавных слов, поэтому преобразуйте все слова в строчные.

Используя словарь английского языка, создайте список цифр, которые можно будет ввести в ЖК-калькулятор и составить слово. Как и во всех других вопросах, связанных с гольфом, выигрывает самая короткая программа для выполнения этой задачи.

Для своих тестов я использовал список слов UNIX, набранный так:

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

Или, альтернативно, получите это здесь .

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

Буквы и их соответствующие цифры:

  • б :8
  • г :6
  • л :7
  • я :1
  • o :0
  • s :5
  • z :2
  • ч :4
  • е :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
Можно ли использовать десятичную точку после первого числа, даже если оно не требуется?
Деннис

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 байтов :)

Также спасибо 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короче .index, 2) в зависимости от того, какая у вас версия, по крайней мере в 2.7.10 openбез аргумента mode по умолчанию 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.')

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

Я запустил это в списке слов UNIX и поместил результаты в корзину:

Полученные результаты

Код, используемый для получения результатов в Firefox :

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

Что происходит с t('Impossible')?
Артуро Торрес Санчес

@ ArturoTorresSánchez Вы правы, я это исправил
Downgoat

такое join`` 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), поскольку на самом деле он не отображает десятичное число!


Я не могу придумать лучшего языка, чтобы сделать это. Можно определенно больше играть в гольф, но я слишком устал сейчас. Тильда - это символ отрицания [ ( - )кнопка].

Входные данные берутся из переменной ответа калькулятора, то есть того, что в последний раз оценивалось (например, _в интерактивной оболочке 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». требование. Надеюсь, теперь все работает хорошо.

edit : убрал ".readlines ()", и он все еще работает; p

edit2 : убрал несколько пробелов и переместил печать на 3-ю строку

edit3 : 2 байта были сохранены благодаря Sp3000 (убрал пробел после печати и изменил «index» на «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 байта

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

используя связанный файл 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 байт с импортом)

Соответствующий код (скажем, в файле 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);
}

Он всегда добавляет десятичную дробь, а когда неверный возвращает «.». Но в остальном работает как надо. :П

Спасибо @ LegionMammal978!


Вы можете сэкономить 7 байт, изменяя ;String l=в ,l=и =o+к +=.
LegionMammal978
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.