5318008 - Amusez-vous avec les calculatrices

32

Dans les écoles du monde entier, les enfants tapent un nombre dans leur calculatrice LCD, le retournent et éclatent de rire après avoir créé le mot «Boobies». Bien sûr, c'est le mot le plus populaire, mais il existe de nombreux autres mots qui peuvent être produits.

Cependant, tous les mots doivent contenir moins de 10 lettres (le dictionnaire contient cependant des mots longs, vous devez donc effectuer un filtre dans votre programme). Dans ce dictionnaire, il y a des mots en majuscules, donc convertissez tous les mots en minuscules.

À l'aide d'un dictionnaire de langue anglaise, créez une liste de chiffres qui peuvent être saisis dans une calculatrice LCD et faire un mot. Comme pour toutes les questions de code de golf, le programme le plus court pour terminer cette tâche gagne.

Pour mes tests, j'ai utilisé la liste de mots UNIX, recueillie en tapant:

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

Ou bien, obtenez-le ici .

Par exemple, l'image ci-dessus a été créée en tapant le nombre 35007dans la calculatrice et en le retournant.

Les lettres et leurs numéros respectifs:

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

Notez que si le nombre commence par un zéro, un point décimal est requis après ce zéro. Le nombre ne doit pas commencer par un point décimal.

Je pense que c'est le code de MartinBüttner, je voulais juste vous en remercier :)

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

Beta Decay
la source
4
Peut utiliser un point décimal après le premier nombre même s'il n'est pas requis?
Dennis
1
Faut-il taper 0.7734pour bonjour ou serait .7734acceptable?
Dennis
3
Quel est le comportement correct si le dictionnaire contient des mots en majuscules, des signes de ponctuation, etc.?
Peter Taylor
1
@Dennis 0.7734est requis
Beta Decay
4
Qu'en est-il des mots qui nécessitent un zéro après la décimale? Par exemple, oligonécessite un zéro de fin après la décimale:0.6170
M. Llama

Réponses:

7

CJam, 44 42 octets

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

Essayez-le en ligne dans l' interprète CJam .

Pour exécuter le programme à partir de la ligne de commande, téléchargez l' interpréteur Java et exécutez:

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

Comment ça marche

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.
Dennis
la source
9

Bash + coreutils, 54

Encore une fois, merci à @TobySpeight pour l'aide au golf.

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

La liste de mots d'entrée est tirée de STDIN:

$ ./5318008.sh < /usr/share/dict/words | head
8
38
338
5338
638
5638
36138
31738
531738
7738
$ 
Trauma numérique
la source
"Belie" et "Belies" sont des mots? Plus vous en savez ...
clismique
6

Python 2, 271 216 211 205 Octets

C'est la seule idée que j'ai eue jusqu'à présent .. Je mettrai à jour ceci une fois que je penserai à autre chose! J'ai supposé que nous devions lire un fichier, mais sinon, faites-le moi savoir pour que je puisse mettre à jour :)

Un grand merci à Dennis pour m'avoir sauvé 55 octets :)

Merci aussi à Sp3000 pour avoir économisé 6 octets :)

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
Kade
la source
Je ne connais pas beaucoup Python, mais quelque chose comme ça ne serait-il pas "oizehsglb".index(b)plus court?
Dennis
3
d[b] == "oizehsglb".index(b). Il manque peut-être un transtypage en chaîne / caractère.
Dennis
1
Oh, wow, il ne m'est jamais venu à l'esprit que les nombres que nous avons pu remplacer avaient des valeurs numériques dans l'ordre. Oui, cela fonctionnera certainement! Merci!
Kade
1
N'ont pas été testés mais: 1) .findest plus court que .index, 2) Selon la version que vous possédez, au moins en 2.7.10 opensans argument de mode par défaut r, 3) Ne fonctionne pas seulement for x in open(...)? (il peut être nécessaire de supprimer une nouvelle ligne de fin) Si ce n'est pas le cas, alors .split('\n')est plus court que.splitlines()
Sp3000
1
De plus g+=[['0.'+c[1:],c][c[0]!='0']]*c.isdigit(), et vous pouvez en économiser un peu plus en inversant fpuis en faisant for c in fau lieu d'avoir c=x[::-1]. De plus, vous ne l'utilisez fqu'une seule fois, vous n'avez donc pas besoin de l'enregistrer en tant que variable
Sp3000
6

JavaScript (ES7), 73 octets

Cela peut être fait dans ES7 avec seulement 73 octets:

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

Usage:

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

Une fonction:

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

J'ai exécuté cela sur la liste de mots UNIX et j'ai mis les résultats dans une corbeille à pâte:

Résultats

Le code utilisé pour obtenir les résultats sur Firefox :

document.querySelector('pre').innerHTML.split('\n').map(i => t(i.toLowerCase())).join('\n').replace(/^\s*[\r\n]/gm, '');
Downgoat
la source
Que se passe-t-il avec t('Impossible')?
Arturo Torres Sánchez
@ ArturoTorresSánchez Vous avez raison, j'ai corrigé cela
Downgoat
est join '' ES2015 ou est-ce pré-ES2015?
WallyWest
@WallyWest C'est une fonctionnalité ES6. Il est pris en charge dans la plupart des principaux navigateurs
Downgoat
Qu'est-ce que ES7 est spécifique à cela?
Arjun
5

Python 2, 121 octets

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]

Suppose que le fichier de dictionnaire w.txtse termine par un retour à la ligne de fin et n'a pas de lignes vides.

Sp3000
la source
3

GNU sed, 82

(dont 1 pour -r)

Merci à @TobySpeight pour l'aide au golf.

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

La liste de mots d'entrée est tirée de STDIN:

$ sed -rf 5318008.sed /usr/share/dict/words | tail
3705
53705
1705
0.705
50705
5705
505
2
0.02
5002
$ 
Trauma numérique
la source
2

TI-BASIC, 75 88 octets

edit 2: peu importe, c'est toujours techniquement invalide, car il n'accepte qu'un seul mot à la fois (pas un dictionnaire). Je vais essayer de le corriger pour autoriser plus d'un mot en entrée ...

modifier: oups; À l'origine, je l'ai fait afficher un .0 à la fin si le dernier nombre était 0, et non l'inverse. Corrigé, bien que ce soit une mauvaise solution de contournement (affiche "0" à côté du nombre s'il commence par 0, sinon affiche deux espaces au même endroit). Du bon côté, il gère correctement des mots comme "Otto" (affiche les deux 0) car il n'affiche pas réellement un nombre décimal!


Je ne peux pas penser à une meilleure langue pour le faire. Peut certainement être plus joué au golf, mais je suis trop fatigué en ce moment. Le tilde est le symbole de négation [le ( - )bouton].

L'entrée est tirée de la variable de réponse de la calculatrice, ce qui signifie ce qui a été évalué pour la dernière fois (comme _dans le shell python interactif), vous devez donc taper une chaîne sur l'écran d'accueil (le guillemet est activé ALPHA+), appuyez sur ENTER, puis exécutez le programme. Alternativement, vous pouvez utiliser deux points pour séparer les commandes, donc si vous nommez le programme, par exemple, "CALCTEXT" et que vous souhaitez l'exécuter sur la chaîne "HELLO", vous pouvez taper "HELLO":prgmCALCTEXTau lieu de les faire séparément.

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
MI Wright
la source
2

Python 2, 147 158 156 156 octets

Je manquais ce «0». exigence. J'espère que ça marche bien.

edit : Suppression de ".readlines ()" et cela fonctionne toujours; p

edit2 : Suppression de certains espaces et déplacement de l'impression vers la 3e ligne

edit3 : Sauvegardé 2 octets grâce à Sp3000 (espace supprimé après impression et changé 'index' en '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)
heo
la source
1

Python 2, 184 174 octets

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
diète
la source
1

Rubis 2, 88 86 octets

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

Le nombre d'octets comprend 2 pour les lnoptions de la ligne de commande:

$ ruby -ln 5318008.rb wordlist.txt
Daniero
la source
Dans ce cas, ==""peut être remplacé par <?A. Et pas besoin gsub()comme sub()ça suffit.
manatwork
1

C, 182 172 169 169/181 172 octets

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

Étendu

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

en utilisant les mots liés.txt, avec une conversion en minuscules:

$ ./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
un utilisateur
la source
1
Ne *s|32fonctionnera pas comme conversion minuscule dans ce contexte?
Hagen von Eitzen
Bonne idée! Merci!
un utilisateur
1

Haskell, 175 octets sans importations (229 octets avec importations)

Code pertinent (par exemple dans le fichier 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
saep
la source
0

Java, 208 200 176 octets

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

Étendu

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

Il ajoute toujours la décimale, et quand invalide retourne ".". Mais sinon, ça fonctionne comme il se doit. : P

Merci @ LegionMammal978!

Whitcomb L. Judson
la source
Vous pouvez enregistrer 7 octets en changeant ;String l=vers ,l=et =o+vers +=.
LegionMammal978